/// <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); } } } }
/// <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); }