Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 拉扎勒斯,可以';无法使数据库更新工作。如何预览正在提交的内容?_Mysql_Sql_Delphi_Pascal_Lazarus - Fatal编程技术网

Mysql 拉扎勒斯,可以';无法使数据库更新工作。如何预览正在提交的内容?

Mysql 拉扎勒斯,可以';无法使数据库更新工作。如何预览正在提交的内容?,mysql,sql,delphi,pascal,lazarus,Mysql,Sql,Delphi,Pascal,Lazarus,您好,我有一个使用TMySQL51Connection、TSQLTransaction和TSQLQuery模块的表单设置,它从数据库中检索信息时没有问题,但我在更新方面遇到了问题 数据库相当大,所以我只从前几行开始,一旦它们开始工作,我将扩展查询 我的TSQLQuery.UpdateSQL如下 UPDATE table SET ContactFirst = :ContactFirst, ContactSur = :ContactSur WHERE AccountID = :AccountID

您好,我有一个使用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;
单击按钮对DB完全没有任何作用,它不会生成错误消息,只会更新sqlbl1上的标题。是否可以预览Lazarus发送给DB的内容以及包含的值,以便我追踪出了什么问题


我尝试向SQLConnection添加日志事件,但无法确定如何使其生成日志。

根据我的经验,
Edit
Post
applyUpdate
方法与
TClientDataSet
结合使用。在这种情况下,您只需将新值分配给CD中的字段(导航到要编辑的记录后),然后发布这些更改(无需Update SQL语句)。像这样的

MyCDS.Edit;
MyCDS.FieldByName('ContactFirst').Value := sContactFirstName;
MyCDS.FieldByName('ContactSur').Value := sContactSurname;
MyCDS.Post;
MyCDS.ApplyUpdates;
或者,您可以使用查询组件,将更新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;

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

根据我的经验,
Edit
Post
applyUpdate
方法与
TClientDataSet
一起使用。在这种情况下,您只需将新值分配给CD中的字段(导航到要编辑的记录后),然后发布这些更改(无需Update SQL语句)。像这样的

MyCDS.Edit;
MyCDS.FieldByName('ContactFirst').Value := sContactFirstName;
MyCDS.FieldByName('ContactSur').Value := sContactSurname;
MyCDS.Post;
MyCDS.ApplyUpdates;
或者,您可以使用查询组件,将更新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;

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

您知道如何在IDE中“单步执行”和“单步执行”代码吗?你的IDE支持手表吗?我知道在Delphi中,您可以一次一行地遍历代码,只需将鼠标悬停在变量上即可查看其当前值(即在调试模式下)。我认为,如果您希望我们定位特定预期功能的bug或不完整的编码,您需要发布更多代码。您是否为参数赋值(例如ParamByName('ContactFirst')。Value:=SomeVariant)?也许您需要在编辑和发布之间对TSQLQuery调用Update或Exec方法?您知道如何在IDE中“单步执行”和“单步执行”代码吗?你的IDE支持手表吗?我知道在Delphi中,您可以一次一行地遍历代码,只需将鼠标悬停在变量上即可查看其当前值(即在调试模式下)。我认为,如果您希望我们定位特定预期功能的bug或不完整的编码,您需要发布更多代码。您是否为参数赋值(例如ParamByName('ContactFirst')。Value:=SomeVariant)?也许你需要在编辑和发布之间调用TSQLQuery上的Update或Exec方法?这对我来说已经足够好了,我使用了第二个建议,效果非常好:未来的FPC版本将有TSqlStatement,这对我来说已经足够好了,我使用了第二个建议,工作完美:未来的FPC版本将有TSqlStatement,这是稍微更好地为这种东西优化。