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

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

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

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

Вход

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


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

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

Главная -> Полезный код
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
Материал прочитан: 15310 раз(а)
[ Назад ]



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

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