【问题标题】:How to make an event after insert on Firedac Sqlite database connection?在 Firedac Sqlite 数据库连接上插入后如何进行事件?
【发布时间】:2019-08-02 12:59:14
【问题描述】:

我想在我的数据库连接上挂上一个钩子。每次数据库中的任何表有更新时,我都想在我的代码中使用一个函数(如果可能的话,最好使用已执行查询的参数)。

我正在使用 FireDac 组件; TFDConnection、TFDPhysSQLiteDriverLink、TFDQuery 和 TFDEventAlerter。

初始化代码:

  FDEventAlerter1.Names.Clear;
  FDEventAlerter1.Names.Add('intEv');
  FDEventAlerter1.Options.Synchronize := true;
  FDEventAlerter1.Options.Kind := 'Events';
  FDEventAlerter1.OnAlert := FDEventAlerter1Alert;
  FDEventAlerter1.Active := true;

OnAlert 中的代码

procedure TDataModule1.FDEventAlerter1Alert(ASender: TFDCustomEventAlerter;
  const AEventName: string; const AArgument: Variant);
begin
  ShowMessage('test');
end;

来自 CreateTable 查询的代码:

CREATE TABLE IF NOT EXISTS int(
   ValuesInt INTEGER NOT NULL,
   ValuesIntTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

DROP TRIGGER IF EXISTS intEv;
CREATE TRIGGER IF NOT EXISTS intEv 
AFTER INSERT ON int
BEGIN
  SELECT POST_EVENT('trigger');
END;

每 10 秒执行一次的插入查询代码:

INSERT INTO int(valuesint) VALUES (:int);

当我运行它时,数据库被整数填充,但没有触发任何事件。

【问题讨论】:

标签: sqlite delphi firemonkey firedac


【解决方案1】:

TSQLiteDatabase.onUpdate(第 9.1 章)给了我我需要的东西。

sqlDb: TSQLiteDatabase;

sqlDb := TSQLiteDatabase(FDConnection1.CliObj);
sqlDb.OnUpdate := DoUpdate;

procedure TDataModule1.DoUpdate(ADB: TSQLiteDatabase; AOper: Integer; const ADatabase, ATable: String; ARowid: int64);
begin
  //http://www.sqlite.org/c3ref/c_alter_table.html
  if AOper = {SQLITE_INSERT}18 then
    sleep(1);
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多