Différence entre méthode d'ajout à une base de donnée [Résolu]

Messages postés
23
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
2 avril 2011
- - Dernière réponse : 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,...);"
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
23
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
2 avril 2011
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 194 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_med_ali
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
0
Merci
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)
Commenter la réponse de cs_Jack
Messages postés
23
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
2 avril 2011
0
Merci
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é ?
Commenter la réponse de cs_med_ali
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
0
Merci
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.
Commenter la réponse de cs_Jack
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
0
Merci
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
Commenter la réponse de cs_ghuysmans99