Mysql 拉扎勒斯,可以';无法使数据库更新工作。如何预览正在提交的内容?
您好,我有一个使用TMySQL51Connection、TSQLTransaction和TSQLQuery模块的表单设置,它从数据库中检索信息时没有问题,但我在更新方面遇到了问题 数据库相当大,所以我只从前几行开始,一旦它们开始工作,我将扩展查询 我的TSQLQuery.UpdateSQL如下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
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,这是稍微更好地为这种东西优化。