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 :

probleme MAJ .mdb a partir dataset


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut probleme MAJ .mdb a partir dataset
    Bonjour a tous,

    J'ai quasiment finaliser mon appli, il ne reste plus qu'un problème a résoudre. Mais un problème de taille: la MAJ de ma base de donnée .mdb

    Mon .mdb comporte 3 tables et mon appli permet de modifier les éléments de cette DB garce à un dataset.

    J'arrive bien a creer mon dataset avec le code suivant:

    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
     
    strClientPath = Application.StartupPath + "\\Clients\\" + comboBoxListRegion.SelectedValue + "\\" + listBoxClient.SelectedItem.ToString();
                cn = new OleDbConnection(strAccessConn);
                cn.Open();
                // creation des string SQL
                string strSQLClientClientID = " select * from Client WHERE ClientID=" + ClientID;
                string strSQLContactClientID = " select * from Contact WHERE ClientID=" + ClientID;
                string strSQLInterventionClientID = " select * from Intervention WHERE ClientID=" + ClientID;
                // creation des dataadapters
                da1 = new OleDbDataAdapter(strSQLClientClientID, cn);
                da2 = new OleDbDataAdapter(strSQLContactClientID, cn);
                da3 = new OleDbDataAdapter(strSQLInterventionClientID, cn);
                // creation et remplissage du dataset
                dataset1 = new DataSet();
                da1.FillSchema(dataset1, SchemaType.Mapped, "Client");
                da1.Fill(dataset1, "Client");
                da2.FillSchema(dataset1, SchemaType.Mapped, "Contact");
                da2.Fill(dataset1, "Contact");
                da3.FillSchema(dataset1, SchemaType.Mapped, "Intervention");
                da3.Fill(dataset1, "Intervention");
                cn.Close();
    Ensuite l'interface de mon appli permet de faire des modif dans mon dataset.
    - sur la datatable "Client" >> Modifications des données
    - sur les datatables "Contact" et "Intervention" >> Modifications des données mais aussi ajout ou suppression d'enregistrement.

    Tout ce fait sans soucis et toutes les Modif que je fais sont bien répercuter sur mon dataset.

    Par contre je bloque pour la mise a jour de la base de donnée .mdb. Le truc bizarre c'est que les rows de mes datatables ont tjrs le statut "unchanged", peut importe la modif effectuée (Ajout/supression d'enregistrement, ou simple modif de donnée).

    Quelqu'un peut m'aider?

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    As-tu utilisé les instructions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dax.Update(dataset1) ;
    dataset1.Tables["Client"].AcceptChanges() ;

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    Citation Envoyé par Graffito Voir le message
    As-tu utilisé les instructions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dax.Update(dataset1) ;
    dataset1.Tables["Client"].AcceptChanges() ;
    Euhhh OUI j'ai utilisé ces instructions.

    En fait j'ai fait ça: Après avoir créé mon dataset1 (voir message ci-dessus), j'ai attribué les binding avec les textbox... de ma form.

    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
     
    // Databinding Données Clients
                        txtBoxNomClient.DataBindings.Add(new Binding("Text", dataset1, "Client.ClientName"));
                        txtBoxCodeClient.DataBindings.Add(new Binding("Text", dataset1, "Client.ClientNumber"));
                        RtxtBoxAdressClient.DataBindings.Add(new Binding("Text", dataset1, "Client.ClientAdress"));
                        RtxtBoxInfoClient.RichTextBox.DataBindings.Add(new Binding("Text", dataset1, "Client.ClientInfo"));
                        // Databinding Données Contact
                        try
                        {
                            bs1 = new BindingSource();
                            bs1.RaiseListChangedEvents = false;
                            bs1.DataSource = dataset1.Tables[1];
                            dataGridView1.AutoGenerateColumns = false;
                            DataGridViewColumn column1 = new DataGridViewTextBoxColumn();
                            column1.DataPropertyName = "ContactNom";
                            column1.HeaderText = "Nom";
                            column1.Width = 150;
                            DataGridViewColumn column2 = new DataGridViewTextBoxColumn();
                            column2.DataPropertyName = "ContactPrenom";
                            column2.HeaderText = "Prenom";
                            column2.Width = 150;
                            DataGridViewColumn column3 = new DataGridViewTextBoxColumn();
                            column3.DataPropertyName = "ContactID";
                            column3.HeaderText = "ID";
                            column3.Width = 50;
                            column3.Visible = false;
                            dataGridView1.Columns.Add(column1);
                            dataGridView1.Columns.Add(column2);
                            dataGridView1.Columns.Add(column3);
                            dataGridView1.DataSource = bs1;
                            comboBox2.DataBindings.Add(new Binding("Text", bs1, "ContactSexe", true));
                            textBox4.DataBindings.Add(new Binding("Text", bs1, "ContactTitre", true));
                            textBox5.DataBindings.Add(new Binding("Text", bs1, "ContactNom", true));
                            textBox6.DataBindings.Add(new Binding("Text", bs1, "ContactPrenom", true));
                            textBox7.DataBindings.Add(new Binding("Text", bs1, "ContactTelephone", true));
                            textBox8.DataBindings.Add(new Binding("Text", bs1, "ContactPoste", true));
                            textBox9.DataBindings.Add(new Binding("Text", bs1, "ContactPortable", true));
                            textBox10.DataBindings.Add(new Binding("Text", bs1, "ContactMail", true));
                            richTextBox3.DataBindings.Add(new Binding("Text", bs1, "ContactInfo", true));
                            bs1.RaiseListChangedEvents = true;
                            bs1.ResetBindings(false);
                            VerifDatagridview1();
                        }
                        catch
                        {
                        }
    J'ai fait la même chose pour les differentes datatables de mon dataset1.
    A ce stade je peux modifier les valeurs de textbox et c'est répercuté dans mon dataset1.

    J'ai donc aussi mis en place des prcedures pour Ajouter/supprimer des enregistrement sur mes datatables de mon dataset1.

    Ajout:
    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
     
    string name1 = "";
                string name2 = "";
                if (frmInputContact.Static_ShowfrmInputContact(ref  name1, ref  name2) == DialogResult.OK)
                {
                    //Recuperer le ClientID
                    string IDClient = "";
                    IDClient = dataset1.Tables[0].Rows[0]["ClientID"].ToString();
                    // Recuperer le ContactID Max de la DB
                    OleDbConnection cn = new OleDbConnection(strAccessConn);
                    cn.Open();
                    string IDContact = "";
                    string strSQLIDClient = "select ContactID from Contact WHERE ContactID= (select max (COntactID)from Contact)";
                    OleDbCommand cmdIDClient = new OleDbCommand(strSQLIDClient, cn);
                    cmdIDClient.Connection = cn;
                    IDContact = cmdIDClient.ExecuteScalar().ToString();
                    cn.Close();
                    // verif si ClientID max pas present dans datatable sinon increment
                    foreach (DataRow Dr in dataset1.Tables[1].Rows)
                    {
                        if (int.Parse(Dr["ContactID"].ToString()) > int.Parse(IDContact))
                        {
                            IDContact = int.Parse(Dr["ContactID"].ToString()).ToString();
                        }
     
                    }
                    // Incremente le IDcontact
                    IDContact = (int.Parse(IDContact) + 1).ToString();
                    // Ajout du nouveau contact au dataset
                    DataRow Dr1 = dataset1.Tables[1].NewRow();
                    Dr1["ContactID"]= IDContact;
                    Dr1["ClientID"]= IDClient;
                    Dr1["ContactNom"]= name1;
                    Dr1["ContactPrenom"]=name2;
                    dataset1.Tables[1].Rows.Add(Dr1);
                    // Mise a jout du datagridview
                    dataGridView1.Refresh();
                    VerifDatagridview1();
    Suppression:
    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
     
     try
                    {
                        DialogResult resultat = MessageBox.Show("Vous allez supprimer un Contact du Client " + listBoxClient.Text, "Suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
                        if (resultat == DialogResult.Yes)
                        {
     
                            foreach (DataRow dr in dataset1.Tables[1].Rows)
                            {
                                int i = int.Parse(dataGridView1.CurrentRow.Cells[2].Value.ToString());
                                int j = int.Parse(dr["ContactID"].ToString());
                                if (j == i)
                                {
                                    dr.Delete();
                                    break;
                                }
                            } //end of for loop 
     
                            dataset1.Tables[1].AcceptChanges();   
                        }
                    }
                    catch
                    {
                    }
                // Mise a jout du datagridview
                dataGridView1.Refresh();
                VerifDatagridview1();
    Ca fonctionne les modif effectué sous ma form (modif, ajout,suppression) sont bien répercutées sur mon dataset1.
    Par contre pas moyen de mettre a jour ma base de données mdb

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Peux-tu verifier ce qu'il y a dans da1.UpdateCommand.CommandText et da1.InsertCommand.CommandText ?

    Et si tu exécute dax.Update(dataset1) tu devrais avoir une erreur indiquant que la connection est fermée.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    re,


    ils sont non défini.... je pensais que ça se faisait automatiquement.

    je les definis ou et de quel façon?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    string strSQLClientClientID = " select * from Client WHERE ClientID=" + ClientID;
                string strSQLContactClientID = " select * from Contact WHERE ClientID=" + ClientID;
                string strSQLInterventionClientID = " select * from Intervention WHERE ClientID=" + ClientID;
                // creation des dataadapters
                da1 = new OleDbDataAdapter(strSQLClientClientID, cn);
                da2 = new OleDbDataAdapter(strSQLContactClientID, cn);
                da3 = new OleDbDataAdapter(strSQLInterventionClientID, cn);
    si j'ai bien compris pour le da1, comme je ne fais que de MAJ de donnée, je dois définir le "updatecommand".
    Par contre pour da2 et da3, comme je peux modifier les données mais aussi ajouter ou supprimer des enregistrements, je dois déninir:
    - updatecommand
    - insertcommand
    - deletecommand

    c'est bien ça?

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    ils sont non défini.... je pensais que ça se faisait automatiquement.
    Utilises des CommandBuilder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            
    OleDbCommandBuilder cbx = new OleDbCommandBuilder(dax);

  7. #7
    Membre éprouvé Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Par défaut Exemple
    Vous pouvez aller voir un exemple la:
    http://www.developpez.net/forums/d10...egration-code/

    Il n'y a cependant pas la gestion des Id crees par la base lors des Insert.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    bonjour Lecygne

    Oui je sais que mon projet et tout sauf "homogène" mais la programmation et particulièrement le C# et plutôt très occasionnel (pas du tout mon taff ni ma formation)

    Pour l'histoire des regions et des Clients je cré en effet un dataset par client (je pensais que c'était le mieux et le plus facile à gérer).... apparemment non lol

    Je devrais donc plutôt créer un dataset par région ou un seul dataset pour toute la base? mais dans le second cas quel est l'intérêt du dataset? autant faire directement les modif dans la base de donnée, non?

  9. #9
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Il est préférable de créer un DataTable par Table du SGBD, de le remplir au départ avec tous les enregistrements de la table (si le nombre d'enregistrements n'est pas supérieur à plusieurs dizaines de milliers), de lier DataTable et DataGridView via un BindingSource et de jouer sur la propriété "Filter" du BindingSource pour afficher des extraits de la DataTable. (par exemple : BindingSource1.Filter="RegionName='OUEST'" ).

    Pour les modifications, les faire dans les DataTable permet leur répecution automatique dans le DataGridView. Le DataAdapter permet de gèrer globalement un ensemble de modifications, ajouts, suppressions. Toutefois, pour faciliter la gestion d'erreurs, on effectue généralement un " DataAdapter.Update()" après chaque modif, ajout, suppression d'enregistrement.

  10. #10
    Membre éprouvé Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Par défaut
    Bonjour Waspy59

    Le DataSet represente une base de donnée, avec ses tables et ses relations.
    Si vous créez un DataSet par client, il va falloir gerer tous ces DataSet. C'est probablement possible mais à quel prix !
    Vous-vous posez la question de savoir si vous ne devriez pas plutôt faire un DataSet par région pourquoi plus par region que par client ? La problèmatique sera la même. Et s'il y a un client sur plusieurs région et que vous mettez à jours les informations qui lui sont relative...

    Par contre, ce que vous pouvez faire, c'est ne charger que les clients de la region nord au momment ou l'utilisateur selectionne cette region. Pour cela, il faut modifier la requette de selecion des clients en lui ajoutant le parametre region.

    1) Chargement de l'application
    => Chargement de la table des Region regionDataAdapter.Fill(regionDataTable)
    => Bind de la ListBox sur la colonne Nom de cette table.

    2) L'utilisateur selectionne une region
    => Enregistrement des donnees de la region precedement selectionee clientDataAdapter.Update(clientDataTable);
    => Effacement des donnees de la table clientDataTable.Clear();
    => Chargment des clients pour la nouvelle region (Il faut que clientAdapter.SelectCommand soit une commande parametree, dont le parametre est la region. Mise a jour du parametre avec la bonne region, puis: clientDataAdapter.Fill(regionDataTable);

    3) Fermeture de l'application
    => Pour tous les DataAdapter, DataAdapter.Update(laBonneTableDataTable);

  11. #11
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Bonjour,

    Je vais mettre ma m... mais comme on est plus en train de solutionner le problème mais de l'orienter dans sa futur vie de développeur:

    Pourquoi passer par des dataset?

    Je pense à LINQ TO SQL par exemple qui pourrait réconcilier notre ami avec l'accès aux données...

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    bonjour isberserk,

    Je vais jetter une oeil a LINQ histoire de pas mourir idiot....

    merci

  13. #13
    Membre éprouvé Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Bonjour,

    Je vais mettre ma m... mais comme on est plus en train de solutionner le problème mais de l'orienter dans sa futur vie de développeur:

    Pourquoi passer par des dataset?

    Je pense à LINQ TO SQL par exemple qui pourrait réconcilier notre ami avec l'accès aux données...
    Mais non tu ne mets pas ta m....
    De toute facon la situation restera la même, pour avoir jetter un oeil au code, on voit qu'il y a du travail et du courage qui sont tout à l'honneur de Waspy59, mais avec un manque d'architecture au départ qui se manifeste à la dernière étape.
    Donc avec l'une ou l'autre des solutions, je lui recommande de proceder par étape :

    A) Une seule table :
    1. Importer les données.
    2. Afficher les données.
    3. Modifier les données presentes.
    4. Enregistrer les données modifiées.
    5. Ajouter des données.
    6. Enregistrer les données ajoutées.


    B) Une deuxième tables avec une relation
    1. Importer les données (devenu facile).
    2. Selectionner une donnée de la première table.
    3. Afficher les données de la seconde en fonction de la selection.
    4. Modifier les données (devenu facile).
    5. Ajouter des données (devenu facile).
    6. Enregistrer les données (devenu facile).


    3) n tables avec m relations... (devenu facile).

    Dans tous les cas, bon courage Waspy59, et si vous choissez les DataSet, je me ferais un plaisir de vous aider .

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    Bonjour à tous,

    J'ai recommencé mon appli afin qu'elle doit plus propre et utiliser vos recommandations. (tout en restant les datasets que je commence a comprendre... le LINQ je verrai ça plus tard ).

    Je ne manquerai pas de revenir vers vous si je coince

    En tout cas un grand merci à vous pour votre patience et votre aide

    @+

Discussions similaires

  1. MAJ BD Access à partir d'un Dataset
    Par dabe59 dans le forum VB.NET
    Réponses: 4
    Dernier message: 22/03/2010, 23h53
  2. MAJ Table SQL à partir d'un DataSet
    Par Loubna.B dans le forum C#
    Réponses: 2
    Dernier message: 04/11/2009, 12h44
  3. Probleme d'update a partir d'un table adapter
    Par Contrec dans le forum C#
    Réponses: 2
    Dernier message: 18/04/2007, 11h23
  4. Réponses: 2
    Dernier message: 22/03/2007, 18h47
  5. lancer une mdb a partir d'une ligne de commande
    Par dpie dans le forum Access
    Réponses: 5
    Dernier message: 30/11/2004, 15h01

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