コード例 #1
0
ファイル: MyDB.Donnees.cs プロジェクト: Irigana/EICE-Wargame
 /// <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("");
     }
 }
コード例 #2
0
 /// <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));
     };
 }
コード例 #3
0
        /// <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));
        }