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 :

DataSet et Datatable


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut DataSet et Datatable
    Bonjour à tous.

    Je suis en ce moment en plein dans le buchage d'un pdf fait par un membre de votre équipe. Tuto intéressant et complet qui plus est.

    Cependant j'ai quelques questions de bases. Si mon topic est mal placé, j'en suis désolé (je ne suis pas sur d'être au bon endroit pour demander cela)

    Voici mon problème : Comme conseillé par tomlev & co, je me mets à créer une datatable. La structure de cette dernière est terminé (définition des types des colonnes).

    Ma question est la suivante :
    Comment relier le dataset à la datatable ?
    Comment relier le contenu du datatable à un datagridview ?
    Comment remplir (et donc créer les lignes "automatiquement") mon datatable avec une requête mysql ?


    Je sais, c'est le béaba ce que je vous demande la, mais après avoir ingérer par mal d'infos sur les tutos que j'ai lu, je suis un peu paumé.

    Merci de me renseigner si vous en avez la patience

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Points : 299
    Points
    299
    Par défaut
    Comment relier le dataset à la datatable ?
    dataTable = dataSet.Tables[0]; //index ou nom de la table si tu as plusieurs tables utilises le nom
    Comment relier le contenu du datatable à un datagridview ?
    dataGridView1.DataSource = dataSet.Tables["Clients"].DefaultView;

    Comment remplir (et donc créer les lignes "automatiquement") mon datatable avec une requête mysql ?
    il faut dans creer les requetes qui vont bien dans ton dataadapter Exemple (pas de moi , mais d'un livre)

    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
     private void InitializeCommands()
          {
     
             // Reuse the SelectCommand's Connection.
             SqlConnection connection = 
               (SqlConnection) dataAdapter.SelectCommand.Connection;
     
             // Create an explicit, reusable insert command
             dataAdapter.InsertCommand = connection.CreateCommand();
             dataAdapter.InsertCommand.CommandText = 
             "Insert into customers " +
                "(CustomerId, CompanyName, ContactName, ContactTitle, " +
                " Address, City, PostalCode, Phone) " +
                "values(@CustomerId, @CompanyName, @ContactName, " +
                "   @ContactTitle, @Address, @City, @PostalCode, @Phone)";
             AddParms(dataAdapter.InsertCommand, 
               "CustomerId", "CompanyName", "ContactName", "ContactTitle", 
               "Address", "City", "PostalCode", "Phone");
     
             // Create an explicit update command
             dataAdapter.UpdateCommand = connection.CreateCommand();
             dataAdapter.UpdateCommand.CommandText = "update Customers " +
               "set CompanyName = @CompanyName where CustomerID = @CustomerId";
             AddParms(dataAdapter.UpdateCommand, "CompanyName", "CustomerID");
     
             // Create an explicit delete command
             dataAdapter.DeleteCommand = connection.CreateCommand();
             dataAdapter.DeleteCommand.CommandText = 
               "delete from customers where customerID = @CustomerId";
             AddParms(dataAdapter.DeleteCommand, "CustomerID");
          }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    Ok merci jvais avancer avec ca

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    bonjour à tous, voici mes avancées :

    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
     
     
    #region définition datatable et on les relie au dataset
    DataTable produit = new DataTable();
    produit.Columns.Add("CODE_CIP_PRODUIT", typeof(String));
    produit.Columns.Add("NOM_PRODUIT", typeof(String));
    produit.Columns.Add("MONTANT_TVA", typeof(String));
    produit.Columns.Add("QUANTITE", typeof(String));
     
    ds.Tables.Add(produit);
     
    DataTable prix_achat_admin = new DataTable();
    prix_achat_admin.Columns.Add("PRIX", typeof(Double));
     
    ds.Tables.Add(prix_achat_admin);
    #endregion
     
    MySQLDriverCS.MySQLConnection conn = new MySQLDriverCS.MySQLConnection(new MySQLDriverCS.MySQLConnectionString("").AsString);
    MySQLDriverCS.MySQLDataAdapter MyAdapter = new MySQLDriverCS.MySQLDataAdapter("SELECT CODE_CIP_PRODUIT, NOM_PRODUIT, MONTANT_TVA FROM produit", conn);
    MySQLDriverCS.MySQLDataAdapter MyAdapter2 = new MySQLDriverCS.MySQLDataAdapter("SELECT PRIX FROM prix_achat_admin", conn);
     
    conn.Open();
    MyAdapter.Fill(produit);
    conn.Close();
     
    dataGridView1.DataSource = ds;
    dataGridView1.DataMember = ds.Tables["produit"].TableName;
     
    conn.Open();
    MyAdapter2.Fill(prix_achat_admin);
    conn.Close();
     
    dataGridView2.DataSource = ds;
    dataGridView2.DataMember = ds.Tables["prix_achat_admin"].TableName;
    Voici mon soucis, Lors de l'exécution de ce code ci dessus, le logiciel plante. Je pense que c'est à cause des type des colonnes des tables produits et prix_achat_admin.

    En effet, les types de correspondent pas. PAr exemple la colonne CODE_CIP_PRODUIT dnasl a vbase de données n'est pas un string mais un varchar(32) ect...
    Je pensais que le string prendrait sans broncher le type varchar...

    VOici ma question, comment faire pour convertir la données en string (c'est un exemple, ca peut etre un In32 ou autre..) ?

    Voila merci de votre réponse

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    Alors, il suffit de demander pour trouver immédiatement la solution... Je poste la solution pour les personnes éventuellement intéressées

    LeS problèmeS étaiENT :

    * Les mauvais types dans la création des colonnes. Solution : On ne met aucun type, le logiciel fait le reste (fallait y penser ...)
    * J'ai cette instruction qui bloquait : ds.Tables["produit"].TableName;. Solution : Au lieu de mettre le nom de la table, je mets son index.


    Voila.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 614
    Points : 299
    Points
    299
    Par défaut
    Je me permet une remarque:
    L'index c'est bien quand tu n'as qu'une seule table mais lorsque tu en as ne serait ce que 5 tables tu es vite perdu.
    La syntaxe (qui marche) est celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataTable = dataSet.Tables["Prospect"];
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ds.Tables["produit"].TableName

    Bon courage

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    ah parfait jte remercie de la précision

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    bonjour à tous!

    J'avance grandement dans la compréhension du datatable. Une fois essayé, je dois même dire que c'est adopté. C'est plus "naturel" de faire ce cette manière.

    Bref, voici mon avancement :

    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
     
      #region définition datatable et on la relie au dataset
     
                    DataTable produitfinal = new DataTable();
                    produitfinal.Columns.Add("CODE_CIP_PRODUIT");
                    produitfinal.Columns.Add("NOM_PRODUIT");
                    produitfinal.Columns.Add("PRIX");
                    produitfinal.Columns.Add("MONTANT_TVA");
                    produitfinal.Columns.Add("QUANTITE");
                    produitfinal.Columns.Add("MONTANT_LIGNE");
                    ds2.Tables.Add(produitfinal);
                    #endregion
     
    conn.Open();
     
                for (int i = 0; i < ds2.Tables[0].Rows.Count -1; i++)
                {
                    DataGridViewCheckBoxCell maCell = new DataGridViewCheckBoxCell();
                    maCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[i].Cells[0];
     
                    if (maCell.FormattedValue.Equals(true))
                    {
                        string temp = dataGridView1.Rows[i].Cells[1].Value.ToString();
                        int temp2 = Int32.Parse(temp);
     
                        MySQLDriverCS.MySQLDataAdapter MyAdapter2 = new MySQLDriverCS.MySQLDataAdapter("SELECT CODE_CIP_PRODUIT, NOM_PRODUIT, PRIX, MONTANT_TVA FROM produit, prix_achat_admin WHERE produit.ID_PRODUIT=prix_achat_admin.ID_PRODUIT AND CODE_CIP_PRODUIT = " + temp2 + " AND prix_achat_admin.ID_TYPE_ACHAT = " + type_prix, conn);
                        MyAdapter2.Fill(produitfinal);
     
                        dataGridView2.DataSource = ds2;
                        dataGridView2.DataMember = ds2.Tables[1].TableName;
     
                        add_qte ad = new add_qte();
                        ad.ShowDialog();
     
                        string valeur_quantite = ad.TexteSaisi;
     
                        DataRow[] produitfinal_row = ds2.Tables[1].Select("CODE_CIP_PRODUIT=" + temp2);
                        produitfinal_row[i]["QUANTITE"] = valeur_quantite;
     
                        string prix_htstring = produitfinal_row[i]["PRIX"].ToString();
                        string tva_string = produitfinal_row[i]["MONTANT_TVA"].ToString();
     
                        prix_htstring = prix_htstring.Replace('.',',');
                        tva_string = tva_string.Replace('.',',');
     
     
                        double prix_ht = Double.Parse(prix_htstring);
                        double tva = Double.Parse(tva_string);
                        double qte = Double.Parse(valeur_quantite);
                        double ttc = (prix_ht / (1 - (tva / 100)))* qte;
     
                        string ttcstring;
                        ttcstring = ttc.ToString();
                        ttcstring = ttcstring.Remove(5);
     
                        produitfinal_row[i]["MONTANT_LIGNE"] = ttcstring;
    Bien entendu, il y a un problème !
    J'explique. Ce code me permet de retrouver une ligne dans une table d'un serveur à distance. Je place le résultat dans le datatable. Par la suite, je place des valeurs dans deux colonnes du datatable et je travaille dessus. Mon souhait est de faire cette opération plusieurs fois de suite.

    La première fois, aucun problème ! Tout fonctionne parfaitement. La seconde fois par contre, ca plante, voici le message d'erreur :

    l'index se trouve en dehors des limites du tableau
    Ma question est la suivante ? Ou est mon erreur ? Est ce que je dois créer une nouvelle ligne dans mon datatable pour qu'il prenne en compte le résultat ou le fait-il automatiquement ?

    Voila, désolé de vous demandez de faire un débuggage de ce code, mais à vrai dire, je n'ai pas d'autre solution

    Merci de vos éventuels réponses

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    désolé de revenir à la charge mais je n'arrive toujours pas a comprendre mon problème. En mode débug, il me dit que c'est cette ligne qui bug :
    produitfinal_row[i]["QUANTITE"] = valeur_quantite;

    C'est donc l'index qui plante je suppose, mais je n'arrive pas trouvé une solution viable.

    BIen à vous ^^

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 453
    Points : 1 764
    Points
    1 764
    Par défaut
    salut,
    Je n'utilises pas les datatable comme celà donc ma réponse est théorique :
    tu es sur que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ds2.Tables[1].Select("CODE_CIP_PRODUIT=" + temp2)
    te retourne plus d'une ligne? Ton select te retourne au maximun le même nombre de lignes que dans ds2 et donc tu peux te retrouver avec une valeur de i supérieure à celle du nombre de lignes retournées par ton select.

    Pas sur d 'être très clair

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    Lol en effet j'ai un peu de mal. Imagine que le CIP soit une clé primaire dans cette table. Jsuis sur en effet que cet requete fonctionne.

    Je te remercie tout de même de t'être penché sur mon cas

  12. #12
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 453
    Points : 1 764
    Points
    1 764
    Par défaut
    bah je maintiens mon charabia si il s'agit de la clé primaire. Par contre si c'est une clé secondaire c'est pas la même histoire.

    avant la ligne qui plante regarde ce que vaut la valeur : produitfinal_row.Length.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    la taille de produitfinal_row est de 1..... Alors, c'est grave docteur ?

  14. #14
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 453
    Points : 1 764
    Points
    1 764
    Par défaut
    bah si la taille vaut 1 :
    produitfinal_row[i] n'exista pas quand i > 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    produitfinal_row[0]["QUANTITE"] = valeur_quantite;
     
    string prix_htstring = produitfinal_row[0]["PRIX"].ToString();
    string tva_string = produitfinal_row[0]["MONTANT_TVA"].ToString();

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    ca ne marche pas non plus erreur :
    L'index se trouve en dehors des limites du tableau

    plus je m'avance dans ce problème, moins je comprends

    Bon en même temps il y a un mieux, je peux choisir plusieurs produits la premiere fois.
    Je m'explique :

    Je peux choisir un ou plusieurs produits, autant de fois que je le souhaite. Avant, je pouvais en choisir qu'un seul, sinon ca plantait, et qu'une seule fois.
    Maintenant je peux en choisir un ou plusieurs, mais qu'une fois.

  16. #16
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 453
    Points : 1 764
    Points
    1 764
    Par défaut
    bon bah là je peux plus t'aider
    ps : tu as bien modifié cette ligne là aussi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    produitfinal_row[i]["MONTANT_LIGNE"] = ttcstring;

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    oui j'ai bien modifié cette ligne de code de cette manière :
    produitfinal_row[0]["MONTANT_LIGNE"] = ttcstring;


    Merci en tout cas de t'etre intéressé à mon problème c'est super sympa
    Bone continuation.

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 323
    Points : 128
    Points
    128
    Par défaut
    salut à tous!

    Je lutte toujours sur le même problème, j'ai un tout petit peu avancer.

    avec ce code ci, je peux ajouter qu'une seule fois un nombre X de données , mais seulement une seule fois ...
    (donc mon problème d'avant était surement du au code en aval, qui déconnait déja).

    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
     
     private void button2_Click(object sender, EventArgs e)
            {
                dataGridView1.Visible = false;
                dataGridView2.Visible = true;
                button2.Visible = false;
     
                #region définition datatable et on les relie au dataset
     
                    DataTable produitfinal = new DataTable();
                    produitfinal.Columns.Add("CODE_CIP_PRODUIT");
                    produitfinal.Columns.Add("NOM_PRODUIT");
                    produitfinal.Columns.Add("PRIX");
                    produitfinal.Columns.Add("MONTANT_TVA");
                    produitfinal.Columns.Add("QUANTITE");
                    produitfinal.Columns.Add("MONTANT_LIGNE");
     
                    ds2.Tables.Add(produitfinal);
                    #endregion
    conn.Open();
     
                for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
                {
                    DataGridViewCheckBoxCell maCell = new DataGridViewCheckBoxCell();
                    maCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[i].Cells[0];
     
                    if (maCell.FormattedValue.Equals(true))
                    {
                        string temp = dataGridView1.Rows[i].Cells[1].Value.ToString();
                        int temp2 = Int32.Parse(temp);
     
                        MySQLDriverCS.MySQLDataAdapter MyAdapter2 = new MySQLDriverCS.MySQLDataAdapter("SELECT CODE_CIP_PRODUIT, NOM_PRODUIT, PRIX, MONTANT_TVA FROM produit, prix_achat_admin WHERE produit.ID_PRODUIT=prix_achat_admin.ID_PRODUIT AND CODE_CIP_PRODUIT = " + temp2 + " AND prix_achat_admin.ID_TYPE_ACHAT = " + type_prix, conn);
                        MyAdapter2.Fill(produitfinal);
     
                        dataGridView2.DataSource = ds2;
                        dataGridView2.DataMember = ds2.Tables[1].TableName;
    }
    }
    Alors, auparavant je vous rappelle que je choisis avec une checkbox un certains nombre d'éléments (résultant d'une requete). Apres avoir cliqué sur le button2 (j'ai fini mon choix), ce code la se lance. Le datagridview m'affiche alors mes choix.

    Je souhaite faire ceci autant de fois que je le souhaite avec une contrainte : ce que j'ai choisi en dernier, je souhaite le voir s'afficher après ce que j'ai choisi auparavant.

    Ici, ce qui se passe c'est que ca s'affiche la premiere fois nickel, mais la deuxieme fois, rien ne s'affiche de plus.

    Une idée ?


    Merci beaucoup, et désolé de vous pompez l'air avec mon problème

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/04/2009, 12h25
  2. Réponses: 2
    Dernier message: 22/05/2008, 12h37
  3. DataSet et DataTable
    Par Tsoupi dans le forum Windows Forms
    Réponses: 13
    Dernier message: 17/04/2008, 00h35
  4. Gestion Dataset et Datatable
    Par Niquel dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 24/07/2007, 14h13
  5. [ADO.NET] Dataset et DataTable
    Par gibea00 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 15/12/2006, 04h49

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