【问题标题】:Lazarus, can't get DB Update working. How can I preview whats being submitted?Lazarus,无法让数据库更新工作。如何预览提交的内容?
【发布时间】:2013-07-29 16:21:39
【问题描述】:

您好,我有一个使用 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 添加一个日志事件,但不知道如何让它生成日志。

【问题讨论】:

  • 您知道如何在 IDE 中“进入”和“跳过”代码吗?你的 IDE 支持 Watches 吗?我知道在 Delphi 中,您可以一次单步执行代码,只需将鼠标悬停在变量上即可查看其当前值(即在调试模式下)。如果您希望我们为特定预期功能找到错误或不完整的编码,我认为您需要发布更多代码。
  • 您是否为参数赋值(例如 ParamByName ('ContactFirst') .Value := SomeVariant)?也许您需要在 Edit 和 Post 之间调用 TSQLQuery 上的 Update 或 Exec 方法?

标签: mysql sql delphi pascal lazarus


【解决方案1】:

根据我的经验,EditPostApplyUpdates 方法与 TClientDataSet 结合使用。在这种情况下,您只需为 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;

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

【讨论】:

  • 这对我来说已经足够好了,我使用了第二个建议,效果很好:D
  • 未来的 FPC 版本将有 TSqlStatement,对这类东西进行了更好的优化。
猜你喜欢
  • 2018-08-23
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多