[ASP][SQL][ACCESS][INSERT INTO] plusieurs enregistrements en une fois?

plusieurs enregistrements en une fois? [ASP][SQL][ACCESS][INSERT INTO] - ASP - Programmation

Marsh Posté le 05-07-2004 à 17:19:53    

actuellement je fais ça :

Citation :

listeIdTheme = Split(AjoutTheme,"," )    
i=0
    While i<=UBound(listeIdTheme)
SQL = "INSERT INTO liens_themes (id_lien, id_theme) values("&new_id&","&listeIdTheme(i)&" )"
Set RSinserdom = server.createobject("ADODB.Recordset" )
RSinserdom.Open SQL,MM_liens_gret_STRING , 3, 3
i=i+1
   Wend


et au lieu de faire ça, je voudrais, comme le gentil mysql/php me le permettait, faire style insert into machin (tuc1,tuc2) values(1,2),(2,3),(4,5)

Citation :

listeIdTheme = Split(AjoutTheme,"," )    
i=0
     
SQL = "INSERT INTO liens_themes (id_lien, id_theme) values
While i<=UBound(listeIdTheme)
if i>0 then
SQL=SQL&","
end if
SQL=SQL&"("&new_id&","&listeIdTheme(i)&" )"
i=i+1"  
Wend
Set RSinserdom = server.createobject("ADODB.Recordset" )
RSinserdom.Open SQL,MM_liens_gret_STRING , 3, 3
 
 


 
alors, comment ça on peut pas faire ça avec access?
C pas possible d'être aussi dépouvu :??:


Message édité par dalida le 05-07-2004 à 17:22:01

---------------
90-60-90 -Guish c un homme humain, un vrai-
Reply

Marsh Posté le 05-07-2004 à 17:19:53   

Reply

Marsh Posté le 05-07-2004 à 17:38:51    

c nul access

Reply

Marsh Posté le 05-07-2004 à 17:54:52    

flow24 a écrit :

c nul access

Ce n'est pas la question, j'ai pas besoin de débat là-dessus. Merci d'éviter :sweat:


---------------
90-60-90 -Guish c un homme humain, un vrai-
Reply

Marsh Posté le 05-07-2004 à 20:08:07    

tu peux faire un "insert into latable2 (...) values (select ... from latable2)"
 
Mais tu ne peu en aucun cas mélanger le code VB et le SQL...

Reply

Marsh Posté le 05-07-2004 à 22:01:26    

tu mets ta requête dans une boucle  [:jkley]

Reply

Marsh Posté le 05-07-2004 à 22:09:40    

tet2neu a écrit :

tu mets ta requête dans une boucle  [:jkley]


 

dalida a écrit :

actuellement je fais ça :

Citation :

listeIdTheme = Split(AjoutTheme,"," )    
i=0
    While i<=UBound(listeIdTheme)
SQL = "INSERT INTO liens_themes (id_lien, id_theme) values("&new_id&","&listeIdTheme(i)&" )"
Set RSinserdom = server.createobject("ADODB.Recordset" )
RSinserdom.Open SQL,MM_liens_gret_STRING , 3, 3
i=i+1
   Wend




[:itm]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-07-2004 à 22:16:15    

:jap:  
Je suis un peu  fatigué ces temps ci
J'ai pas trop regardé le code en fait  :whistle:

Reply

Marsh Posté le 05-07-2004 à 22:38:32    

Bon, alors, reprenons...
 
Dans "AjoutTheme" y'a quoi ? C'est une liste reçue via un formulaire ? Si oui, c'est mort, il faut passer par la boucle que tu as écrite.
 
Si c'est des informations issures d'une requête, alors tu peux faire ça :
 
Mettons que "AjoutTheme" soit allimentée par la requête :
 
"select id from theme"
 
A ce moment, tu peux faire ça :
 
INSERT INTO liens_themes (id_lien, id_theme) values(select "&new_id&", id from theme)"  
 
Ceci dit je pense que c'est plutôt la première solution.
 
Si tu redoutes des données incohérentes, il te faut passer par une transaction afin de garantir que toutes les lignes seront créées, ou aucune :
 
listeIdTheme = Split(AjoutTheme,"," )    
i=0  
dim cnx
set cnx = Server.CreateOject("ADODB.Connection" )
cnx.Open MM_liens_gret_STRING
 
cnx.begintrans
 
on error resmue next
lastErr = 0
 
for i = lbound(listeIdTheme) to UBound(listeIdTheme)
   SQL = "INSERT INTO liens_themes (id_lien, id_theme) values("&new_id&","&listeIdTheme(i)&" )"  
   cnx.Execute SQL
   if err <> 0 then
      lastError = err.number
      exit for
   end if
next
 
on error goto 0
 
if lastError <> 0 then
   cnx.rollback
   Resonse.Write "Une erreur s'est produite lors du traîtement de la requête " & SQL & "<br>Annulation de la transation en court et fin en urgence du traîtement."
   cnx.Close
   set cnx = Nothing
   Response.End
else
   cnx.committrans
end if
 
cnx.Close
set cnx = Nothing
 
PS: je sais plus si c'est .rollback ou .rollbacktrans
 
En tout ça, avec ce code (légèrement plus propre, t'as pas besoin d'instancier un RS pour faire un INSERT, et un While qui part de 0 avec une incrémentation manuelle quand on peut faire un for borné par les limites du tableau c'est pas terrible ;)) te permettre d'insérer les lignes d'un coup et de garantir qu'elles sont toutes insérées ou toutes annulées en cas d'erreur. En plus de ça, si une personne tente de lire la table pendant l'insertion des données, sa requête sera mise en file d'attente jusqu'à la fin de la boucle, afin d'assurer la lecture de toutes ou aucune données insérée, afin d'être certain de ne pas afficher n'importe quoi.
 
PS²: Les transactions c'est un outils extrêment puissant qui permet de garantir à tout instant une version "propre" de la base. Par contre, c'est êtrêment consommateur, et peut sérieusement ralentir une application partagée, à cause de la présence de lock en écriture ET en lecture sur l'intégralité des données (ou tables avec certains SGBD tels que SQL Server) pendant toute la durée de la transaction.


Message édité par Arjuna le 05-07-2004 à 22:39:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed