Select suivi d'un update [Résolu]

Signaler
Messages postés
283
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
9 juillet 2010
-
Messages postés
283
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
9 juillet 2010
-
salut a toutes et a tous!!!!!!!

Voila je souhaiterais faire un update sur une table sqlserver. les données pour la mise a jour provienne d'une autre table donc je fai d'abord un select sur la table1 et pour chaque valeur de mon select je fai un update sur la table 2. Lorsque je lance mon appli j'ai un message d'erreur qui me dit que je ne peux pas faire d'update car un datareader est deja ouvert et ke je dois le fermé.

Voila mon code

            if (cn != null)
            {
                select = "SELECT id, info FROM table1";
                SqlCommand cmd = new SqlCommand(select, cn);
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {                        update "UPDATE table2 SET champs1 " + reader[1].ToString()
                            + " WHERE champs2 = " + reader[0].ToString().Replace("'","''");
                        SqlCommand cmd2 = new SqlCommand(update, cn);
                        int affectedrows = cmd2.ExecuteNonQuery();
                    }
                }
            }
            cn.Close();
            cn.Dispose();

quelqu'un aurait-il une solution

5 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Salut,

En fait, il faut simplement que tu ouvres une autre connexion.

Autrement : 
   -Utilise des requetes paramétrées plutot que de construire ta requete avec des concaténations   
   -Libère ta connexion dans une clause finally (et donc entoure le reste de ton code par un try/catch)

Mx
MVP C# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Tiens, voila ton bout de code en appliquant mes conseils.

J'ai utilisé 2 méthodes différentes pour la libération des ressources, le fameux finally, ou le bloc using(){} qui fonctionne de la meme manière

<hr />

string select =
"SELECT * FROM table1";
string update "UPDATE table2 SET champs2 @champs2 WHERE champs1 = @champs1";

SqlConnection cn =
new
SqlConnection(
"TaChaineDeConnexion");

try
{
   cn.Open();

   using (
SqlCommand cmd =
new
SqlCommand(select, cn))
   {

      SqlDataReader reader = cmd.ExecuteReader();

      using (
SqlConnection cn2 =
new
SqlConnection(
"TaChaineDeConnexion"))
      {
         cn2.Open();

         using (
SqlCommand cmd2 =
new
SqlCommand(update, cn2))
         {

            while (reader.Read())
            {
               cmd2.Parameters.Clear();
               cmd2.Parameters.AddWithValue(
"@champs2", reader[1].ToString());
               cmd2.Parameters.AddWithValue(
"@champs1", reader[0].ToString());
               cmd2.ExecuteNonQuery();
            }
         }
      }
   }
}

catch (
SqlException se)
{

   // Gestion des exceptions
}

finally{
   cn.Dispose();
   cn =
null;
}
<hr />

Mx
MVP C# 
Messages postés
283
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
9 juillet 2010
3
je te remerci pour ton aide MorpionMx

ca marche nickel

juste une question pour le using tu la fai ou la fermeture de la 2eme connection???
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
En fait, une fois la fin du using atteinte, la méthode Dispose de l'objet déclarée dans la parenthèse du using est automatiquement appelée (il faut donc que cet objet implémente IDisposable).

Mx
MVP C# 
Messages postés
283
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
9 juillet 2010
3
ok je vois merci pour tes explications!!!