是否可以使用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调用?
答案 0 :(得分: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.BeginTrans
和AdoCmd.Connection.CommitTrans / RollbackTrans
答案 1 :(得分: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;
答案 2 :(得分:0)
正确使用交易也可以加快您的插入速度。如果需要提交每个语句,则执行时间会更长。如果您可以在单个事务中执行所有操作,并且最后只提交它将会更快。 不知道MySQL,但是一些数据库也支持“数组DML”,其中一个SQL语句被一起发送到DB参数数组,从而执行多次,但只进行一次通信往返。