PostgreSQL:通过ZeosLib / Lazarus从客户端连接捕获RAISE NOTICE

我开发了一个使用PostgreSQL 8.4 RDBMS的客户端应用程序.

我的应用程序是用Lazarus和ZeosLib 7.2编写的,用于数据库访问.

我使用了很多存储过程,并且在特定点上我使用raise raise来获取过程状态的信息,Es:

RAISE NOTICE 'Step 1: Import Items from CSV file';
....
....
RAISE NOTICE 'Step 2: Check Items data';

当我在PgAdmin3中执行程序时,它会在“消息”选项卡中显示通知.
有一种方法可以在我的客户端应用程序中捕获引发的通知吗?

最佳答案 好的,虽然我对这个话题也感兴趣,但是在快速调查之后这里有一些工作示例:

uses
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    ZConnection, ZDbcPostgreSql;

type

    { TForm1 }

    TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        pgConn: TZConnection;
        procedure Button1Click(Sender: TObject);
        procedure pgConnAfterConnect(Sender: TObject);
    private
        { private declarations }
    public
        { public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

procedure PGNotifyProcessor(arg: Pointer; message: PAnsiChar); cdecl;
begin
    Form1.Memo1.Lines.Add(message);
end;

{ TForm1 }

procedure TForm1.pgConnAfterConnect(Sender: TObject);
var
    pg: IZPostgreSQLConnection;
    args: Pointer;
begin
    pg := pgConn.DbcConnection as IZPostgreSQLConnection;
    pg.GetPlainDriver.SetNoticeProcessor(pg.GetConnectionHandle, @PGNotifyProcessor, args);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    pgConn.ExecuteDirect('select foo(''bar'')');
end;

end. 

这个对我有用.

我想这个例子不准确并且包含一些问题.例如,在从外部源调用的过程中使用LCL调用.但我希望它足以开始.

测试环境是:FPC 2.6.4,Lazarus 1.5,Postgres 9.3,Linux Mint

点赞