gpt4 book ai didi

mysql - 多个语句 Delphi TZquery (Zeos) 错误

转载 作者:可可西里 更新时间:2023-11-01 07:18:29 29 4
gpt4 key购买 nike

我正在尝试像这样进行多语句查询:

// without the second insert the query works fine.
// i need 2 querys to work because later, i'll do inserts on different kind of tables.
// that's why i need 2 querys, not a single query which insert 2 records.

with ZQuery1 do
begin
SQL.Clear;
SQL.Add('insert into client (name,age) values ('+QuotedStr('john')+','+QuotedStr('20')+');');
SQL.Add('insert into client (name,age) values ('+QuotedStr('doe')+','+QuotedStr('21')+');');
ExecSQL;
end;

我收到此错误消息:SQL 错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本对应的手册,了解在第 2 行的“插入客户端(名称,年龄)值('doe','21')'附近使用的正确语法;

我已经查看了手册,组件 TZQuery 和 TZUpdateSql(来自 zeos lib)提供了在内部执行多个语句的可能性。

编辑[已解决]

谢谢 GregD,经过几次测试,交易对我来说工作正常!这就是我在未来帮助他人的方式。

try
ZConnection.AutoCommit := True;
ZConnection.StartTransaction;

With ZQuery Do
begin
SQL.Clear;
SQL.Add('insert into clients (name,age) values ('+QuotedStr('john')+','+QuotedStr('20')+')');
ExecSQL;
SQL.Clear;
SQL.Add('insert into clients (name,age) values ('+QuotedStr('doe')+','+QuotedStr('21')+')');
ExecSQL;
end;

ZConnection.Commit;
except
ZConnection.Rollback
end;

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

AutoCommit 为 True 时,事务会在每次执行 SQL 语句后自动提交,但您可以明确地使用 StartTransaction 命令来阻止此自动提交,直到您显式调用 Commit。

AutoCommit 为 False 时,您不应调用 StartTransaction。然后事务自动启动,但不会在每次执行语句后自动提交。

过程 StartTransaction StartTransaction 过程在连接的数据库中启动一个新事务。它应该只在 AutoCommit 属性为 TRUE 时使用。每当您尝试在 AutoCommit 设置为 false 的情况下调用它时,都会引发 SInvalidOpInNonAutoCommit。此行为是预期的,因为 StartTransaction 应该用作转义到 AutoCommit 模式。当您调用 StartTransaction 时,AutoCommit 被“关闭”,然后,当您调用 Commit 或 Rollback 时,AutoCommit 再次“打开”。如果您将 AutoCommit 设置为 false,则会自动创建新事务,您可以选择关闭它们的方式(提交或回滚)。

过程提交 将当前语句提交到数据库。应该仅在非自动提交模式下使用(其中每个语句都是自动提交的,使此过程无用)或者当您处于自动提交模式并且想要完成由 StartTransaction 过程打开的事务时。提交完成当前事务(如果有)。如果您不想将您的陈述保存到数据库中,您应该使用回滚过程。

procedure Rollback 回滚当前事务中所有先前的语句。应该仅在非自动提交模式下使用(其中每个语句都是自动提交的,使此过程无用)或者当您处于自动提交模式并且想要完成由 StartTransaction 过程打开的事务时。回滚完成当前事务(如果有)。如果您不想丢失您的声明,您应该使用 Commit 过程。

最佳答案

我不知道 Zeos 和多语句,但这不是这里的真正问题。您的查询(SQL 注入(inject))和执行它们的缓慢方法(无法缓存和重用的连接字符串)造成了重大安全问题。

如果你正确地停止使用字符串连接来形成你的查询,而是使用参数化语句,你根本不需要担心多个语句:

with ZQuery1 do
begin
SQL.Clear;
SQL.Add('insert into client (name,age)');
SQL.Add('values (:Name, :Age);'
ParamByName('Name').AsString := 'John';
ParamByName('Age').AsInteger := 20;
ExecSQL;
ParamByName('Name').AsString := 'Doe';
ParamByName('Age').AsInteger :- 21;
ExecSQL;
end;

查询现在将运行得更快(因为 DBMS 可以编译一次并多次重用(我提到的“缓存”)),您不再有 SQL 注入(inject)风险,并且不再有多个语句需要。

关于mysql - 多个语句 Delphi TZquery (Zeos) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16759373/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com