2

嗨,我有一个使用 TMySQL51Connection、TSQLTransaction 和 TSQLQuery 模块的表单设置,它可以毫无问题地从数据库中检索信息,但我在更新时遇到了问题。

数据库非常大,所以我只从第一行开始,一旦它们工作,我将扩展查询。

我的 TSQLQuery.UpdateSQL 如下

UPDATE table SET
ContactFirst = :ContactFirst,
ContactSur = :ContactSur
WHERE AccountID = :AccountID

然后我的表单中有一个按钮,onCLick 事件包含:

begin
    accSelect.Edit;
    accSelect.Post;
    accSelect.ApplyUpdates;
    dbTransaction.CommitRetaining;
    sqlbl1.Caption := accSelect.UpdateSQL;
end;

单击按钮对数据库没有任何作用,它不会生成错误消息,只是更新 sqlbl1 上的标题。有没有办法预览 Lazarus 发送到数据库的内容,其中包含值,以便我可以追踪出了什么问题?

我尝试向 SQLConnection 添加一个日志事件,但不知道如何让它生成日志。

4

1 回答 1

4

根据我的经验,EditPost方法ApplyUpdatesTClientDataSet. 在这种情况下,您只需为 CDS 中的字段分配新值(导航到要编辑的记录之后),然后发布这些更改(不需要更新 SQL 语句)。像这样的东西...

MyCDS.Edit;
MyCDS.FieldByName('ContactFirst').Value := sContactFirstName;
MyCDS.FieldByName('ContactSur').Value := sContactSurname;
MyCDS.Post;
MyCDS.ApplyUpdates;

或者,您可以使用 Query 组件,将 UPDATE SQL 写入 SQL 属性,然后使用ExecSQL或为该组件实现的任何方法(有许多数据库访问组件,每个组件都有自己的特性)

这是我脑海中的一些代码。请原谅,但我不熟悉 Lazarus 的细节——它基本上是 Delphi 代码。

MySQLQuery.SQL.Clear;
MySQLQuery.SQL := 'UPDATE MyTable 
                   SET    ContactFirst = :ContactFirst,
                          ContactSur = :ContactSur
                   WHERE AccountID = :AccountID';
MySQLQuery.Params.ParamByName('ContactFirst').Value := sContactFirstName;
MySQLQuery.Params.ParamByName('ContactSur').Value := sContactSurname;
MySQLQuery.Params.ParamByName('AccountID').Value := iAccountID;
try
  MySQLQuery.ExecSQL;
  ShowMessage('Update succeeded');
except on e: Exception do
  ShowMessage(e.Message);
end;

因此,您可能最终使用了这两种方法的一半,但都没有完全使用。

于 2013-07-29T17:09:11.683 回答