|
|
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте! Помогите разобраться в следующей проблемке: Я хочу из udf послат сообшение, каторие сервер Interbase/FireBird бъдет отслать на клиенте. Например мой udf: unction ExprCheck(Expr, Groups: PChar): Integer; cdecl; begin Result = 0; if StrPas(Expr) = '' then PrintMessage('My message'); //например. Где PrintMessage е примерна API функция. Result := 1; end; На клиенте я вызвать запрос: SELECT ExprCheck('', '') FROM MyTable и хочу получите сообшение: "My Message" В MSSQL Server я използваю в xp(extended stored procedure) srv_sendmsg(SrvProc, SRV_MSG_ERROR, MsgNum, 0, 0, nil, 0, 0, PDBCHAR(Msg), SRV_NULLTERM); srv_senddone(SrvProc, SRV_DONE_ERROR or SRV_DONE_MORE, 0, 0); Мой вопрос: У меня есть такая возможност в Interbase/FireBird? Кирил Болгарии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 13:11:01 |
|
||
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Конечно есть. Вот примерчик на Dephi: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 13:37:52 |
|
||
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял чего ты хочешь, Udf тут не нужен. Тебе подойдет POST_EVENT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 13:40:31 |
|
||
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Да знаю. Я прислал примерньi udf. Вот реалньi: function ExprCheck(Expr, Groups: PChar): Integer; cdecl; var ExprParser: THandle; begin Result := EXPR_FAIL; ExprParser := GetDbNativeExprParser(nil, Expr, Groups); if ExprParser = 0 then begin //PrintMessage(SrvProc, CMDEXPR_PARSE_ERROR, GetExprLastError); Exit; end; try if SetExprWordList(ExprParser, GetExprWordList) = EXPR_FAIL then begin //PrintMessage(GetExprLastError); Exit; end; if CheckExprParser(ExprParser) = EXPR_FAIL then begin //PrintMessage(GetExprLastError); Exit; end; finally if FreeDbNativeExprParser(ExprParser) = EXPR_FAIL then begin //PrintMessage(GetExprLastError); end end; Result := EXPR_SUCCESS; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 13:52:58 |
|
||
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Я ета написал на MSSQL Server - xp(extended stored procedure): { Copy xp_parser.dll in WinNT directory (or a directory accessible by SQL Server executable). Then registers xp_exprcheck to MSSQL Server run following SQL script using iSQL: USE master EXEC sp_addextendedproc xp_exprcheck, 'xp_parser.dll' GO Then drop xp_exprcheck run following SQL script using iSQL: USE master EXEC sp_dropextendedproc xp_exprcheck Then unloads the xp_parser.dll from memory run following SQL script using iSQL: DBCC xp_parser (FREE) Syntax: xp_exprcheck Expression, Groups Където: * Expression - математическия израз който ще се проверява. Тип на параме- търа - CHAR, NCHAR, NTEXT, NVARCHAR, TEXT или VARCHAR; * Groups - групите чиито МТ могат да участват в израза. Тип на параметъра - CHAR, NCHAR, NTEXT, NVARCHAR,TEXT или VARCHAR. Когато предадете на то- зи параметър празен низ, тогава МТ от всички групи могат да участват в израза. Когато се изброяват няколко групи трябва да ползвате символа <;> за разделител между тях; Test: DECLARE @RetValue INTEGER EXEC @RetValue = master.dbo.xp_exprcheck '1 + 2/3 + 3.45', '1;2' PRINT(@RetValue) } function xp_exprcheck(SrvProc: PSRV_PROC): SRVRETCODE; stdcall; var ParamCount: Integer; ParamIsNull: BOOL; ParamMaxLen, ParamActualLen: Cardinal; ParamType: Byte; ParamData, ParamValue: Pointer; ExprParser: THandle; begin Result := XP_ERROR; { Получаване броя на параметрите указани при извикването на процедурата. } ParamCount := srv_rpcparams(SrvProc); { Проверка за броя на предадените параметри на xp_exprexprcheck. } if ParamCount <> 2 then begin PrintMessage(SrvProc, CMDSHELL_ERROR, PChar('Error executing extended stored procedure. Invalid number of parameters')); Exit; end; { Първия параметър. } srv_paraminfo(SrvProc, 1, ParamType, ParamMaxLen, ParamActualLen, nil, ParamIsNull); if ParamIsNull then begin PrintMessage(SrvProc, CMDSHELL_ERROR, PChar('Parametar is null. Param #1')); Exit; end; if not IsString(ParamType) then begin PrintMessage(SrvProc, CMDSHELL_ERROR, PChar('Invalid parametar type. Param #1.')); Exit; end; { Получаване на МИ от първия параметър. } ParamData := srv_alloc(ParamActualLen + 1); if ParamData = nil then begin PrintMessage(SrvProc, CMDEXPR_PARSE_ERROR, PChar('Out of memory')); Exit; end; try srv_bzero(ParamData, ParamActualLen + 1); srv_paraminfo(SrvProc, 1, ParamType, ParamMaxLen, ParamActualLen, ParamData, ParamIsNull); { Получаване на групите чиито МТ могат да участват в израза. } srv_paraminfo(SrvProc, 2, ParamType, ParamMaxLen, ParamActualLen, nil, ParamIsNull); if not IsString(ParamType) then begin PrintMessage(SrvProc, CMDSHELL_ERROR, PChar('Invalid parametar type. Param #2.')); Exit; end; ParamValue := srv_alloc(ParamActualLen + 1); if ParamValue = nil then begin PrintMessage(SrvProc, CMDEXPR_PARSE_ERROR, PChar('Out of memory')); Exit; end; try srv_bzero(ParamValue, ParamActualLen + 1); srv_paraminfo(SrvProc, 2, ParamType, ParamMaxLen, ParamActualLen, ParamValue, ParamIsNull); ExprParser := GetDbNativeExprParser(nil, ParamData, ParamValue); if ExprParser = 0 then begin PrintMessage(SrvProc, CMDEXPR_PARSE_ERROR, GetExprLastError); Exit; end; try if SetExprWordList(ExprParser, GetExprWordList) = EXPR_FAIL then begin PrintMessage(SrvProc, CMDEXPR_PARSE_ERROR, GetExprLastError); Exit; end; if CheckExprParser(ExprParser) = EXPR_FAIL then begin PrintMessage(SrvProc, CMDEXPR_PARSE_ERROR, GetExprLastError); Exit; end; finally if FreeDbNativeExprParser(ExprParser) = EXPR_FAIL then begin PrintMessage(SrvProc, CMDEXPR_PARSE_ERROR, GetExprLastError); ParamIsNull := True; end else ParamIsNull := False; end; { Възникнала ли е грешка при освобождаването на обекта сочен от ExprPar- ser(FreeMSSQLExprParser(ExprParser)). } if ParamIsNull then Exit; finally srv_free(ParamValue); end; finally srv_free(ParamData); end; srv_senddone(SrvProc, SRV_DONE_MORE, 0, 0); Result := XP_NOERROR; end; Где: procedure PrintMessage(SrvProc: PSRV_PROC; MsgNum: DBINT; Msg: PChar); begin srv_sendmsg(SrvProc, SRV_MSG_ERROR, MsgNum, 0, 0, nil, 0, 0, PDBCHAR(Msg), SRV_NULLTERM); srv_senddone(SrvProc, SRV_DONE_ERROR or SRV_DONE_MORE, 0, 0); end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 13:57:47 |
|
||
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Dnico я не панимаю. Что делаю с SendMessage!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 14:56:59 |
|
||
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Кирил КDnico я не панимаю. Что делаю с SendMessage!!!После компиляции получишь DLL. Зарегистрируй её в базе: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 15:05:04 |
|
||
|
Послат сообшение из udf
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий . Мне SendMessage не нужна(по моему). Я хочу из udf послат сообшение, каторьiе сервер Interbase/FireBird будет отслать на клиенте(смотри верх). Или по точние от udf я хочу указат IB/FireBird что произлашла неудач в мой udf и послат сообшение ошибки на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 15:20:26 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32656635&tid=1578048]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
212ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 528ms |

| 0 / 0 |
