Select suivi d'un update

Résolu
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 - 13 oct. 2006 à 12:20
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 - 13 oct. 2006 à 13:55
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

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 oct. 2006 à 13:02
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# 
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 oct. 2006 à 13:17
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# 
3
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
13 oct. 2006 à 13:27
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???
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 oct. 2006 à 13: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# 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
13 oct. 2006 à 13:55
ok je vois merci pour tes explications!!!
0
Rejoignez-nous