web-dev-qa-db-fra.com

Recordset.Edit ou Update sql vba statement le moyen le plus rapide de mettre à jour?

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 
9
Coding Enthusiast

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é.

7
HansUp

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.

6
Gustav

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.

0
David Beckman