/// <summary> /// Permet de formater une requête SQL en injectant de manière sécurisée les valeurs de ses parties variables /// </summary> /// <param name="Requete">Requête SQL</param> /// <param name="Valeurs">Valeurs des parties variables de la requête</param> /// <returns>Requête SQL après injection</returns> public static string FormaterEnSql(string Requete, params object[] Valeurs) { try { return(string.Format(Requete, Valeurs.Select(Valeur => ValeurEnSql(Valeur)).ToArray())); } catch (Exception Erreur) { System.Diagnostics.Debug.WriteLine(string.Format( "\nMyDB.FormaterEnSql({0}{1}) a échoué :\n{2}\n", Requete, string.Join("", Valeurs.Select(Valeur => string.Format(", {0}", Valeur))), Erreur.Message)); return(""); } }
/// <summary> /// Constructeur par défaut /// </summary> public GMBD() { m_BD = new MyDB("iziel_connector", "wJ9VFDrH", "iziel_warhammer", "mysql-iziel.alwaysdata.net"); m_BD.SurErreur += (ConnexionEmettrice, MethodeEmettrice, RequeteSql, Valeurs, MessageErreur) => { System.Diagnostics.Debug.WriteLine(string.Format("\nERREUR SQL :\nMéthode : {0}\nRequête initiale : {1}\nValeurs des {2} parties variables : {3}\nRequête exécutée : {4}\nMessage d'erreur : {5}\n", MethodeEmettrice, RequeteSql, (Valeurs != null) ? Valeurs.Length : 0, ((Valeurs != null) && (Valeurs.Length >= 1)) ? "\n* " + string.Join("\n* ", Valeurs.Select((Valeur, Indice) => string.Format("Valeurs[{0}] : {1}", Indice, (Valeur != null) ? Valeur.ToString() : "NULL")).ToArray()) : string.Empty, MyDB.FormaterEnSql(RequeteSql, Valeurs), MessageErreur)); }; }
/// <summary> /// Permet d'exécuter une requête d'action /// </summary> /// <param name="Requete">Requête SQL à exécuter (doit être de type INSERT, UPDATE ou DELETE)</param> /// <param name="Valeurs">Valeurs des parties variables</param> /// <returns>Objet décrivant le résultat de l'opération</returns> public IResultatExecution Executer(string Requete, params object[] Valeurs) { string MessageErreur = string.Empty; 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 d'action if (EstRequeteConsultation(Requete)) { throw new Exception("Une requête de consultation ne peut pas faire l'objet de la méthode MyDB.Executer()"); } // Création d'une nouvelle connexion si il y a une lecture en cours if (EstEnCoursDeLecture) { ConnexionUtilisee = new MyDB(this); if (!ConnexionUtilisee.EstConnecte) { throw new Exception("Aucune nouvelle connexion n'a pu être établie vers le serveur MySql"); } } else { ConnexionUtilisee = this; } // Création de la commande SQL MySqlCommand Commande = ConnexionUtilisee.CreerCommande(Requete, Valeurs); int NombreEnregistrementsAffectes = Commande.ExecuteNonQuery(); if (EstRequeteInsertion(Requete)) { if (ConnexionUtilisee != this) { ConnexionUtilisee.Dispose(); } return(new ResultatExecution(NombreEnregistrementsAffectes, Commande.LastInsertedId)); } else { if (ConnexionUtilisee != this) { ConnexionUtilisee.Dispose(); } return(new ResultatExecution(NombreEnregistrementsAffectes)); } } catch (Exception Erreur) { System.Diagnostics.Debug.WriteLine(string.Format( "\nMyDB.Executer({0}, {1}) a échoué :\n{2}\n", Requete, string.Join("", Valeurs.Select(Valeur => string.Format(", {0}", Valeur))), Erreur.Message)); if ((ConnexionUtilisee != null) && (ConnexionUtilisee != this)) { ConnexionUtilisee.Dispose(); } // Sauvegarde du message d'erreur au cas où il faudrait le retourner MessageErreur = Erreur.Message; // 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 } } return(new ResultatExecution(MessageErreur)); }