Delphi TAdoQuery - 多个插入?

时间:2010-10-16 04:44:14

标签: delphi

是否可以使用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调用?

3 个答案:

答案 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.BeginTransAdoCmd.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参数数组,从而执行多次,但只进行一次通信往返。