コード例 #1
0
        /// <summary>
        /// Permet d'énumérer les enregistrements résultant d'une requête de consultation par une méthode passée en paramètre
        /// </summary>
        /// <param name="Requete">Requête SQL à exécuter (doit être de type SELECT ou SHOW)</param>
        /// <param name="Valeurs">Valeurs des parties variables</param>
        /// <returns>Chaque enregistrement produit par cette requête de consultation</returns>
        public IEnumerable <IEnregistrement> Enumerer(string Requete, params object[] Valeurs)
        {
            using (GestionnaireDeConnexionDeLecture GestionnaireConnexionLecture = new GestionnaireDeConnexionDeLecture(this))
            {
                // Boucle permettant de réessayer après une reconnexion
                for (int NombreEchecs = 0; NombreEchecs < 2; NombreEchecs++)
                {
                    Enregistrement Enregistrement       = null;
                    int            IndiceEnregistrement = 0;
                    while (true)
                    {
                        try
                        {
                            if (Enregistrement == null)
                            {
                                // Vérification de l'état théorique de la connexion
                                if (!EstConnecte)
                                {
                                    throw new Exception("Pas de connexion établie au serveur MySql");
                                }
                                // Vérification qu'il s'agit bien d'une requête de consultation
                                if (!EstRequeteConsultation(Requete))
                                {
                                    throw new Exception("Une requête d'action ne peut pas faire l'objet de la méthode MyDB.Consulter()");
                                }
                                // Création de la commande SQL
                                MySqlCommand Commande = CreerCommande(Requete, Valeurs);
                                if (!GestionnaireConnexionLecture.DebuterLecture(Commande))
                                {
                                    throw new Exception("Aucun objet de lecture n'a pu être créé");
                                }
                                // Préparation de l'objet représentant l'enregistrement courant
                                Enregistrement = new Enregistrement(GestionnaireConnexionLecture.ConnexionUtilisee.m_Lecteur);
                            }
                            // Boucle de lecture des enregistrements
                            if (!GestionnaireConnexionLecture.ConnexionUtilisee.m_Lecteur.Read())
                            {
                                /*
                                 * // Terminaison de la lecture avec libération des ressources associées
                                 * if (ConnexionLecture.ConnexionUtilisee != null) ConnexionLecture.ConnexionUtilisee.TerminerLecture(this);
                                 */
                                // Permet de quitter la boucle de lecture des enregistrements et cette méthode d'énumération
                                yield break;
                            }
                            // Transfert des valeurs de l'enregistrement courant dans le dictionnaire le représentant
                            Enregistrement.ChargerValeurs(IndiceEnregistrement, GestionnaireConnexionLecture.ConnexionUtilisee.m_Lecteur);
                            // Incrémentation du nombre d'enregistrements consultés
                            IndiceEnregistrement++;
                        }
                        catch (Exception Erreur)
                        {
                            /*
                             * System.Diagnostics.Debug.WriteLine(string.Format(
                             *  "\nMyDB.Consulter({0}, {1}) a échoué (version avec méthode de traitement) :\n{2}\n",
                             *  Requete,
                             *  string.Join("", Valeurs.Select(Valeur => string.Format(", {0}", Valeur))),
                             *  Erreur.Message));
                             */
                            if (SurErreur != null)
                            {
                                SurErreur(this, MethodeExecutantRequeteSql.Enumerer, Requete, Valeurs, Erreur.Message);
                            }

                            /*
                             * // Terminaison de la lecture avec libération des ressources associées
                             * if (ConnexionLecture.ConnexionUtilisee != null) ConnexionLecture.ConnexionUtilisee.TerminerLecture(this);
                             */
                            // Test de l'état de connexion
                            if ((EtatConnexionConnu != EtatConnexion.Perdu) && (!EstConnecte || TesterConnexion()))
                            {
                                if (SurErreur != null)
                                {
                                    SurErreur(this, MethodeExecutantRequeteSql.Enumerer, Requete, Valeurs, Erreur.Message);
                                }
                                yield break; // Permet de quitter la boucle de lecture des enregistrements et cette méthode d'énumération
                            }
                            // En cas de perte de connexion, on tente une fois de se reconnecter
                            if (!SeConnecter())
                            {
                                if (SurErreur != null)
                                {
                                    SurErreur(this, MethodeExecutantRequeteSql.Enumerer, Requete, Valeurs, Erreur.Message);
                                }
                                yield break; // Permet de quitter la boucle de lecture des enregistrements et cette méthode d'énumération
                            }
                            // En cas de réussite de la re-connexion, on boucle une seconde fois sur la tentative d'exécution de cette lecture
                            break; // Permet de quitter la boucle de lecture des enregistrements
                        }
                        // Enumération de l'élément courant (comme retour partiel devant être "consommé")
                        yield return(Enregistrement);
                    }
                }
            }
        }
コード例 #2
0
 /// <summary>
 /// Permet de récupérer le premier enregistrement résultant d'une requête de consultation
 /// </summary>
 /// <param name="Requete">Requête SQL à exécuter (doit être de type SELECT ou SHOW)</param>
 /// <param name="Valeurs">Valeurs des parties variables</param>
 /// <returns>Enregistrement si possible, sinon null</returns>
 public IEnregistrement Consulter(string Requete, params object[] Valeurs)
 {
     for (int NombreEchecs = 0; NombreEchecs < 2; NombreEchecs++)
     {
         MyDB ConnexionUtilisee = null;
         try
         {
             // Vérification de l'état théorique de la connexion
             if (!EstConnecte)
             {
                 throw new Exception("Pas de connexion établie au serveur MySql");
             }
             // Vérification qu'il s'agit bien d'une requête de consultation
             if (!EstRequeteConsultation(Requete))
             {
                 throw new Exception("Une requête d'action ne peut pas faire l'objet de la méthode MyDB.Consulter()");
             }
             // Création de la commande SQL
             MySqlCommand Commande = CreerCommande(Requete, Valeurs);
             if (!DebuterLecture(Commande, out ConnexionUtilisee))
             {
                 throw new Exception("Aucun objet de lecture n'a pu être créé");
             }
             // Préparation de l'objet représentant l'enregistrement courant
             Enregistrement Enregistrement = new Enregistrement(ConnexionUtilisee.m_Lecteur);
             // Tentative de lecture du premier enregistrement
             if (ConnexionUtilisee.m_Lecteur.Read())
             {
                 // Transfert des valeurs de l'enregistrement courant dans le dictionnaire le représentant
                 Enregistrement.ChargerValeurs(0, ConnexionUtilisee.m_Lecteur);
                 // Terminaison de la lecture avec libération des ressources associées
                 if (ConnexionUtilisee != null)
                 {
                     ConnexionUtilisee.TerminerLecture(this);
                 }
                 // Retour du premier enregistrement lu
                 return(Enregistrement);
             }
             // Terminaison de la lecture avec libération des ressources associées
             if (ConnexionUtilisee != null)
             {
                 ConnexionUtilisee.TerminerLecture(this);
             }
         }
         catch (Exception Erreur)
         {
             /*
              * System.Diagnostics.Debug.WriteLine(string.Format(
              *  "\nMyDB.Consulter({0}, {1}) a échoué (version de récupération du premier enregistrement) :\n{2}\n",
              *  Requete,
              *  string.Join("", Valeurs.Select(Valeur => string.Format(", {0}", Valeur))),
              *  Erreur.Message));
              */
             // Terminaison de la lecture avec libération des ressources associées
             if (ConnexionUtilisee != null)
             {
                 ConnexionUtilisee.TerminerLecture(this);
             }
             // Test de l'état de connexion
             if ((EtatConnexionConnu != EtatConnexion.Perdu) && (!EstConnecte || TesterConnexion()))
             {
                 if (SurErreur != null)
                 {
                     SurErreur(this, MethodeExecutantRequeteSql.Enumerer, Requete, Valeurs, Erreur.Message);
                 }
                 break;
             }
             // En cas de perte de connexion, on tente une fois de se reconnecter
             if (!SeConnecter())
             {
                 if (SurErreur != null)
                 {
                     SurErreur(this, MethodeExecutantRequeteSql.Enumerer, Requete, Valeurs, Erreur.Message);
                 }
                 break;
             }
             // En cas de réussite de la re-connexion, on boucle une seconde fois sur la tentative d'exécution de cette lecture
         }
     }
     // Retour d'un enregistrement "null" afin de représenter l'absence d'enregistrement
     return(null);
 }