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

Windows Forms Discussion :

[MySql]Insérer une variable "string" dans une requête SQL


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut [MySql]Insérer une variable "string" dans une requête SQL
    Je commence le C# depuis peu, et la POO, autant vous le dire maintenant, je ne l'utilise pas entièrement...
    Je réalise une appli en ce moment qui comprends ces étapes:

    -ouverture fichier texte
    -récupérations de données spécifiques dans ce fichier
    -affichage de ces données dans un datagridview
    -connexion MySql en entrant les paramètres
    -execution de requetes sql via une TextBox
    -affichage de la requete dans un datagrid relié à un dataset.

    Mon problème numéro 1: mon code est pas très... POO en fait, et je n'arrive pas à bien utiliser les classes et tout...quelqu'un pourrait m'aider un peu?

    Mon problème numéro2: je n'arrive pas à "prendre" les données récupérées du .txt et affichées ds le 1er datagridciew, et automatiquement les mettre ds ma base via "insert into...". Voilà 2 jours plein temps que je suis dessus et impossible d'y arriver...

    mon 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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using MySql.Data;
    using MySql.Data.MySqlClient;
    using System.IO;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            //Variables globales
            string var1, var2, var3, path;
     
            //instanciation de la conenxion et du dataset
            private MySqlConnection Connection = new MySqlConnection();
            private MySqlDataAdapter MyAdapter = new MySqlDataAdapter();
            private DataSet ds = new DataSet();
     
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void PopulateDataGridView()
            {
                // mise en tableau des 3 données
                string[] row0 = { var1, var2, var3 };
                // mise en grid du tableau
                dataGridView1.Rows.Add(row0);
                //dataGridView1.Columns[0].DisplayIndex = 1;
            }
     
            private void btpath_Click(object sender, EventArgs e)
            {
                OpenFileDialog fdlg = new OpenFileDialog();
                fdlg.Title = "Fichier Produits";
                fdlg.InitialDirectory = @"c:\";
                fdlg.Filter = "Fichier Texte | *.txt";
                fdlg.FilterIndex = 2;
                fdlg.RestoreDirectory = true;
                if (fdlg.ShowDialog() == DialogResult.OK)
                {
                    tbpath.Text = fdlg.FileName;
                    path = fdlg.FileName;
                }
            }
     
            private void btlire_Click(object sender, EventArgs e)
            {
                //donne le chemin et le nom du fichier au constructeur StreamReader
                FileStream fs = new FileStream(path, FileMode.Open);
                StreamReader sr = new StreamReader(fs, Encoding.UTF8);
                string ligne;
     
                //lit la première ligne du texte
                ligne = sr.ReadLine();
     
                //continue de lire jusqu'à la fin du fichier
                while (ligne != null)
                {
                    var1 = ""; var2 = ""; var3 = "";
     
                    //on passe à la ligne suivante
                    ligne = sr.ReadLine();
     
     
                    if (ligne == "#CART")
                    {
                        // Boucle de récupération par redondance des intervals de lignes
                        for (int compteur = 0; compteur < 14; ligne = sr.ReadLine(), compteur++)
     
                            switch (compteur)
                            {
                                case 1:
                                    var1 = ligne;
                                    break;
                                case 2:
                                    var2 = ligne;
                                    break;
                                case 13:
                                    var3 = ligne;
                                    break;
                            }
                        // Affichage dans la text box une vérif des données récupérées
                        tbpath.Text += "\t\r  " + var1 + "\t\r  " + var2 + "\t\r  " + var3;
     
                        // Appel de la méthode Populate
                        PopulateDataGridView();
     
                    }
                }
     
                //ferme le fichier
                sr.Close();
                fs.Close();
            }
     
            private void btconnect_Click(object sender, EventArgs e)
            {
                //Reset de la ConnectionString
                string ConnnectionStr = String.Empty;
     
                if ((tbhote.Text.Length == 0) || (tbbase.Text.Length == 0) || (tblogin.Text.Length == 0))
                {
                    //Message d'erreur si champs non remplis
                    MessageBox.Show("Erreur, les champs Hôte, Base et Login doivent être remplis", "Erreur",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
    			{
    				// On définit la chaine de connexion
    			 ConnnectionStr = "Database=" + tbbase.Text + ";Data Source=" + tbhote.Text + ";User=" + tblogin.Text + ";Password=" + tbpwd.Text;
    			}
     
                Connection.ConnectionString = ConnnectionStr;
     
                try
                {
                    // On ouvre la connexion
    				Connection.Open();
                }
                catch (MySqlException Ex)
                {
                    MessageBox.Show("Erreur SQL:\n" + Ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
     
                    MessageBox.Show("Vous êtes maintenant connecté à la Base de Données " + tbbase.Text + ". Vous pouvez désormais éxécuter vos requêtes SQL!", "Connexion Réussie!", MessageBoxButtons.OK);
                    MessageBox.Show("Si vous n'éxécutez pas de requêtes SQL, n'oubliez pas de vous DECONNECTER de la base!", "ATTENTION ! ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
     
            private void execsql_Click(object sender, EventArgs e)
            {
                // On définit la requête SELECT à exécuter
                string MySQLCmd = tbsql.Text;
     
                // On associe cette requête à la propriété SelectCommand du MySqlDataAdapter
                MyAdapter.SelectCommand = new MySqlCommand(MySQLCmd, Connection);
     
                // On remplit le dataset avec le résultat de la commande SELECT
                MyAdapter.Fill(ds);
     
                // On affiche le datagrid
                dataGrid1.DataSource = ds.Tables[0];
                dataGrid1.Refresh();
     
                // On ferme la connexion le plus tôt possible
                Connection.Close();
            }
     
            private void btclear_Click(object sender, EventArgs e)
            {
                ds.Clear();
            }
     
            private void btdeconnect_Click(object sender, EventArgs e)
            {
                // On ferme la connexion le plus tôt possible
                Connection.Close();
            }
     
        }
    }
    Merci de m'aider un peu svp...je coince là! :s
    Défenseur de l'Apéro Social

  2. #2
    Membre actif
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Points : 283
    Points
    283
    Par défaut
    Pour le pb n°1 je ne vois pas vraiment ta question.
    Pour le pb N°2: pour pouvoir mettre "automatiquement" les données dans ta base je pense que tu devrais créer une datatable en mémoire puis à partir de cette datatable faire un update dans ta base, mais ton pb n'est pas très clair alors si ma solution ne convient détail un peu plus STP

  3. #3
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Merci, alors je vais essayer d'éclaircir mon (mes) problèmes!

    Alors voilà, j'ai un code qui tient dans une page, et je n'utilise pas de classes du tout...quelqu'un m'a dit que un langage OO sans utiliser les classes c'était comme un vélo sans pédales...Donc j'aimerais savoir comment je pourrais faire pour améliorer ce point.

    D'autre part mon 2e problème est le suivant:

    j'ai un windows form tel que ceci:

    ***************************************
    A GAUCHE:
    [une textbox pour insérer requêtes SQL]
    [un datagridview relié au dataset affichant le résultat des requête]

    A DROITE:
    [une textbox avec la selection du chemin du fichier texte]
    [un bouton "lire" permettant de trier et de récupérer que certaines données pour les afficher dans le via une datatable datagridview2]
    [un datagridview2]
    ****************************************

    Je voudrais qu'une fois affichés, ces données, en cliquant sur un bouton, soit insérées dans la base de donnée directement avec un "insert into".

    C'est possible comme j'ai fait, ou il faut changer/rajouter quelque chose?

    Merci de ta réponse quand même!
    Défenseur de l'Apéro Social

  4. #4
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Pour ton premier problème, le mieux est de séparer ton projet en plusieurs couches :
    une couche de présentation et une couche d'accès au données minimum

    Donc tu va laisser ta windows form comme elle est, mais tout ce qui touche à l'accès au données, tu va l'encapsuler dans une classe qui contiendra des méthodes publiques te permettant de récupérer les données voulues.

    Si tu veux plus de renseignements, et de meilleur exemple, lit cet article : http://jab.developpez.com/tutoriels/dotnet/mvppattern/
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  5. #5
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Merci pour le lien! Je m'y met tout de suite pour régler ce problème et résoudre aussi mes nombreux bidouillages avec l'accessibilité des variables, etc.

    Après personne pour m'aider sur mon deuxième problème, voilà ce que j'ai encore essayer:

    j'ai casé ça dans la méthode de remplissage de mon datagridview qui relève les donéne du .txt...
    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
     
    private void PopulateDataGridView()
            {
                // mise en tableau des 3 données
                string[] row0 = { var1, var2, var3 };
                // mise en grid du tableau
                dataGridView1.Rows.Add(row0);
                dataGridView1.Columns[0].DisplayIndex = 1;
                row = row0;
                string InsertCmd = "INSERT INTO Produits (Reference, Designation) VALUES (@refer, @des)";
     
                MyAdapter.SelectCommand.Parameters.AddWithValue("@refer", row[0]);
                MyAdapter.SelectCommand.Parameters.AddWithValue("@des", row[1]);
     
                MySqlParameter refer = new MySqlParameter("@refer", MySqlDbType.String, 30);
                MySqlParameter des = new MySqlParameter("@des", MySqlDbType.String, 30);
     
                MyAdapter.SelectCommand = new MySqlCommand(InsertCmd, Connection);
     
                MyAdapter.SelectCommand.ExecuteNonQuery();
                MyAdapter.SelectCommand.Parameters.Clear();
     
                Connection.Close();
            }
    Défenseur de l'Apéro Social

  6. #6
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Je ne comprends pas ce que tu veux faire avec ton DataGridView.

    Tu veux le remplir avec les données qu'il y a dans ton fichier .txt ?

    Sous quel format sont tes données ?

    Pour le remplir, cherche du côté de sa propriété DataSource, et comme l'a dit Herlece, le mieux serait de créer une DataTable dierctement avec les données de ton fichier texte.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  7. #7
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    En clair le datagridview ne sert que de controle, on regarde et on vérifie que les données récupérées sont les valides, qu'il ya pas d'erreurs, et après on clic sur un bouton, et ces données (qui sont stockées dans un string[3]) sont insérées dans une requete INSERT INTO, et la requete éxecutée...
    Défenseur de l'Apéro Social

  8. #8
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Donc tu arrive à bien remplir ton DataGridView ?

    Pour l'insertion, ce que tu fait devrais marcher, mais en tout cas ça ne sert à rien de déclarer tes paramètres si tu ne les utilise pas par la suite.

    Regarde l'exemple suivant, ça devrais t'aider :
    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
     
    SqlCommand cmd = new SqlCommand(maConnection);
     
    string sql = "select idsalarie from salarie where nom = @nom";
    cmd.CommandType = Text;
    cmd.CommandText = sql;
    DbParameter param = cmd.CreateParameter();
    param.ParameterName = "@nom";
    param.DbType = DbType.String;
    param.Value = "scott";
     
    cmd.Parameters.Add(param);
     
    int idSalarie = -1;
    object result = cmd.ExecuteScalar();
    if(result != null)
          idSalarie = Convert.ToInt32(result);
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  9. #9
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Le datagridview se remplit niquel, il met par exemple 3 lignes avec chacune 3 données. En fait avec la boule, des qu'il tombe sur le mot-clé, il récupère 3 données, et vu qu'il y a plusieurs fois le mot clé dans les .txt, cela fera plusieurs lignes de données. Et dès qu'il récupère 3 données (une ligne), je veux qu'il me mette les données dans la database en cliquant sur un bouton. Seulement, mon utilisation de variables qui contiennent les données ne marchent pas dans ma requête. Ou la requête ne s'effectue pas... Et je trouve pas pourquoi...

    Je vais réessayer en refaisant exactement ce que tu m'as donné comme exemple.

    Merci!
    Défenseur de l'Apéro Social

  10. #10
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Niquel, j'ai utilisé les paramètres de l'exemple ci dessous:

    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
     
    using (SqlConnection conn = new SqlConnection(connectionString))
     
    {
     
    //Préparation des paramètres
     
    SqlParameter paramID = new SqlParameter("@id", SqlDbType.Int);
     
    paramID.Value = 10;
     
    SqlParameter paramText = new SqlParameter("@text", SqlDbType.VarChar,50);
     
    paramText.Value = "Ceci est un test";
     
    SqlParameter paramDate = new SqlParameter("@date", SqlDbType.DateTime);
     
    paramDate.Value = DateTime.Now;
     
    SqlParameter paramFloat = new SqlParameter("@float", SqlDbType.Float);
     
    paramFloat.Value = 12.2;
     
     
    //Préparation de la commande
     
    String sql = string.Format("INSERT INTO TableTest(Id, Text, DateAndTime, FloatNumber) VALUES({0},{1},{2},{3})",
     
    paramID.ParameterName, paramText.ParameterName,
     
    paramDate.ParameterName, paramFloat.ParameterName);
     
    SqlCommand cmd = new SqlCommand(sql.ToString(), conn);
     
     
    //Ajout des paramètre à la commande
     
    cmd.Parameters.Add(paramID);
     
    cmd.Parameters.Add(paramText);
     
    cmd.Parameters.Add(paramDate);
     
    cmd.Parameters.Add(paramFloat);
     
    //Ouverture de la connection et exécution de la commande
     
    conn.Open();
     
    cmd.ExecuteNonQuery();
     
    }
    Aucun souci, tout marche!
    Défenseur de l'Apéro Social

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération de la valeur d une variable elle même contenue dans une variable
    Par guiplongeur dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/03/2015, 16h23
  2. Réponses: 2
    Dernier message: 14/05/2014, 10h23
  3. Réponses: 3
    Dernier message: 13/12/2009, 17h04
  4. Réponses: 1
    Dernier message: 17/01/2007, 21h52

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