cudenetf
Messages postés448Date d'inscriptionmardi 20 septembre 2005StatutMembreDernière intervention26 juillet 2012
-
6 mars 2007 à 10:21
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
10 mars 2007 à 18:48
bonjour,
je recherche des données dans une base de données
je ne recherche qu'une seule ligne
a partir de cette ligne je veux inserer une ligne dans une autre table
j'e donne ma methode mais elle ne me semble pas tres elegante et de tout emaniere elle ne marche pas...
sqlcommand cmd[...]
cmd.connection.open();
sqldatreader rdr=cmd.executereader();
while rdr.read()
{
//test si un champ est different de 0
if(rdr["chp1] !=0)
{
cmd.commandtext=" insert .... nvel elem a partir de ce que je trouve ds chp 1"
cmd.executenonquery();
}
if( rdr["chp2] !=0)
{
cmd.commandtext=" insert .... nvel elem a partir de ce que je trouve ds chp 2"
cmd.executenonquery();
}
}
rdr.close();
cmd.connection.close();
j'obitens un message d'erreur lors de l'execution de cmd.executenonquery()
"there is already a datareader associated .... which must be closed first"
comment faire pour faire les requetes que je desire (le plus rapidement et efficacement possible bien sur)
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 6 mars 2007 à 10:32
il n'est pas possible d'utiliser plusieurs DbCommand (ou DbDataReader) en parallèles avec un DbConnection... en gros, il faut que tu ouvres autant de connections que d'opérations en parallèles... (attention aux perfs)
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 6 mars 2007 à 10:34
Salut,
En effet, il faut que tu ouvres une seconde connexion et donc instancier un second SqlCommand.
Pour faire ca proprement (au niveau fermeture de la connexion et libération des ressources) tu peux simplement utiliser un bloc using.
Par exemple :
<hr />using
(
SqlConnection connection1 =
new
SqlConnection())
{
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 6 mars 2007 à 10:41
Si tu fais la recherche que d'une ligne, tu auras ta clause WHERE dans ta requete, ton reader ne retournera qu'un ligne... Donc niveau perfs ca ne va pas etre une cata (et mon erreur citée juste au dessus n'a plus lieu d'etre ^^ )
Par contre tu peux ajouter tes requetes a la suite les unes des autres dans une string, et executer cette requete une bonne fois pour tout lorsque tu auras vérifié toutes tes conditions... A toi de voir ce qui t'arrange le plus.
Mx
MVP C#
cudenetf
Messages postés448Date d'inscriptionmardi 20 septembre 2005StatutMembreDernière intervention26 juillet 20122 6 mars 2007 à 10:48
ok mais le truc c'est que ma condition depend des champs que je regarde avec mon select (ds le datareader)
et je sais pas faire .... (je suis un peu nul en fait, si vou saviez pas remarqué lol)
pareil pour les requetes ala suite ds une meme string...
un exemple please...
en fait je fais un
select chp1,chp2 from table1
....
ds mon code je verifie si chp1>0
execute(insert (truc a partir de chp1) ds table2)
si chp2>0
execute(insert(truc a partir de chp2) ds table2)
evidemment je ne demande qu'a me perfectionner
si vous avez des trucs pour ameliorer la rapidité et eprformance je usis preneur !!
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 6 mars 2007 à 11:03
Pour des requetes a la suite, c'est simple : tu utilises un StringBuilder et sa méthode Append pour y ajouter tes requetes. (ou au pire tu concatenes des strings - seulement si tu as 2/3 requetes a ajouter). N'oublies pas de mettre des ';' entre chaque requete.
Et quand tu as passé toutes tes conditions, tu affectes la propriété CommandText de ton SqlCommand avec le contenu du StringBuilder, et tu appelles la méthode ExecuteNonQuery();
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 6 mars 2007 à 12:38
<hr />
Salut
Si tu n'as que 2 requetes a la suite, non tu n'auras pas un gros gain, mais bon, au moins le code est optimisé et plus lisible.
Par contre, si tu as besoin que cela soit fait dans une transaction alors tu n'en es pas exempté. (dans le cas présent, si la seconde requete plante, la premiere aura quand meme été effectuée).
Dans ce cas :
<hr />SqlTransaction t = connection2.BeginTransaction();
cudenetf
Messages postés448Date d'inscriptionmardi 20 septembre 2005StatutMembreDernière intervention26 juillet 20122 6 mars 2007 à 18:14
ok merci bien pour ces precisions je pense que cela va bien m'aider...
et alors comment tester des conditions a l'interieur meme d'uen requete? est ce possible?
genre:
insert truc_fait_a_partir_de_chp1 into table2 where chp1 in (select ch1 from table1 where truc_de_table1=laligne_que_je_cherche) [si chp1 !=0]
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 10 mars 2007 à 18:48
Salut,
Juste pour info, si le serveur est un SQL Server 2005 et qu'on travailles avec du .NET 2.0 mini, on peut probablement profiter de MARS (Multiple Active Result Sets).