Форум FAQ О команде
Поиск по сайту:
 
Sybase
Sybase ASA  
Sybase ASE  
Sybase IQ  
Sybase PowerDesigner  
Sybase PowerBuilder  
  Статьи  
  Полезный код  

Продукты
Наши продукты  
Продукты партнеров портала  

Сообщества
Alef community  

Меню
Регистрация  
Почта  

Вход

Рассылка
Рассылка 'РСУБД Sybase ASA 9 - мощность, легкость и надежность'
Почтовая рассылка
"Технологии обработки данных компании Sybase"


Статистика
Яндекс цитирования

Rambler's Top100
Находится в каталоге Апорт

Главная -> ПО Sybase -> Sybase PowerBuilder -> Полезный код
Asa, Message To Client, кто говорил что это невозможно? :)

Asa, Message To Client, кто говорил что это невозможно? :)

В ASA у нас есть процерудка типа:

create procedure test_msg()
begin
   declare mCount1 integer;
   declare mCount2 integer;

   select count(*) into mCount1 from table1;
   message 'first step done' type info to client;
   select count(*) into mCount2 from table2;
   message 'second step done' type info to client;

   select mCount1, mCount2;
end;

Спрашивается, как получить эти самые 'first step done' и 'second step done' в PB-клиенте?
А вот примерно так:
  1. Делаем внешнюю dll (на C).
    #include <windows.h>
    #include <stdio.h>
    #include <sql.h>
    #include <sqlext.h>
    #include <sqldef.h>
    #include <odbcinst.h>
    #include <asaodbc.h>
    
    static HANDLE hWindow;
    static DWORD iWM_Message;
    
    void SQL_CALLBACK my_msgproc(void *sqlca, unsigned char msg_type, long code,
       unsigned short len, char *msg) {
        msg[len]=0;
        SendMessage(hWindow, iWM_Message, (WPARAM)msg, (LPARAM)msg_type);
    }
    
    
    int RegisterCallback(HDBC hDbc, HANDLE lhWindow, DWORD liWM_Message, char *sErrorBuffer, int iBufferLength) {
        char sBuf[1024];
        RETCODE RetCode;
        SQLCHAR SqlState[6], SqlMessage[SQL_MAX_MESSAGE_LENGTH];
        SQLINTEGER SqlError;
        SQLSMALLINT MessageLen;
    
        hWindow = lhWindow;
        iWM_Message = liWM_Message;
    
        RetCode = SQLSetConnectAttr(hDbc, ASA_REGISTER_MESSAGE_CALLBACK,
                                    (SQLPOINTER) &my_msgproc, SQL_IS_POINTER );
        if( RetCode != SQL_SUCCESS ) {
            if(SQLGetDiagRec(SQL_HANDLE_DBC, hDbc, 1, SqlState, &SqlError,
                                SqlMessage, sizeof(SqlMessage), &MessageLen) != SQL_NO_DATA) {
                sprintf(sBuf, "SQLSetConnectAttr failed(%d): %s %d %s\n", RetCode, SqlState, SqlError, SqlMessage);
                strncpy(sErrorBuffer, sBuf, iBufferLength);
            }
            return -1;
        }
        return 0;
    }
    
    Экспортируем из нее RegisterCallback.

  2. В PB клиенте объявляем:
    public function integer RegisterCallback ( &
         UnsignedLong ConnectionHandle, &
         UnsignedLong WindowHandle, &
          UnsignedInteger WM_Message, &
          ref string Errors, &
          UnsignedInteger ErrorsLength) &
        library "message2client.dll" alias for "RegisterCallback"
    

  3. Включаем перехват сообщений:
    SQLCA.DBMS = "ODBC"
    SQLCA.AutoCommit = False
    SQLCA.DBParm = "...."
    CONNECT;
    string sErrors = space(255)
    if RegisterCallback(SQLCA.DBHandle(), Handle(wMain), WM_USER, sErrors, 255) = -1 then
        MessageBox("Error", sErrors, StopSign!)
        DISCONNECT;
        return
    end if
    
    Естественно в этот момент уже должно существовать окно wMain.

  4. А в окне wMain перхватываем событие pbm_custom01 (для WM_USER+1 надо будет перехватывать pbm_custom02 и так далее):
    string msg
    string msg_type
    
    msg = string(wparam, "address")
    choose case lparam
        case 0
            msg_type = "Info"
        case 1
            msg_type = "Warning"
        case 2
            msg_type = "Action"
        case 3
            msg_type = "Status"
    end choose
    sle_1.Text = "[" + msg_type + "] " + msg
    


Писалось на PB9, но должно по идее работать и на более ранних версиях. Ну естественно это только для ODBC.

И в общем вот DLL'ка (ZIP-архив, 27.7 килобайт) собраная VC 2003 и PBL для PB9 с одним окошком для тестов.


Дата публикации: Monday 15 May 2006 21:53:32
Материал прочитан: 16067 раз(а)
[ Назад ]



Продвижение сайтов
Биржа ссылок

Copyright©2005 phpMS. Все права защищены.
hosted on pets-tree