如何使用Delphi DBExpress收听Firebird事件

如何使用Delphi DBExpress收听Firebird事件,delphi,firebird,Delphi,Firebird,如何使用Delphi DBExpress收听Firebird事件 我知道Zeos/IBComponents有专门的组件,不幸的是我不能使用这些组件。更新我找到了一种方法,可以将事件监视添加到DBExpress应用程序中,这可能适用于您的情况,在这种情况下,为了避免使用DBExpress而重新编写应用程序是不切实际的。这是我到目前为止所做的,效果很好 我编写了一个最小的DBExpress应用程序,它打开并编辑一个Interbase表,并将更改保存回数据库表。对于这次尝试的想法,我认为数据库是Int

如何使用Delphi DBExpress收听Firebird事件


我知道Zeos/IBComponents有专门的组件,不幸的是我不能使用这些组件。

更新我找到了一种方法,可以将事件监视添加到DBExpress应用程序中,这可能适用于您的情况,在这种情况下,为了避免使用DBExpress而重新编写应用程序是不切实际的。这是我到目前为止所做的,效果很好

  • 我编写了一个最小的DBExpress应用程序,它打开并编辑一个Interbase表,并将更改保存回数据库表。对于这次尝试的想法,我认为数据库是Interbase数据库而不是Firebird数据库并不重要。让我们将此应用程序称为DBXApp

  • 然后,我使用Interbase组件(IBDatabase等)编写了等效的应用程序,并使用IBEvents组件包含事件支持,以将接收到的事件写入备忘录。我们称之为IBApp

  • 同时运行DBXApp和IBApp时,IBApp会看到DBXApp将更改保存到表中时引起的事件。所以,我想:

  • 现在,在IDE中的IDE中打开DBXApp,并将IBDatabase1、IBEvents1和Memo1复制到其中,将与IBApp中相同的代码添加到
    OnEventAlert
    处理程序中(这花费了90秒),重新编译并运行。现在,DBXApp中的备忘录可以看到IBApp发布的表更新。因此,IBApp可以看到DBXApp触发的事件,反之亦然

  • 现在,在我看来,如果您的Firebird db是Delphi Interbase组件可以连接的数据库,那么您应该能够修改您的Firebird应用程序以添加事件监视,就像我对DBXApp所做的那样。当然,这是一个很大的“如果”,但如果你的应用程序不是太新(听起来不太可能),那么也许IBDatabase可以连接到它的FB数据库

  • 步骤1-3只花了我几个小时(其中相当多的时间是我发现广告修复了一个愚蠢的配置错误),所以我认为值得你尝试一下。让我们知道你进展如何

    原始答案你没有说为什么你不能使用Zeos/IBComponents,但据我所知,DBExpress不处理Firebird的Post_事件,而且从谷歌搜索结果来看,很难找到,否则有人会这么做

    您可以看看Zeos,看看它是如何实现Post_事件支持的,然后在项目代码中执行类似的操作。据推测,这将是一个向Firebird注册回调并处理其发送内容的问题

    另一个值得一看的地方是这张(相当旧的)报纸。尽管Firebird已经从Interbase中分离出来,但我认为使用IB事件处理机制仍然有一个合理的前景


    顺便说一句,Delphi的最新版本附带了FireDAC db组件库,它支持来自后端RDMS(包括Firebird)的事件通知。正如您将看到的,Firebird的事件警报使用事件后机制。

    感谢您的快速回答。我不能使用,因为这是一个使用dbexpress的大型遗留项目。它有一个严格的数据库连接控制机制。所以我不能从同一个客户端打开另一个连接。我不是一个德尔福忍者,只是一个老家伙试图尽快完成事情。我希望答案不涉及数周的dbexpress/firebird挖掘。无论如何,谢谢。我不确定DBExpress不支持Firebird事件这一事实是否会阻止你的应用程序注册自己的回调,并可能以这种方式接收事件。下一次我有几个小时的空闲时间,我要试一试。请继续关注……作为测试,我之前已经完成了步骤1-4,但通过这一步,我打开了与db的2个连接。我不能那样做。(通过软件设计,就像你想象的那样,D2006应用程序并不“太新”)。我要用dbexpress线程/句柄来编写这个回调函数,我会尝试用一两天的时间来按照你给我的方向玩。谢谢Martyn我会接受你的回答,但我做不到。我不知道是缺乏忍者的能力,还是在delphi 2006中dbexpress的默默无闻。我将尝试使用简单的查询和计时器。我知道这很难看而且服务器密集,但我没有更多的时间。无论如何,谢谢你。