Je suis récemment tombé sur des instructions de mise à jour vba et j'utilise Recordset.Edit
et Recordset.Update
non seulement pour éditer mes données existantes mais pour les mettre à jour.
Je veux connaître la différence entre les deux instructions: recordset.update
et Update sql Vba
. Je pense qu'ils font tous la même chose mais je ne peux pas savoir lequel est le plus efficace ni pourquoi.
Exemple de code ci-dessous:
'this is with sql update statement
dim someVar as string, anotherVar as String, cn As New ADODB.Connection
someVar = "someVar"
anotherVar = "anotherVar"
sqlS = "Update tableOfRec set columna = " &_
someVar & ", colunmb = " & anotherVar &_
" where columnc = 20";
cn.Execute stSQL
Ceci est pour le recordset (mettre à jour et éditer):
dim thisVar as String, someOthVar as String, rs as recordset
thisVar = "thisVar"
someOthVar = "someOtherVar"
set rs = currentDb.openRecordset("select columna, columnb where columnc = 20")
do While not rs.EOF
rs.Edit
rs!columna = thisVar
rs!columnb = someOthvar
rs.update
rs.MoveNext
loop
En supposant que WHERE columnc = 20
sélectionne plus de 1000 lignes, comme vous l'avez mentionné dans un commentaire, l'exécution de cette instruction UPDATE
devrait être nettement plus rapide que de parcourir en boucle un jeu d'enregistrements et de mettre à jour ses lignes une à une.
Cette dernière stratégie est une approche RBAR (Row By Agonizing Row). La première stratégie, qui consiste à exécuter une seule variable (valide) UPDATE
, est une approche "basée sur les ensembles". En général, la valeur basée sur les ensembles l'emporte sur la performance.
Cependant, vos 2 exemples soulèvent d'autres problèmes. Ma première suggestion serait d'utiliser DAO au lieu de ADO pour exécuter votre UPDATE
:
CurrentDb.Execute stSQL, dbFailonError
Quelle que soit la stratégie choisie, assurez-vous que columnc est indexé.
La méthode SQL est généralement la plus rapide pour les mises à jour en masse, mais la syntaxe est souvent maladroite.
La méthode VBA, cependant, présente des avantages distincts: le code est plus propre et le jeu d'enregistrements peut être utilisé avant ou après la mise à jour/la modification sans requérir les données. Cela peut faire une énorme différence si vous devez effectuer de longs calculs entre les mises à jour. En outre, le jeu d'enregistrements peut être passé de ByRef à des fonctions de support ou à un traitement ultérieur.
J'ai constaté que lorsque je dois mettre à jour tous les enregistrements d'une table dans l'ordre, par exemple, l'ajout d'un ID séquentiel lorsque l'utilisation de la numérotation automatique n'est pas réalisable, l'ajout d'un total cumulé ou tout calcul incrémentiel basé sur une valeur du jeu d'enregistrements, la méthode DAO est beaucoup plus rapide.
Si vos données ne sont pas dans l'ordre dans lequel vous souhaitez qu'elles soient traitées, et que vous devez plutôt vous fier aux valeurs correspondantes de la source de données, SQL est beaucoup plus efficace.