|
Sybase
|
|
|
|
|
Продукты
|
|
|
|
|
Сообщества
|
|
|
|
|
Меню
|
|
|
|
|
Вход
|
|
|
|
|
Рассылка
|
|
|
|
|
Статистика
|
|
|
|
|
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-клиенте?
А вот примерно так:
- Делаем внешнюю 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.
- В PB клиенте объявляем:
public function integer RegisterCallback ( &
UnsignedLong ConnectionHandle, &
UnsignedLong WindowHandle, &
UnsignedInteger WM_Message, &
ref string Errors, &
UnsignedInteger ErrorsLength) &
library "message2client.dll" alias for "RegisterCallback"
- Включаем перехват сообщений:
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.
- А в окне 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 Материал прочитан: 16078 раз(а) [ Назад ] |
|
|
|
|
|
|
Copyright©2005 . Все права защищены.
|