Différence entre méthode d'ajout à une base de donnée

Résolu
cs_med_ali Messages postés 23 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 2 avril 2011 - 2 avril 2011 à 12:28
cs_med_ali Messages postés 23 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 2 avril 2011 - 2 avril 2011 à 23:47
Bonjour
je te remercie pour l'intérêt que tu a donné à mon sujet
c'est vrai que je n'ai pas de problème pour ajouter un nouveau enregistrement à ma base de donnée mais comme il existe deux méthodes je cherche celle qui est optimal c-a-d la plus rapide
j'explique :
pour ajouter un enregistrement à une base de donnée (dans mon cas c'est une base ACCESS) il existe deux méthodes :

Dim cnc  As ADODB.Connection

cnc.Provider = "Microsoft.Jet.OLEDB.4.0"
cnc.ConnectionString = "Persist Security Info=False; Data Source = " Chemin_Base  ";Jet OLEDB:Database ;"
cnc.Open


1. 1ère méthode :
Dim eng  As ADODB.Recordset

Set eng New ADODB.Recordset  eng.CursorLocation adUseClient

eng.Open "Table", cnc, adOpenDynamic, adLockOptimistic

eng.AddNew
  eng!Champs1 = Valeur1
  eng!Champs2 = Valeur2
  ...
eng.Update


2. 2ème méthode :
cnc.Execute "INSERT INTO Table (Champs1,Champs2,...) VALUES (Valeur1,Valeur2,...);"

5 réponses

cs_med_ali Messages postés 23 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 2 avril 2011
2 avril 2011 à 23:47
la méthode n°1 charge tous les enregistrement de la table (pas de la base bien sûr, c'était une petite erreur d'inattention) c'est déjà un gaspillage de mémoire et de temps d'exécution
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 avril 2011 à 13:44
Salut

Question bien claire, bien posée : merci, ça change de ce qu'on voit à longueur de temps sur le forum.

Je ne suis pas persuadé qu'il y ait une différence fondamentale de vitesse d'exécution, surtout pour une seule insertion.

Dans le premier cas, la syntaxe est plus pratique, plus facile à (re)lire, plus propre.
La seconde syntaxe t'oblige à gérer une String compatible, c'est à dire qu'il faut bien respecter la syntaxe SQL avec les espaces, les symboles ' doublés lorsqu'ils sont dans le contenu d'un champ (pour ne pas rentrer en conflit avec les encadrements de champs), idem pour les éventuels ", etc

Dans le premier cas, il faudrait aussi regarder comment se comporte la mémoire consommée lorsque tu t'adresses à une énorme table. Dans le second cas, tu inscris les données dans la DB sans passer par un objet local.

Par contre, si tu as des centaines d'insertion à faire en boucle, la seconde syntaxe a un avantage certain : l'utilisation des Transactions SQL : elles permettent de donner des ordres d'insertion en rafale, par paquet de X commandes d'insertion d'un seul coup, avec la possibilité d'annuler ou de valider à la fin :
cnc.BeginTrans
cnc.Execute "INSERT INTO Table (Champs1, ...
cnc.Execute "INSERT INTO Table (Champs1, ...
cnc.Execute "INSERT INTO Table (Champs1, ...
cnc.Execute "INSERT INTO Table (Champs1, ...
cnc.Execute "INSERT INTO Table (Champs1, ...
cnc.CommitTrans  ' ou cnc.RollBackTrans si tu dois annuler ces ordres
NB : Cette méthode est peut-être aussi applicable à la première syntaxe (pas sûr)

Mais il y a aussi une troisième syntaxe, proche de la seconde, et qui permet de fournir des données issues d'autres tables (partie purement SQL) :
Insert Into Table1 (Champs1,Champs2,...) 
Select T2.Champs1, T2.Champs2,...
  From Table2 T2
 Where T2.Champs18 > 4012


Donc, s'il fallait voter, je choisirai la seconde syntaxe, plus complexe (chiante pour dire le mot) à écrire, mais plus extensible.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_med_ali Messages postés 23 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 2 avril 2011
2 avril 2011 à 14:03
merci bcp jack
c'est aussi une bonne réponse
Dans la même logique que la tienne je pense que la deuxième méthode est plus rapide puisque elle n'aura pas besoin (normalement?) de charger tous les enregistrement de la base pour insérer un nouveau, au contraire de la première méthode, donc elle utilise moins de ressource mémoire et c'est déjà la méthode que j'utilise depuis longtemps malgré sa complexité !
mais je n'ai aucune idée si elle n'a pas de contrainte surtout dans le cas d'une base partagé ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 avril 2011 à 16:25
Base partagée : Oui, justement, c'est son gros intérêt avec les Transactions :
Les séries de données insérées dans une Transaction gèrent le Lock des enregistrements, et pas de la table. Tant que le CommitTrans n'a pas été reçu, les données restent dans des tables temporaires.
En cas de problème de programme (manque une donnée, utilisateur annule, ...), le RollBackTrans supprimera les données temporaires et déLockera les enregistrements concernés.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
2 avril 2011 à 23:27
La méthode n°1 ne devrait pas charger tous les enregistrements (dans le meilleur des mondes, hein ) mais n'est vraiment pas à mon gout car on n'a aucun contrôle sur ce que fait ADO et il pompera de toutes façons des ressources pour rien ...

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Rejoignez-nous