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 :

Problème d'insertion de lignes dans une table MySql [Fait]


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut Problème d'insertion de lignes dans une table MySql
    Bonjour,

    J'ai une base de donnée MySql qui contient une table: table1, contenant trois champs: idtab1(int autoincement), attiribut1(varchar), attribut2(varchar).
    et une forme, contenant, textbox1, pour le idtab, textbox2, pour attribut1, et textbox3 pour attribut3.

    Je veux insérer une ligne à travers ces textbox dans ma table, mais, il y a un problème, que je ne sai pas comment résoudre, svp, aidez moi à le résoudre,
    l'erreur, est la suivante: la référence d'objet n'est pas définie à une instance d'un objet.

    et voici 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
    try
                {
                    cnx.ConnectionString = strConn;
     
                    cnx.Open();
                    MessageBox.Show("Connection réussie");
                    string MySQLCmd1 = "SELECT * FROM table1";
                    string MySQLCmd2 = "INSERT INTO table1(idtab1,attribut1,attribut2) VALUES('','?attribut1','?attribut2')";
     
                    MyAdapter.SelectCommand = new MySqlCommand(MySQLCmd1, cnx);
     
                    DataRow tmp = this.ds.Tables["table1"].NewRow();
     
                    tmp["idtab1"] = int.Parse(textBox1.Text);
                    tmp["attribut1"] = textBox2.Text;
                    tmp["attribut3"] = textBox3.Text;
     
                    this.ds.Tables["table1"].Rows.Add(tmp);
                    this.ds.Tables["table1"].AcceptChanges();
     
     
                    MyAdapter.InsertCommand = new MySqlCommand(MySQLCmd2, cnx);
                    this.MyAdapter.InsertCommand.Parameters.Add("attribut1", MySqlDbType.VarChar);
                    this.MyAdapter.InsertCommand.Parameters.Add("attribut2", MySqlDbType.VarChar);
     
                    this.MyAdapter.InsertCommand.Parameters["attribut1"].SourceColumn = "attribut1";
                    this.MyAdapter.InsertCommand.Parameters["attribut2"].SourceColumn = "attribut2";
     
                    this.MyAdapter.Update(this.ds.Tables["table1"]);
                    cnx.Close();
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Problème de connection " + ex.Message);
                }
    Merci infiniment, je commence à en avoir honte , je pose trop de questions sur ce forum. parce que je suis entrain d'apprendre.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Cette erreur signifie qu'une variable que tu manipules est null (non initialisé). Sur quelle ligne l'erreur se produit ?

    D'autre part, il y a un problème dans ton code : tu appelles AcceptChanges avant d'appeler MyAdapter.Update, donc Update ne fait rien parce que les changements dans le DataSet sont déjà acceptés (et ne sont donc plus considérés comme des changements). Pas la peine de faire AcceptChanges explicitement, ce sera fait automatiquement par Update si la propriété AcceptChangesDuringUpdate vaut true (c'est sa valeur par défaut).

    Sinon, plutôt que de créer manuellement la commande INSERT, je te conseille d'utiliser un CommandBuilder :
    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
    try
                {
                    cnx.ConnectionString = strConn;
     
                    cnx.Open();
                    MessageBox.Show("Connection réussie");
                    string MySQLCmd1 = "SELECT * FROM table1";
                    MyAdapter.SelectCommand = new MySqlCommand(MySQLCmd1, cnx);
                    MySqlCommandBuilder builder = new MySqlCommandBuilder(MyAdapter);
     
                    DataRow tmp = this.ds.Tables["table1"].NewRow();
     
                    tmp["idtab1"] = int.Parse(textBox1.Text);
                    tmp["attribut1"] = textBox2.Text;
                    tmp["attribut3"] = textBox3.Text;
     
                    this.ds.Tables["table1"].Rows.Add(tmp);
     
                    this.MyAdapter.Update(this.ds.Tables["table1"]);
                    cnx.Close();
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Problème de connection " + ex.Message);
                }

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    Salut,

    C'est toujours la même chose, l'erreur est mentionné lors de l'exécution de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DataRow tmp = this.ds.Tables["table1"].NewRow();

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par developppez Voir le message
    C'est toujours la même chose,
    Je sais... j'ai proposé une amélioration, mais ça ne corrige pas le problème

    Citation Envoyé par developppez Voir le message
    l'erreur est mentionné lors de l'exécution de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DataRow tmp = this.ds.Tables["table1"].NewRow();
    2 possibilités :
    - soit tu n'as pas initialisé ds, qui vaut alors null
    - soit la table "table1" n'existe pas dans le DataSet : vérifie bien le nom, les majuscules/minuscules sont importantes. Et tu devrais donner à tes tables des noms plus explicites...

  5. #5
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je sais... j'ai proposé une amélioration, mais ça ne corrige pas le problème



    2 possibilités :
    - soit tu n'as pas initialisé ds, qui vaut alors null
    - soit la table "table1" n'existe pas dans le DataSet : vérifie bien le nom, les majuscules/minuscules sont importantes. Et tu devrais donner à tes tables des noms plus explicites...

    Comment savoir si mon dataset est initialisé ou pas, c'est a dire, sur quel propriété doit je vérifier (binding peut etre ).

    et coment vérifier si "table1" existe dans mon dataset ou pas?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par developppez Voir le message
    Comment savoir si mon dataset est initialisé ou pas, c'est a dire, sur quel propriété doit je vérifier (binding peut etre ).
    Ben regarde s'il est null

    Citation Envoyé par developppez Voir le message
    et coment vérifier si "table1" existe dans mon dataset ou pas?
    [/QUOTE]
    il sort d'où ton DataSet ? tu l'as créé avec le designer ? dans ce cas il suffit de regarder dans le designer... Sinon regarde dans la collection ds.Tables

  7. #7
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    j'ai renommé la table mysql en "matable", j'ai réinitialisé ma dataset ds, avec la propriété, tables/ ajouter, tablename= matable: je ne sais pas si comme ça on initialise un dataset ou est ce que je me trompe.
    lorsque j'exécute: je met 11 par exemple dans le textbox de idtab1 et rempli les autres textbox par des chaines de caractères. il m'affiche l'erreur suivante:

    la colonne idtab1 n'appartient pas à la table matable, (sachant, que le champs, idtab1, est de type int auto_increment, not null et primary key)

    si je met rien, l'erreur affichée est: la format de la chaine est incorrecte.

    c'est quoi alors le problème à votre avis?

  8. #8
    Membre habitué Avatar de bobmidou
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 121
    Points : 149
    Points
    149
    Par défaut
    salut

    essaye ça :

    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
     
    try
                {
                    cnx.ConnectionString = strConn;
     
                    cnx.Open();
                    MessageBox.Show("Connection réussie");
                    string MySQLCmd1 = "SELECT * FROM table1";
                    string MySQLCmd2 = "INSERT INTO table1(idtab1,attribut1,attribut2) VALUES('',?attribut1,?attribut2)";
     
                    MyAdapter.SelectCommand = new MySqlCommand(MySQLCmd1, cnx);
     
                    DataRow tmp = this.ds.Tables["table1"].NewRow();
     
                    tmp["idtab1"] = int.Parse(textBox1.Text);
                    tmp["attribut1"] = textBox2.Text;
                    tmp["attribut3"] = textBox3.Text;
     
                    this.ds.Tables["table1"].Rows.Add(tmp);
     
     
     
                    MyAdapter.InsertCommand = new MySqlCommand(MySQLCmd2, cnx);
                    this.MyAdapter.InsertCommand.Parameters.Add("attribut1", MySqlDbType.VarChar);
                    this.MyAdapter.InsertCommand.Parameters.Add("attribut2", MySqlDbType.VarChar);
     
                    this.MyAdapter.InsertCommand.Parameters["attribut1"].SourceColumn = "attribut1";
                    this.MyAdapter.InsertCommand.Parameters["attribut2"].SourceColumn = "attribut2";
     
                    this.MyAdapter.Update(this.ds.Tables["table1"]);
                    this.ds.Tables["table1"].AcceptChanges();
                    cnx.Close();
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Problème de connection " + ex.Message);
                }
    en fait enlèves les apostrophes de '?attribut1' ....et mes ton AccepteChanges() à la fin.
    Bonne chance
    --<< Il n y a que les clous qui ne plantent pas >>---

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par developppez Voir le message
    c'est quoi alors le problème à votre avis?
    Le problème, c'est que je comprends rien à ce que tu fais, et j'ai l'impression que toi non plus...
    Tu as lu ce tuto sur les datasets ?

    Mettons que tu aies une table MySQL "table1" par exemple, avec des colonnes "idtab1", "attribut1", "attribut3". Dans Visual Studio, tu crées un nouveau DataSet que tu appelles par exemple "MonDataSet", dans lequel tu crées une table avec la même structure que ta table MySQL :

    (Attention aux types des colonnes, et n'oublie pas d'indiquer la clé primaire).

    Ensuite, dans ton code, tu manipules une instance de MonDataSet, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDataSet ds = new MonDataSet();
    Et là tu as bien un DataSet avec une table qui s'appelle "table1"...

  10. #10
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    Merci pour le tuto, je l'ai pas vu, mais maintenant, je l'ai...

    en fait je comprend pas trops en ce qui concerne les dataset et l'insertion des données dans une base de donnée my sql à travers l'interface utilisateur.

    Ce que j'essaye de faire, c'est de créer un formulaire, qui sera rempli par l'utilisateur ensuite sauvegardé dans une base de donnée, je suis débutante, j'avance doucement avec mon application, et à chaque fois je découvre quelque chose de nouveau, comme maintenant, les datasets, j'essayerai de faire mieux aprés avoir lu ce tuto, encore merci.

    j'ai vu un peut la documentation du msdn, mais, il n'y a pas un qui détaille, la manipulation de donnée à travers une base de donnée MySql, qu'avec sql server...

    Merci BobMidou, mais c'est toujours le même message d'erreur qui s'affiche.

  11. #11
    Membre habitué Avatar de bobmidou
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 121
    Points : 149
    Points
    149
    Par défaut
    salut

    sans passer par le dataset :

    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
     
    string attr1 = textBox1.Text;
    string attr2 = textBox2.Text;
     
    string MySQLCmd2 = "INSERT INTO table1(idtab1,attribut1,attribut2) VALUES( '' ,'" + attr1 + "','"+ attr2 + "')";
     
    MySqlCommand cmd = new MySqlCommand(MySQLCmd2, cnx);
    if (attr1 == "" || attr2 == "")
    {
          MessageBox.Show("Vous devez remplir tous les champs");
    }
    else
    {
     
         try
         {
             cnx.Open();
             MessageBox.Show("Connection réussie");
     
             int nombre  = cmd.ExecuteNonQuery();
             if (nombre != 0)
            {
                    MessageBox.Show("Un enregistrement a été ajouté");
                    textBox1.Text = "";
                    textBox2.Text = "";
                    textBox1.Focus();
             }
     
             cnx.Close();
     
         }
     
         catch (Exception ex)
         {
                   MessageBox.Show("Problème de connection " + ex.Message);
          }
    }
    --<< Il n y a que les clous qui ne plantent pas >>---

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par bobmidou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "INSERT INTO table1(idtab1,attribut1,attribut2) VALUES( '' ,'" + attr1 + "','"+ attr2 + "')";
    Pitié, pas ça
    Utilise des requêtes paramétrées, c'est beaucoup plus propre et plus sûr !
    http://johannblais.developpez.com/tu...s-donnees/#LIV

  13. #13
    Membre habitué Avatar de bobmidou
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 121
    Points : 149
    Points
    149
    Par défaut
    salut

    t'a raison tomlev c'est juste pour commencer et après il/elle pourra aborder les requêtes paramétrées
    --<< Il n y a que les clous qui ne plantent pas >>---

  14. #14
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    enfin ça commence à se résoudre, merci bobmidou..
    juste il y a un problème avec le premier textbox, c'est a dire, le idtab1, je vais encore le voir et vous informer si je ne peut pas le résoudre. merci

  15. #15
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    Merci, maintenant c'est résolu, il maquait:
    la déclaration de la chaine de connexion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cnx.ConnectionString = strConn;
    et une confusion du textbox1. c'est résolu, merci beauuuuucoup Bobmidou.

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

Discussions similaires

  1. problème d'insertion des objets dans une table(sql)
    Par satinona dans le forum Hibernate
    Réponses: 3
    Dernier message: 10/05/2013, 16h15
  2. Réponses: 2
    Dernier message: 22/06/2010, 15h24
  3. [Oracle] problème d'insertion de données dans une table sous oracle
    Par Zombiman dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/05/2009, 14h58
  4. probléme d'insertion des variables dans une table
    Par moooona dans le forum Installation
    Réponses: 2
    Dernier message: 30/03/2008, 14h08
  5. echec d'insertion de ligne dans une table
    Par foblar dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/07/2006, 10h13

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