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#

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    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 éminent 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
    Points : 7 903
    Points
    7 903
    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 du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    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 éminent 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
    Points : 7 903
    Points
    7 903
    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 du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    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 éminent 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
    Points : 7 903
    Points
    7 903
    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 du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    j'ai testé de creer des commandbuilter.... sans effet, la mise a jour de la base de données ne s'effectue pas

    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
     
    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 commanbuilter (essai)
                cb1 = new OleDbCommandBuilder(da1);
                cb2 = new OleDbCommandBuilder(da2);
                cb3 = new OleDbCommandBuilder(da3);
                // 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();

  8. #8
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Le cn.Close() me gène un peu : Que se passe-t'il sans cette instruction ?

    Peux-tu montrer ton code pour les Update() de la Database?

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut,

    Je ne vois pas bien ce qui te gène avec le cn.close()???

    Pour ce qui est des commandbuilder je les ai declarer après avec récupéré le schéma de mes datatables:
    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
     
    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 du dataset
                dataset1 = new DataSet();
                da1.FillSchema(dataset1, SchemaType.Mapped, "Client");
                da2.FillSchema(dataset1, SchemaType.Mapped, "Contact");
                da3.FillSchema(dataset1, SchemaType.Mapped, "Intervention");
                // creation commanbuilter (essai)
                cb1 = new OleDbCommandBuilder(da1);
                cb2 = new OleDbCommandBuilder(da2);
                cb3 = new OleDbCommandBuilder(da3);
                // remplissage du dataset
                da1.Fill(dataset1, "Client");
                da2.Fill(dataset1, "Contact");
                da3.Fill(dataset1, "Intervention");
                cn.Close();
    Puis pour la mise a jour du dataset1, j'ai fais:

    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
     
    try
                {
                    cn = new OleDbConnection(strAccessConn);
                    cn.Open();
                    da1.UpdateCommand = cb1.GetUpdateCommand();
                    da1.Update(dataset1.Tables[0]);
                    da2.UpdateCommand = cb2.GetUpdateCommand();
                    da2.DeleteCommand = cb2.GetDeleteCommand();
                    da2.InsertCommand = cb2.GetInsertCommand();
                    da2.Update(dataset1.Tables[1]);
                    da3.UpdateCommand = cb3.GetUpdateCommand();
                    da3.DeleteCommand = cb3.GetDeleteCommand();
                    da3.InsertCommand = cb3.GetInsertCommand();
                    da3.Update(dataset1.Tables[2]);
                    cn.Close();
    Les differentes commandes ne sont plus a null, on a bien une command SQL, mais la MAJ de la base de donnée ne se fait tjrs pas.......

  10. #10
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    da1.Update(dataset1);

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    aucun changement, toujours pas de MAJ de ma base de donnée... je commence a être depité

  12. #12
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    A tout hasard, tu n'aurais pas fait des AcceptChanges des DataTable avant les DataAdapter.Update ?

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut

    non non pas d'acceptchanges d'utilisé.... je pige pas du tout le problème

    Veux tu que je mette mon projet en ligne pour que tu y jettes un oeil? si tu es tjrs ok pour me filer un coup de main car je comprendrai que ça commence à te gonfler lol car moi ça commence serieusement à me prendre la tête

  14. #14
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Veux tu que je mette mon projet en ligne pour que tu y jettes un oeil?
    Je peux regarder.

    Mais, je soupçonne desormais le problème d'être lié au FillSchema.
    Essaye ceci juste après la création des DataAdapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dax.MissingSchemaAction = MissingSchemaAction.AddWithKey;

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut,

    malheureusement cela ne change rien...

    J'ai donc mis mon projet ici http://dl.free.fr/qCXPmfrP5

    Je pense que c'est mon appli qui doit être bancale mais bon comme je suis vraiment novice en programmation et que je developpe cette appli pdt mes hobbies, attends toi a voir un codage "pas beau" lol

    Par contre j'ai essayé de commenté mon code autant que possible (histoire de me rappeler ce que fait tel bout de code).

    voili

  16. #16
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Passes-tu bien bien par les instructions du type datasetx.Tables[x].Rows.Add(Drx) ? Je supposes que oui puisque que tu constates les modif sur le DataGridView.

    Le problème pourrait venir de la gestion des champs autoincrément (ClientId par exemple) dans les ajouts.
    Au lieu de récupérer la valeur max par un Select du type
    "select xxxID from XXX WHERE xxxID= (select max (xxxID) from XXX)" puis de l'incrémenter,
    il faut juste modifier l'insertcommand du dataAdapter en supprimant le champ xxxID et traiter l'event RowUpdated du dataAdapter
    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
     
    // après la création des dataAdapter
    dax.RowUpdated += OnOleDbRowUpdatedx;
     
    // aprés la création de l'insertcommand par le commandbuilder
    dax.InsertCommand.CommandText= dax.InsertCommand.CommandText.Replace("xxxId,","") ; 
    // ??? : vérifier si il n'y pas des blancs dans ("xxxId,")
    dax.InsertCommand.Parameters.RemoveAt(0) ;
    // ??? : vérifier que le paramètre 0 correspond à xxxId
     
    internal void OnOleDbRowUpdatedx(object sender, OleDbRowUpdatedEventArgs e)
        {
          if (e.StatementType==StatementType.Insert)
          {
            OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY",cnx);
            e.Row["xxxId"] = cmd.ExecuteScalar();
          }
        }
    Sinon, après dax.Update(datasetx), il faut ajouter datasetx.Tables[x].UpdateCommand, mais c'est sans rapport avec le problème rencontré.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut

    je suis pas sur d'avoir tout compris à ton explication....

    pour toi je ne dois pas gérer le champ autoincrémenté (ContactID ou InterID) en fonction que je veuille ajouter un contact ou une intervention??? c'est bien ça? je dois supprimer ce champ de l'insertcommand ?

    Ok, mais dans ce cas pourquoi une simple mise a jour de donnée ou une suppression ne fonctionne pas? dans ce cas je ne "touche" pas aux champs autoincrémentés et pourtant ça ne fonctionne pas non plus....

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Points : 159
    Points
    159
    Par défaut
    Bonjour Waspi59

    Je viens de regarder votre projet, et, a ce niveau, je pense que vous le savez, mais afin d'en etre certain, j'attire votre attention sur le fait qu'a chaque generation, la base de donnee est copiee dans le repertoire "bin" ecrasant tout ce que vous avez fait lors du test precedent. Vous vous retrouvez donc toujours avec la seulle region "Nord".

    Au niveau du code, le moins que l'on puisse dire est, sans vouloir vous offenser, qu'il manque d'homogeneité. Vous utilisez des méthode differentes pour acceder à votre base.

    La première fonction a laquelle je me suis interesse est l'ajout d'une region :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string strSQL = "insert into Region (RegionName) Values ('" + name + "')";
    OleDbCommand cmd2 = new OleDbCommand(strSQL, cn);
    cmd2.ExecuteNonQuery();
    cn.Close();
    Et la... Il n'y a pas de DataSet. Vous mettez a jour votre base immediatement (Donc la region est bien auvegardee).

    Comme rien ne se met à jour dans l'application, vous faites un select comme suit :

    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
     
    public void initialisecomboBoxListRegion()
        {
        // remplissage de la comboBoxListRegion avec les regions
        OleDbConnection cn = new OleDbConnection(strAccessConn);
        cn.Open();
        OleDbCommand cmd = new OleDbCommand("select RegionName from Region", cn);
        OleDbDataReader dr = cmd.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Load(dr);
        dt.Rows.Add("");
        dt.DefaultView.Sort = "RegionName";
        comboBoxListRegion.DataSource = dt;
        comboBoxListRegion.ValueMember = "RegionName";
        cn.Close();
        IniRegion = true;
        }
    Vous creez une DataTatble que vous remplissez sur le champ afin d'alimenter "comboBoxListRegion" et puis vous laisser tomber sa reference. Quel domage !

    Vous avez bien cree un DataSet, mais a chaque fois que que l'on selectionne un client ("listBoxClient_SelectedIndexChanged(...)"). Il est donc egalement détruit a chque fois que l'on selectionne un client.

    Il vaudrait mieu creer votre "DataSet" une bonne fois pour toute au momment ou votre application demarre ("FormLoad(...)"). avec une DataTable et un DataAdapter par table dans votre base.
    Lorsque vous vous voulez importer les donnees d'une table dans la table de votre DataSet, il vous suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maTableDataAdapter.Fill(MaTableDataTable)
    Vous travaillez ensuite sur votre DataTable: Binding, parcour de table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Foreach (DataRow maRowDataRow in maTableDataTable.Rows)
        {
        MaRows. Action
        }
    Et pour sauvegarder, vous faites

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maTableDataAdapter.Update(MaTableDataTable)
    Et vous n'ecrivez de Sql que pour les DataAdapter.

    Vous aurez par contre un problème avec les ajout de ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataRow maRowDataRow = MaTableDataTable.NewRows();
    Car vous utilisez sous acces des clefs de type "NuméroAuto", or, cette ligne n'est generee que dans la DataTable, et ne va pas dans la base de donnee avant le DataAdapter.Update. C'est là que la remarque de Graffito prend tout son sens : Il faut, des le "NewRows()" faire l'Insert de cette ligne (Même vide) dans la base Access et recuperer son Id "SELECT @@IDENTITY" afin de remettre cet Id dans le DataRow qui vient d'etre cree.

    Citation Envoyé par Graffito Voir le message
    internal void OnOleDbRowUpdatedx(object sender, OleDbRowUpdatedEventArgs e)
    {
    if (e.StatementType==StatementType.Insert)
    {
    OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY",cnx);
    e.Row["xxxId"] = cmd.ExecuteScalar();
    }
    }
    J'espere avoir ete clair et que cela vous aidera.

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Points : 159
    Points
    159
    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.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    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?

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