【问题标题】:Delphi TAdoQuery - Multiple Inserts?Delphi TAdoQuery - 多个插入?
【发布时间】:2010-10-16 04:44:14
【问题描述】:

Delphi TAdoQuery 是否可以一次执行多个插入,还是必须分别执行每个语句?我想做的是这样的:

AdoQuery.SQL.Clear;
AdoQuery.SQL.Add('INSERT INTO user VALUES (1, "User 1");');
AdoQuery.SQL.Add('INSERT INTO user VALUES (2, "User 2");');
AdoQuery.SQL.Add('INSERT INTO user VALUES (3, "User 3");');
AdoQuery.ExecSQL;   
AdoQuery.Close;

这可能吗?执行此操作时,我从 MySQL 收到错误消息。我也尝试添加 BEGIN;和结束;围绕查询,但这也不起作用。

编辑:我想这样做是因为当我在 for 循环中执行插入时,看起来 > 10 个查询需要很长时间。我假设像上面一样添加它们会加快速度。有谁知道插入之间是否需要 AdoQuery.Close 调用?

【问题讨论】:

  • 不是 Close 调用,而是插入之间需要 ExecSQL 调用。如果您想要更多“类似脚本”的能力,请改为查看 TAdoCommand。它可能更适合您想要做的事情。否则下面的答案在查询中使用参数并使用不同的参数值重复执行它是要走的路。

标签: delphi


【解决方案1】:

尝试这样的事情(使用 AdoCommand):

sSql := 'INSERT INTO User (FieldName1, FieldName2) values (:Nr, :Strng)';
AdoCmd.Parameters.Clear();     
AdoCmd.CommandText := sSql;
AdoCmd.CommandType := cmdText;
AdoCmd.Parameters.ParseSQL( sSql, True );
AdoCmd.Parameters.ParamByName('Nr').DataType := ftInteger
AdoCmd.Parameters.ParamByName('Strng').DataType := ftString;

for i := 1 to 10 do
begin     
    AdoCmd.Parameters.ParamByName('Nr').Value := i;
    AdoCmd.Parameters.ParamByName('Strng').Value := sUserName(i);
    AdoCmd.Execute;
end;

您可以使用 .Params(0).Params(1) 加快速度,因为 ParamByName 会占用一些时间。

但这里的窍门是 ParseSql 语句。它使您的代码保持清晰,但仍然只解析一次 sql 字符串。

如果需要,您可以使用事务...通过使用AdoCmd.Connection.BeginTransAdoCmd.Connection.CommitTrans / RollbackTrans

【讨论】:

    【解决方案2】:

    使用 MySQL,您可以使用以下语法:

    INSERT INTO user VALUES (1, "User 1"), (2, "User 2"), (3, "User 3")
    

    那么你可以使用参数:

    AdoQuery.SQL.Text := 'INSERT INTO user VALUES (:p11, :p12), (:p21, :p22), (:p31, :p32)';
    AdoQuery.Parameters[0].Value := 1;
    AdoQuery.Parameters[1].Value := 'User 1';
    AdoQuery.Parameters[2].Value := 2;
    AdoQuery.Parameters[3].Value := 'User 2';
    AdoQuery.Parameters[4].Value := 3;
    AdoQuery.Parameters[5].Value := 'User 3';
    AdoQuery.ExecSQL;
    

    【讨论】:

    • 不过,这对我来说需要相当多的额外应用程序逻辑。我怎么能用BEGIN;插入 ...;插入 ...;结尾;从命令行访问 MySQL 但不在我的 AdoQuery 中时?
    • 可以执行BEGIN;插入;插入; ...;犯罪;完全按照您最初编写的方式使用 ADOQuery 命令批处理。但请注意,我建议的方法会提供更好的性能。
    【解决方案3】:

    正确使用事务也会加快您的插入速度。如果每条语句都需要提交,执行时间会更长。如果您可以在单个事务中执行所有操作并在最后提交它会更快。 不知道 MySQL,但有些数据库还支持“数组 DML”,其中单个 SQL 语句与参数数组一起发送到数据库,从而执行多次但只有一次通信往返。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多