2017-06-03 89 views
1

我有一個表,用戶可以批量更改列,但只爲一些「喜歡」的記錄。例如,一些郵編。Sqlite多個更新

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」

目前我創建與需要每個記錄的recID(一自動遞增)一個StringList的改變,然後迭代儘管每個一個與

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

謝謝你看,是的,但不知道如何使用它來做到這一點。 :) – X10WannaBe

+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;