powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Послат сообшение из udf
8 сообщений из 8, страница 1 из 1
Послат сообшение из udf
    #32656635
Кирил К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здравствуйте!
Помогите разобраться в следующей проблемке:

Я хочу из 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?



Кирил
Болгарии.
...
Рейтинг: 0 / 0
Послат сообшение из udf
    #32656723
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно есть. Вот примерчик на Dephi:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
unit UDFLib;

interface
uses SysUtils, Classes, Windows;

implementation

function SendMessage(Msg: PChar):LongInt; cdecl; export;
begin
  MessageBeep(MB_ICONHAND);
  Result :=  0 ;
end;

exports
  SendMessage;

end.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Послат сообшение из udf
    #32656738
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял чего ты хочешь, Udf тут не нужен. Тебе подойдет POST_EVENT.
...
Рейтинг: 0 / 0
Послат сообшение из udf
    #32656779
Кирил К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да знаю. Я прислал примернь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;
...
Рейтинг: 0 / 0
Послат сообшение из udf
    #32656794
Кирил К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я ета написал на 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;
...
Рейтинг: 0 / 0
Послат сообшение из udf
    #32657008
Кирил К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dnico я не панимаю. Что делаю с SendMessage!!!
...
Рейтинг: 0 / 0
Послат сообшение из udf
    #32657035
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кирил КDnico я не панимаю. Что делаю с SendMessage!!!После компиляции получишь DLL.
Зарегистрируй её в базе:
Код: plaintext
1.
2.
3.
DECLARE EXTERNAL FUNCTION SendMessage
    CSTRING( 32767 )
RETURNS INTEGER BY VALUE
ENTRY_POINT 'SendMessage' MODULE_NAME 'UDFLib'
;
...
Рейтинг: 0 / 0
Послат сообшение из udf
    #32657099
Кирил К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий .

Мне SendMessage не нужна(по моему).

Я хочу из udf послат сообшение, каторьiе сервер Interbase/FireBird будет отслать на клиенте(смотри верх). Или по точние от udf я хочу указат IB/FireBird что произлашла неудач в мой udf и послат сообшение ошибки на клиенте.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Послат сообшение из udf
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]