Sqlite多个更新

时间:2017-06-03 18:10:48

标签: ubuntu sqlite lazarus

我有一个表,用户可以批量更改列,但只能用于某些“喜欢”的记录。例如,一些 zipcodes。

zipcode = 12345  // Need to change this one
zipcode = 23456
zipcode = 12345  // Not this one
zipcode = 34567
zipcode = 12345  // Need to change this one
zipcode = 12345  // Need to change this one
zipcode = 12345  // Not not this one

显然,我不能只使用“WHERE zipcode = 12345”

目前我正在创建一个StringList,其中包含需要更改的每条记录的recID(一个AutoInc),然后使用

进行迭代。
for i:=0 to slChange.Count-1 do
begin
  tStr:=' UPDATE Names SET Zipcode = '80000' WHERE recID = '+QuotedStr(slChange[i])+';';
  dm.sqlEmails.SQL.Text:=tStr;
  dm.sqlEmails.ExecSQL;
end;

如果要更改大量记录,则需要花费很长时间。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

可以加速代码的一件事是使用参数。您只准备一次查询,因此DBMS不需要重复解析和计划查询的执行。然后,您只发送参数值并调用ExecSQL。另一个可以提高性能的方法是使用指定的Transaction对象。这是一个显示上述两件事的代码:

dm.sqlEmails.SQL.Text := 'UPDATE Names SET Zipcode = :ZipCode WHERE RecID = :RecID';

dm.sqlEmails.Transaction.StartTransaction;
try
  for i := 0 to slChange.Count-1 do
  begin
    dm.sqlEmails.Params.ParamByName('Zipcode').AsString := '80000';
    dm.sqlEmails.Params.ParamByName('RecID').AsString := slChange[i];
    dm.sqlEmails.ExecSQL;
  end;
  dm.sqlEmails.Transaction.Commit;
except
  dm.sqlEmails.Transaction.Rollback;
  raise;
end;