IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème boucle imbriquée SqlDataReader


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut Problème boucle imbriquée SqlDataReader
    Bonjour,

    J'ai besoin d'effectuer plusieurs boucles imbriquées mais celle-ci ne fonctionnent pas. Je crois avoir cernée le problème mais je ne sais pas le résoudre. SqlDataReader on ne peut être utiliser que si le précèdent est fermé. Mais je ne sais pas comment lire les requête autrement.

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    private void (string requete1, string requete1_bis, string requete_Insertion_, string code_athlete, string mdp, string id_athlete, string bdd_idathlete, string server_idathlete, string utilisateur_idathlete, string pwd_idathlete, string id, string mp, string requete_verif)
            {
                //recupération du ID_athlete de la table athlete :
                // Chaine de connexion
                try
                {
     
                    string connectString = "database='" + bdd_idathlete + "'; server='" + server_idathlete + "';User ID='" + utilisateur_idathlete + "'; pwd='" +pwd_idathlete + "'";
                    // Objet connection
                    SqlConnection connection = new SqlConnection(connectString);
     
                    connection.Open();// Ouverture
                    //TRI IMPRIMANTE
     
     
                    requete1 = "SELECT * FROM imprimante WHERE code_athlete is not null AND mdp_athlete is not null";
            // Création d'un objet SqlDataAdapter
                    SqlCommand Command = new SqlCommand(requete1, connection);
                    SqlDataReader dex = Command.ExecuteReader();
     
                    while (dex.Read())
                    {
                        code_athlete = dex["code_athlete"].ToString();
                        mdp = dex["mdp_athlete"].ToString();
     
                        requete_verif = "SELECT * FROM  ";
                        SqlCommand verif_ = new SqlCommand(requete_verif, connection);
                        SqlDataReader verif_dex = verif_.ExecuteReader();
     
                        while (verif_dex.Read())
                        {
                            id = verif_dex["LOGIN_"].ToString();
                            mp = verif_dex["MDP_"].ToString();
                            Console.WriteLine(id + "--" + mp);
                            if ((id != code_athlete) && (mp != mdp))
                            {
     
                                requete1_bis = "SELECT id_athlete FROM athlete WHERE code_athlete ='" + code_athlete + "'";
                                SqlCommand insert_ = new SqlCommand(requete1_bis, connection);
                                //// Objet DataReader
                                Console.WriteLine(requete1_bis);
                                SqlDataReader dex_bis = insert_.ExecuteReader();
                                while (dex_bis.Read())
                                {
                                    Console.WriteLine(requete1_bis);
     
                                    id_athlete = dex_bis["id_athlete"].ToString();
     
                                    requete_Insertion_ = "INSERT INTO  VALUES('" + id_athlete.Replace("'", "''") + "','" + code_athlete.Replace("'", "''") + "','" + mdp.Replace("'", "''") + "') ";
                                    Console.WriteLine(requete_Insertion_);
                                    SqlCommand insert = new SqlCommand(requete_Insertion_, connection);
                                    insert.ExecuteNonQuery();
                                    insert.Dispose();
                                }
                                dex_bis.Close();
                            }
                        } verif_dex.Close();
                     }
                    dex.Close();
     
                    connection.Close();
                }
    PS: J'ai testé les requêtes elles fonctionnent

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Il te manque quelque chose là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete_verif = "SELECT * FROM  ";

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Il te manque ton nom de table dans ton insert into
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete_Insertion_ = "INSERT INTO  VALUES('" + id_athlete.Replace("'", "''") + "','" + code_athlete.Replace("'", "''") + "','" + mdp.Replace("'", "''") +

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Sa ne marche toujours pas. Le problème vient que le sqldatareader doit etre fermé avant d'être réutiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    private void (string requete1, string requete1_bis, string requete_Insertion_, string code_athlete, string mdp, string id_athlete, string bdd_idathlete, string server_idathlete, string utilisateur_idathlete, string pwd_idathlete, string id, string mp, string requete_verif)
            {
                //recupération du ID_athlete de la table athlete :
                // Chaine de connexion
                try
                {
     
                    string connectString = "database='" + bdd_idathlete + "'; server='" + server_idathlete + "';User ID='" + utilisateur_idathlete + "'; pwd='" +pwd_idathlete + "'";
                    // Objet connection
                    SqlConnection connection = new SqlConnection(connectString);
     
                    connection.Open();// Ouverture
                    //TRI IMPRIMANTE
     
     
                    requete1 = "SELECT * FROM imprimante WHERE code_athlete is not null AND mdp_athlete is not null";
            // Création d'un objet SqlDataAdapter
                    SqlCommand Command = new SqlCommand(requete1, connection);
                    SqlDataReader dex = Command.ExecuteReader();
     
                    while (dex.Read())
                    {
                        code_athlete = dex["code_athlete"].ToString();
                        mdp = dex["mdp_athlete"].ToString();
     
                        requete_verif = "SELECT * FROM athlete ";
                        SqlCommand verif_ = new SqlCommand(requete_verif, connection);
                        SqlDataReader verif_dex = verif_.ExecuteReader();
     
                        while (verif_dex.Read())
                        {
                            id = verif_dex["LOGIN_"].ToString();
                            mp = verif_dex["MDP_"].ToString();
                            Console.WriteLine(id + "--" + mp);
                            if ((id != code_athlete) && (mp != mdp))
                            {
     
                                requete1_bis = "SELECT id_athlete FROM athlete WHERE code_athlete ='" + code_athlete + "'";
                                SqlCommand insert_ = new SqlCommand(requete1_bis, connection);
                                //// Objet DataReader
                                Console.WriteLine(requete1_bis);
                                SqlDataReader dex_bis = insert_.ExecuteReader();
                                while (dex_bis.Read())
                                {
                                    Console.WriteLine(requete1_bis);
     
                                id_athlete = dex_bis["id_athlete"].ToString();
     
                                    requete_Insertion_ = "INSERT INTO athlete VALUES('" + id_athlete.Replace("'", "''") + "','" + code_athlete.Replace("'", "''") + "','" + mdp.Replace("'", "''") + "') ";
                                    Console.WriteLine(requete_Insertion_);
                                    SqlCommand insert = new SqlCommand(requete_Insertion_, connection);
                                    insert.ExecuteNonQuery();
                                    insert.Dispose();
                                }
                                dex_bis.Close();
                            }
                        } verif_dex.Close();
                     }
                    dex.Close();
     
                    connection.Close();
                }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Voilà ma suggestion

    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while (dex_bis.Read())
                                {
                                    Console.WriteLine(requete1_bis);
     
                                id_athlete = dex_bis["id_athlete"].ToString();
     
                                    requete_Insertion_ = "INSERT INTO athlete VALUES('" + id_athlete.Replace("'", "''") + "','" + code_athlete.Replace("'", "''") + "','" + mdp.Replace("'", "''") + "') ";
                                    Console.WriteLine(requete_Insertion_);
                                    SqlCommand insert = new SqlCommand(requete_Insertion_, connection);
                                    insert.ExecuteNonQuery();
                                    insert.Dispose();
                                }
                                dex_bis.Close();
    Fait tes insert en une seule fois en utilisant un stringbuilder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    System.Text.StringBuilder sb = new StringBuilder();
    ...
    while (dex_bis.Read())
     {
         sb.AppendLine("INSERT INTO athlete VALUES('" + id_athlete.Replace("'", "''") + "','" + code_athlete.Replace("'", "''") + "','" + mdp.Replace("'", "''") + "'); ");
    }
    dex_bis.Close();
    ...
    ...
    SqlCommand insert = new SqlCommand(sb.ToString(), connection);
                                    insert.ExecuteNonQuery();
    connection.Close();

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par xouzi
    Le problème vient que le sqldatareader doit etre fermé avant d'être réutiliser.
    Tu as la réponse à ton problème, tu ne peux pas procéder ainsi. Tu dois donc modifier ton code de manière à ne plus avoir d'imbrication et donc plus de problèmes

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Mais je vois pas comment je peux faire vue que mes requêtes s'exécutent par rapport au résultat des requêtes précédentes.
    Sinon il faudrait que je récupérai le résultat des requêtes dans un tableau mais je pense qu'il y a mieu.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Petite note au passage tu peux remplacer tes values par des paramètres. Ça t'assure une syntaxe sql correcte et un protection contre des hackers si c'est pour un site web.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     sb.AppendLine("INSERT INTO athlete VALUES('" + id_athlete.Replace("'", "''") + "','" + code_athlete.Replace("'", "''") + "','" + mdp.Replace("'", "''") + "'); ");
    SqlCommand insert = new SqlCommand(sb.ToString(), connection);
                                    insert.ExecuteNonQuery();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sb.AppendLine("INSERT INTO athlete VALUES(@id_athlete,@code_athlete,@mdp); ");
    SqlCommand insert = new SqlCommand(sb.ToString(), connection);
                                    insert.ExecuteNonQuery();
    SqlCommand.Parameters.AddWithValues("@id_athlete",id_athlete);
    SqlCommand.Parameters.AddWithValues("@code_athlete",code_athlete);
    SqlCommand.Parameters.AddWithValues("@mdp",mdp);
    Ton code sera plus lisible.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 338
    Par défaut
    Ok merci. Mais je sais toujours pas comment empecher les boucle imbriquer. il y a rien pour remplacer sqldatareader.

  10. #10
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par xouzi Voir le message
    Sinon il faudrait que je récupérai le résultat des requêtes dans un tableau mais je pense qu'il y a mieu.
    En quoi ce ne serait pas bien ?

    Par contre je comprends mal ce que tu veux faire, car faire un SELECT d'un enregistrement d'une table pour récupérer son ID afin d'insérer un autre enregistrement dans la même table et avec le même ID, ça me semble étrange

    Tu pourrais expliquer simplement ce que tu cherches à faire ? ^^

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Tu dois prendre 2 requêtes sql et en faire qu'une seule avec un inner join sur ton code_athlete et une condition where sur imprimante.mdp <> athelte.mdp

    Tu auras qu'un datareader.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problémes de Boucles imbriquées
    Par claude_tech dans le forum Débuter
    Réponses: 11
    Dernier message: 13/06/2011, 12h57
  2. Problème boucle while imbriquée dans autre boucle while
    Par nattydreadnatty dans le forum Langage
    Réponses: 3
    Dernier message: 25/08/2010, 14h58
  3. [XSLT] problème de boucle imbriquée en xsl/xpath
    Par lol88 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/10/2009, 18h30
  4. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 14h46
  5. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo