2017-06-03 1 views
1

J'ai une table que l'utilisateur peut modifier en bloc une colonne, mais seulement pour certains dossiers "similaires". Par exemple, certains codes postaux.Sqlite multiples mises à jour

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 

Il est clair que je ne peux pas utiliser « OU = code postal 12345 »

Actuellement, je suis en train de créer un StringList avec le RECID (un AutoInc) de chaque enregistrement qui doit être changé, alors que chaque itérer un avec

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; 

S'il y a beaucoup d'enregistrements à modifier, cela prend beaucoup de temps.

Y a-t-il une meilleure façon de procéder?

+1

Utilisez-vous une transaction? –

+0

Merci de regarder, oui mais aucune idée de comment l'utiliser pour le faire non plus. :) – X10WannaBe

+0

Est-ce un "oui" ou un "non"? –

Répondre

0

Une chose qui peut accélérer votre code est l'utilisation de paramètres. Vous ne préparez qu'une seule fois la requête pour que le SGBD n'ait pas besoin d'analyser et de planifier l'exécution de la requête de façon répétitive. Ensuite, vous n'envoyez que des valeurs de paramètre et appelez ExecSQL. Une autre chose qui peut améliorer les performances est l'utilisation de l'objet Transaction affecté. Voici un code montrant les deux choses mentionnées:

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;