使用Delphi TAdoQuery一次执行多个inserts是可能的,还是必须单独执行每条语句?我想做的是:
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;,但也不起作用。
Edit:我之所以这样做,是因为当我在for循环中执行插入操作时,执行> 10个查询似乎需要很长时间。我假设像上面这样添加所有这些元素会加快速度。有没有人知道在两次插入之间是否需要AdoQuery.Close调用?
发布于 2010-10-16 13:08:34
对于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;发布于 2010-10-16 14:10:47
尝试如下所示(使用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.BeginTrans和AdoCmd.Connection.CommitTrans / RollbackTrans。
发布于 2010-10-16 22:18:45
正确使用事务也会加快插入速度。如果每条语句都需要提交,则执行时间会更长。如果您可以在单个事务中执行所有操作,并在结束时提交,则速度会更快。我不知道MySQL,但一些数据库也支持"array DML",在这种情况下,单个SQL语句被发送到一起DB的参数数组,从而执行多次,但只需一次通信往返。
https://stackoverflow.com/questions/3947718
复制相似问题