【问题标题】:commit on MySql + Zeos lib在 MySql + Zeos lib 上提交
【发布时间】:2013-03-15 09:12:20
【问题描述】:

我使用下一个代码在非自动通信连接上发布一些记录:

ZConnection1.AutoCommit := False;

  try
    ZTable1.Insert;
    ZTable1.FieldByName('name').AsString := 'John Doe';
    ZTable1.Post;
    ZConnection1.Commit;
  except
    ZConnection1.Rollback;
  end;

当我运行此代码时,我的数据库中没有保存任何内容。

在我尝试下一个代码之后...

ZConnection1.AutoCommit := False;

   with ZQuery1 do begin
      SQL.Text := 'INSERT INTO mytable (name) values ("John Doe")';
      ExecSQL;
      SQL.Text := SQL.Text + 'COMMIT' ;
      try
        ExecSQL;
      except
        SQL.Text := 'ROLLBACK';
        ExecSQL;
      end;
    end;

... 一切都很完美。

我在第一种情况下做错了什么?我使用 Delphi6、MySql、Zeos 库和 InnoDB 表。

【问题讨论】:

  • 在调用您显示的代码之前,您是否真正激活/打开了表格?
  • 是的,都打开了。我相信如果不活动的表 Delphi 将其报告为错误。我没有收到任何错误消息。
  • 是的,但是您在尝试中插入了插入内容,但没有提及确切的错误消息...

标签: mysql sql delphi zeos


【解决方案1】:

已经解决了我的问题:

这就是 AutoCommit 属性在 Zeos 中的实际工作方式:

  • AutoCommit 为True 时,事务会在每条SQL 语句执行后自动提交,但您可以显式使用StartTransaction 命令来阻止这种自动提交,直到您显式调用Commit
  • AutoCommit 为False 时,不应调用StartTransaction。然后事务会自动启动,但不会在每条语句执行完毕后自动提交。

ZConnection1.AutoCommit := True;
ZConnection1.StartTransaction;
try
  ZTable1.Insert;
  ZTable1.FieldByName('name').AsString := 'John Doe';
  ZTable1.Post;
  ZConnection1.Commit;
except
  ZConnection1.Rollback;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2010-12-08
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多