【问题标题】:Update a table timestamp field when the record changes记录更改时更新表时间戳字段
【发布时间】:2014-04-25 02:55:06
【问题描述】:

我使用绝对数据库作为我的数据库。由于绝对数据库不支持触发器,我必须编写自己的 UPDATE 触发器。我试过这种方式:

procedure TDataModule2.ABSQuery6AfterPost(DataSet: TDataSet);
begin
  ABSQuery4.Close;
  ABSQuery4.SQL.Clear;
  ABSQuery4.SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP';
  ABSQuery4.ExecSQL;
end;

但是这样我正在更新整个表格。如何仅更新已更改的记录(行)?

编辑:这就是我的工作方式

procedure TDataModule2.ABSQuery6AfterPost(DataSet: TDataSet);
begin
with ABSQuery4 do begin
ABSQuery4.Close;
ABSQuery4.SQL.Clear;
ABSQuery4.SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP WHERE    T_ID=:a1';
ABSQuery4.Params.ParamByName('a1').AsInteger := ABSQuery6.FieldByName('T_ID').AsInteger;
ABSQuery4.ExecSQL;
end;
end;

【问题讨论】:

    标签: delphi delphi-xe4 absolute-db


    【解决方案1】:

    这可以通过 TDataSet.BeforePost 事件非常直接地解决(也可以查看来自 docwiki 的 code sample

    procedure TDataModule2.ABSQuery6BeforePost(DataSet: TDataSet);
    begin
      DataSet['RECORDCHANGED'] := now;
    end;
    

    【讨论】:

    • +1,但是注意服务器和客户端的时间不同步的问题。事实上,服务器甚至可能位于不同的时区,在这种情况下,记录的时间将毫无意义。
    • @Sir Rufo - 数据集未处于插入模式。将其置于插入模式,然后调用 post 会使程序崩溃。
    • 你确定你有这个方法连接到BeforePost事件吗?文档很清楚,这将在发布数据之前调用,因此数据集必须处于插入或编辑状态。也许您在TABSQuery 中有一个错误
    【解决方案2】:

    您需要在查询中添加“where”子句。 SQL变成了

    update mytable
    set recordchanged = current_timestamp
    where id = id_of_last_changed_record
    

    最好通过参数传递最后更改记录的id,制作你的代码

    with ABSQuery4 do
     begin
      Close;
      SQL.Clear;
      SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP WHERE ID = :P1';
      sql.params[0].asinteger:= id_of_last_changed_record;
      ExecSQL;
     end;
    

    【讨论】:

    • 你肯定知道刚刚更新的记录的id。你是如何在不知道它的 id 的情况下更新它的?
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多