我有一个表,用户可以批量更改列,但只能更改某些“喜欢”记录。例如,一些邮政编码。
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邮政编码= 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;
如果要更改很多记录,则需要花费一些时间。
有一个更好的方法吗?
最佳答案
可以加快代码速度的一件事是使用参数。您只准备一次查询,因此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;