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