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 :

Récupération des valeurs de textboxs dans une chaîne de connexion à une base de données


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Récupération des valeurs de textboxs dans une chaîne de connexion à une base de données
    Bonjour,
    Je développe actuellement une appli Windows Form en C# avec Visual Studio 2012, en utilisant l'architecture 3 tiers et je rencontre des problèmes lors de la connexion à la base de données.
    J'aimerais que l'utilisateur puisse se connecter à une base de données en indiquant lui même dans des textbox le nom de la base, son adresse ip, l'utilisateur et le mot de passe; ces valeurs étant récupérées dans des variables que j'utilise dans la chaîne de connexion de la couche d'accès aux données. Seulement, après avoir rempli les textbox, une erreur disant "Unable to connect to any of the specified Mysql Hosts", m'est renvoyée ...

    Dans la couche d'accès aux données j'ai ce 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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    public class CAD
        {
            private MySqlCommand oCMD;
            private MySqlDataAdapter oDA;
            private DataSet oDS;
     
            private string cnxAutre;
            private MySqlConnection oCNXautre;
            public string nomBdd;
            public string ipBdd;
            public string userIdBdd;
            public string pswBdd;
     
            public CAD(string nomBdd, string ipBdd, string userIdBdd, string pswBdd)
            {
                this.nomBdd = nomBdd;
                this.ipBdd = ipBdd;
                this.userIdBdd = userIdBdd;
                this.pswBdd = pswBdd;
            }
     
     
            // paramètrage connexion à la bdd 
            public CAD() 
            {
                this.cnxAutre = @"Database='" + nomBdd + "';server='" + ipBdd + "';User Id='" + userIdBdd + "';Password='" + pswBdd + "';Command Timeout=28800";
                this.oCNXautre = new MySqlConnection(this.cnxAutre);
     
                this.oCMD = new MySqlCommand();
                this.oDA = new MySqlDataAdapter();
            }
     
            //méthode permettant la lecture des données dans la bdd         
    public System.Data.DataSet m_GetRows(string rq_sql, string rows_name)
            {
                try
                {
                    this.oDS = new DataSet();
                    this.oCMD.Connection = this.oCNXautre;
                    this.oCMD.CommandText = rq_sql;
                    this.oDA.SelectCommand = this.oCMD;
                    this.oDA.Fill(this.oDS, rows_name);
     
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show(e.Message);
                }
                return this.oDS;
            }
     
            public string NomBdd
            {
                get { return nomBdd; }
                set { nomBdd = value; }
            }
            public string IpBdd
            {
                get { return ipBdd; }
                set { ipBdd = value; }
            }
            public string UserIdBdd
            {
                get { return userIdBdd; }
                set { userIdBdd = value; }
            }
            public string PswBdd
            {
                get { return pswBdd; }
                set { pswBdd = value; }
            }
     
     
        }
    }
    Et dans la couche utilisateur, donc le code du formulaire, j'ai ceci :

    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
     
    public partial class Form1 : Form
        {
            private DataSet res;
            private Pcs_Selectionner oPcsSelectionner;
            private string dateDebut;
            private string dateFin;
            private System.Windows.Forms.SaveFileDialog saveFileDialog2;
     
            public CAD cad1;
     
            public Form1(string dateDebut, string dateFin, DataSet res, CAD cad1)
            {
                InitializeComponent();
                res = new DataSet();
                this.res = res;
                oPcsSelectionner = new Pcs_Selectionner();
                this.dateDebut = dateDebut;
                this.dateFin = dateFin;
     
                cad1 = new CAD(textBox_bddNom.Text, textBox_bddIP.Text, textBox_bddUserId.Text, textBox_bddPsw.Text);
            }
     
            public Form1()
            {
                InitializeComponent();
     
            }
     
    private void btn_Ok_Click(object sender, EventArgs e)
            {
                if (textBox_bddNom.Text == "" || textBox_bddIP.Text == "" || textBox_bddUserId.Text == "" || textBox_bddPsw.Text == null)
                    {
                        MessageBox.Show("Veuillez compléter tout les champs", "Attention");
                    }
                else 
                {
                    CAD cad1 = new CAD(); 
                    cad1.nomBdd = textBox_bddNom.Text;
                    cad1.ipBdd = textBox_bddIP.Text;
                    cad1.userIdBdd = textBox_bddUserId.Text;
                    cad1.pswBdd = textBox_bddPsw.Text;
                }
     
            }
    Je suppose que le problème vient du fait que les valeurs dans les textbox ne sont pas récupérées correctement dans la chaîne de connexion mais ayant passé plusieurs heures sur ce problème je n'arrive plus à prendre le recul nécessaire, je ne vois pas quelle peut être la solution. Peut être un regard neuf pourrait-il y voir plus clair !

    Merci d'avance pour toute l'aide que vous pourrez m'apporter !

  2. #2
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Je n'ai pas de MySQL et encore moins la lib qui va bien pour tester.
    Cependant je vais te faire quelques remarques sur ton code :

    - Comme à chaque fois que je vois un code qui joue avec une base de données je rappel qu'il faut utiliser un using sur tous les objets disposables. C'est le cas des connections, des adapters, des commands, des readers, des streams, etc...

    - Quand on ne peut pas faire de using directement pour une raison X ou Y, on doit faire en sorte que le Dispose de ces objets soient appelé. Soit en passant par un Try/Finally, soit en implémentant IDisposable sur la classe qui gère ces objets.

    - Inutile de faire une chaine verbatim (@"") si elle ne contient pas de retour à la ligne ou ce genre de chose. De plus, si tu fais @"..." + variable + "...", la seconde chaine n'est pas verbatim.

    - On ne doit jamais faire de comparaison de chaine via ==. La sémantique de cette comparaison n'est pas tout à fait claire et peut ça peut poser des problèmes notamment dans le cas d'une conversion vers un autre langage tel que le VB.Net (et je fais suffisamment de conversion de ce type pour dire que si, ça arrive, alors qu'on ne l'avait pas prévu). Il faut donc utiliser String.Compare ou String.CompareOrdinal, en spécifiant le paramètre qui régit le type de comparaison (binaire, dépendant de la culture, case sensitive/insensitive).

    - Pour vérifier qu'une chaine est vide il vaut mieux utiliser String.IsNullOrEmpty, car si variable = null, alors le test variable == "" est faux, les cas où on veut vraiment faire une différence entre null et String.Empty sont très rares.

    - Je déconseil fortement l'usage d'une autre langue que l'anglais dans le choix des noms de classe/variables/méthodes, pour la simple et bonne raison que tout le framework standard et la très très très grande majorité des libs/framework sont en anglais. Donc tu ponctues ton code et mot français au milieu d'un océan d'anglais. Résultat quand tu cherches une variable, une méthodes, etc... tu cherches naturellement un truc en anglais, et si tu ne trouves pas tu vas partir du principe que ça n'existe pas, donc tu vas le créer, sauf que ton collègue l'a déjà créé hier mais nommé en français, pas de bol et bonjour la duplication de code.

    - Une connexion ça s'ouvre avant d'exécuter des commandes, il manque donc le .Open()

    - Visite le site http://www.connectionstrings.com/mysql/ pour t'assurer que ta chaine de connexion est bien la bonne, ce qui ne semble pas être le cas.

    - Pour vérifier si les valeurs des textboxs sont bien récupérés il te suffit d'utiliser le debugger. Tu mets un point d'arrêt sur la ligne 28 de ton premier code (juste après avoir construit la chaine de connexion donc) et tu place un espion sur la variable afin de connaitre sa valeur, tu verras alors si elle est bien construite avec les bonnes valeurs.

    - La construction d'une chaine de connexion en placant directement les valeurs dans la chaine à coup de concaténation est une faille de sécurité importante permettant de faire de l'injection. Dans ton cas un attaquant peut remplacer demander à ton soft d'activer des options que tu ne voudrais pas, ou demander une connexion SSPI par exemple.

    - Les règles de nommage standards du .Net sont grosso modo :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MyClass
    {
        private string _MyVar;
     
        public string MyProp { get; set;}
     
        public void MyMethod(string firstParameter)
        {
            int scopedVariable = 12;
        }
    }
    Je dis ça vis à vis des m_ et autre trucs qui trainent. Bien évidemment rien ne t'oblige à les suivre, mais plus tu t'en rapproche plus ce sera lisible pour tout le monde.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @"Database='" + nomBdd + "';server='" + ipBdd + "';User Id='" + userIdBdd + "';Password='" + pswBdd + "';Command Timeout=28800";
    Je vois des simple et des bouble quote c'est normal ? Je me souviens pas qu'il est ceci dans les chaînes de connexion

    Moi mes chaînes de connexion sous cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "DATA SOURCE=TEST;PASSWORD=pass;PERSIST SECURITY INFO=True;USER ID=NOM_SCHEMA"
    Mais bon moi c'est pour des bases Oracle, je ne sais pas si ça change quelque chose à ce niveau.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Les conseils de ctxnop sont très bons à prendre.

    Citation Envoyé par ctxnop Voir le message
    ...
    - Pour vérifier qu'une chaine est vide il vaut mieux utiliser String.IsNullOrEmpty, car si variable = null, alors le test variable == "" est faux, les cas où on veut vraiment faire une différence entre null et String.Empty sont très rares.
    J'ajouterai aussi que si tu es en Framework version 4 ou plus il y a aussi une méthode String.IsNullOrWhiteSpace qui permet de vérifier si en plus la chaîne ne contient que des caractères non significatifs tels que des espaces, des tabulations,...

    Citation Envoyé par ctxnop Voir le message
    ...
    - Une connexion ça s'ouvre avant d'exécuter des commandes, il manque donc le .Open()
    Il me semble que lorsqu'un DbDataAdapter est utilisé, il ouvre la connexion sous-jacente au moment du "Fill" ou du "Update" si elle n'est pas déjà ouverte. Cela dit, dans tous les cas, il vaut toujours mieux ouvrir soi-même la connexion pour être sûr...

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/11/2012, 20h30
  2. Réponses: 6
    Dernier message: 29/03/2011, 19h38
  3. Récupération des valeurs d'input dans iframe par $_POST
    Par corentinparent dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 26/11/2010, 18h43
  4. convertir une chaîne unicode en une chaîne ascii
    Par kawther dans le forum MATLAB
    Réponses: 4
    Dernier message: 09/09/2009, 15h50
  5. Récupération des valeurs de TextBox sur la Main Form
    Par Ttchaouse dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/07/2007, 12h07

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