gpt4 book ai didi

delphi - 从 Delphi 应用程序识别 Interbase 表中更改的行

转载 作者:行者123 更新时间:2023-12-03 18:35:28 27 4
gpt4 key购买 nike

我知道我可以在应用程序中使用 TIBEvents 对象来接收发布的事件
通过使用 POST_EVENT 的 Interbase 服务器。

通过在 IB 数据库上设置触发器,我可以使用这种机制来获取通知
行被更新、插入或删除,但不涉及哪些行。阻止这识别行的原因是事件名称需要
由 IBEvents 对象提前知道。尽管有 IBEvents 对象(或者更有可能是 POST_EVENT 机制)的这种限制,是否有一种简单的方法来进行这种识别?

最佳答案

巧合的是,我最近一直在研究这个话题,今天我偶然发现
一个原生的 Interbase 解决方案,使用一个相对较新的特性,称为 Change Views (见斯蒂芬
Ball 的博客简介:https://delphiaball.co.uk/2015/02/06/interbase-change-views-part-1/ .

本质上,这涉及在服务器上设置一个“订阅”,它定义了哪些表
和感兴趣的操作类型(更新插入和删除),授予用户订阅的权利
订阅,然后设置客户端应用程序以利用该信息
从订阅。
Change Views 的优点是它们可以与传统的 IBX 一起使用
只有几行代码的组件 - 请参见下面的示例。我没试过,但是看不到
只要它们支持,它们就不能与 DBExpress 或 FireDAC 一起使用的原因
将事务类型设置为“快照”。

几个皱纹:

  • 除非您回滚检索更改的事务(根据代码
    下面),下次查看订阅时,您将看不到您看到的更改
    上次。如果您希望下次仅查看后续更改,请在 Select 查询上调用 Commit 而不是 Rollback。
  • 订阅实现隐藏了对您的表下所做的更改
    自己的登录ID,所以设置和测试,你需要使用不同的登录,一个
    进行更改,另一个查看它们。

  • 代码:
    procedure TForm1.OpenQuery;
    var
    Sql : String;
    begin
    // Note that it is VITAL for the SELECT to return the desired results
    // that the transaction type is set to "Snapshot", which can be done in the IDE
    // using the Transaction Editor or in code as follows

    IBTransaction1.Params.Clear;
    IBTransaction1.Params.Add('concurrency');
    IBTransaction1.Params.Add('nowait');

    // Next, activate the subscription
    Sql := 'SET SUBSCRIPTION "TABLE1CHANGES" ACTIVE;';
    IBQuery1.SQL.Text := Sql;
    IBQuery1.ExecSQL;

    // Now we can retrieve the changed rows. Note the "where" clause
    Sql := 'SELECT id, aname, avalue FROM table1 where aname is changed'; // or "is updated",
    // inserted, or deleted
    IBQuery1.SQL.Text := Sql;
    IBQuery1.Open;

    end;

    与 Delphi 应用程序中的任何应用程序中的动态 Sql 一样,请注意 SQL 注入(inject)。

    更新:显然,Interbase Express (IBX) 组件库已更新为支持订阅,我假设在西雅图(我有但不使用)。

    关于delphi - 从 Delphi 应用程序识别 Interbase 表中更改的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35244744/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com