plusieurs enregistrements en une fois? [ASP][SQL][ACCESS][INSERT INTO] - ASP - Programmation
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  
 
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...
Marsh Posté le 05-07-2004 à 22:09:40
| tet2neu a écrit : tu mets ta requête dans une boucle   | 
 
 
| dalida a écrit : actuellement je fais ça :  
   | 
 ![[:itm] [:itm]](https://forum-images.hardware.fr/images/perso/itm.gif)
Marsh Posté le 05-07-2004 à 22:16:15
  
  
Je suis un peu  fatigué ces temps ci 
J'ai pas trop regardé le code en fait   
 
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.
) 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.
Marsh Posté le 05-07-2004 à 17:19:53
actuellement je fais ça :
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)
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-