Delphi TAdoQuery - 多个插入?

3
能否使用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; 和 END;,但那也没有起作用。
编辑:我想这么做是因为当我在 for 循环中执行插入操作时,大于 10 个查询似乎需要很长时间。我认为像上面这样添加所有查询会加快速度。有人知道在插入之间是否需要调用 AdoQuery.Close 吗?

不是Close调用,而是ExecSQL调用需要在插入之间。如果您想要更多类似"脚本"的功能,请看看TAdoCommand。它可能更适合您想要做的事情。否则,使用查询中的参数并重复执行具有不同参数值的查询是正确的方法。 - Marjan Venema
3个回答

3

可以尝试使用如下代码(使用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;

这对我来说需要相当多的额外应用逻辑。为什么我可以在命令行访问MySQL时使用BEGIN; INSERT ...; INSERT ...; END;,但在我的AdoQuery中却不能呢? - David
您可以使用 ADOQuery 完全按照最初编写的方式执行 BEGIN; INSERT; INSERT; ...; COMMIT; 命令批处理。但请注意,我建议的方法将提供更好的性能。 - da-soft

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接