none
Enregistrement parent / enfant RRS feed

  • Question

  • j'ai 2 tables,

     profils_id (parent) avec champ RefNo autoincrementé, profils_pro (enfant) avec un champ RefNo qui doit recuperer la valeur du champ RefNo de la table profils_id.

    le dataset contient les 2 tables et une relation entre les deux tables sur le champ RefNo.

    lorsque j'enregistre un nouveau profil les données sont bien enregistrer dans les deux tables, mais le champ RefNo de la table profils pro (enfant) contient -1.

    comment faire pour pour que cette valeur contienne la valeur de la table profils_id RefNo, et comment rafraichir les données dans le formulaire.

    voici le code pour l'enregistrement.

    private

     

     

    void profils_idBindingNavigatorSaveItem_Click(object sender, EventArgs e)

    {

     

     

    this.Validate();

     

     

     

    this.profils_idBindingSource.EndEdit();

    this.profils_proBindingSource.EndEdit();

     

     

     

    this.tableAdapterManager.UpdateAll(this.cvt2010DataSet);

    }

    merci par avance pour votre aide.

    jeudi 13 janvier 2011 13:14

Réponses

  • Bonjour thomas,

    J’ai bien reçu ton programme et je te remercie.

    Effectivement en recréant mes tables sur SQLSERVEUR cela fonctionne, mais pas sur MYSQL.

    J’ai donc regardé de plus près quelles étaient les différences entre SQLSERVEUR et MYSQL, et je me suis rendu compte d’une différence  majeure lors de la création de  la requête INSERT de la table Parent.

    Sur SQL après l’instruction insert une instruction SELECT est rajoutée pour rafraichir le champ Id, et voilà donc pourquoi cela fonctionne sur SQL et pas sur MYSQL.

    En résumer pour ceux qui utilisent MYSQL, pour que le champ en relation se mette à jour dans la table enfant, Il faut modifier la commande INSERT de la manière suivante :

    “INSERT INTO TableParent (Col1,Col2) VALUES(@Param1,@Param2) ;SELECT  Id,Col1,Col2 FROM TableParent WHERE Id=@@IDENTITY”.

    Avec une relation sur la colonne Parent.idàEnfant.id, et une contrainte de clé étrangère qui définit la règle de mise à jour sur cascade, le champ id de la table enfant est mis à jour correctement.

    Exemple complet :

    DataSet  ds = new DataSet("MonDataSet");

    MySqlConnection Connection = new MySqlConnection(connectionString);

     

    #region TableParent (Master)

     

    MySqlDataAdapter daParent = new MySqlDataAdapter();

    //-->Select

    sql = "SELECT Id,Col1,Col2 FROM tableparent“;

    cmd = new MySqlCommand(sql, Connection);

    daParent.SelectCommand = cmd;         

    //--->Insert

    sql = "INSERT INTO tableparent (Col1,Col2) VALUES (@Col1,@Col2); SELECT Id,Col1,Col2 FROM tableparent WHERE Id=@@IDENTITY";

    cmd = new MySqlCommand(sql, Connection);

    cmd.CommandType = CommandType.Text;

    cmd.Parameters.Add("@Id", MySqlDbType.Int32, 0, "Id");

    cmd.Parameters["@Id"].Direction = ParameterDirection.Output;

    cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");

    cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");

    daParent.InsertCommand = cmd;

    cmd.UpdatedRowSource = UpdateRowSource.Both;

     

    #endregion

     

    #region TableEnfant (Child)

     

    MySqlDataAdapter daEnfant = new MySqlDataAdapter();

    //-->Select

    sql = "SELECT Id,IdParent,Col1,Col2 FROM tableenfant“;

    cmd = new MySqlCommand(sql, Connection);

    daEnfant.SelectCommand = cmd;         

    //--->Insert

    sql = "INSERT INTO tableenfant (IdParent,Col1,Col2) VALUES (@IdParent,@Col1,@Col2)";

    cmd = new MySqlCommand(sql, Connection);

    cmd.CommandType = CommandType.Text;

    cmd.Parameters.Add("@IdParent", MySqlDbType.Int32, 0, "IdParent");

    cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");

    cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");

    daEnfant.InsertCommand = cmd;

    cmd.UpdatedRowSource = UpdateRowSource.Both;

     

    #endregion

     

    #region Relation (Master-->Child)

     

    // Create Relation TableParent --> TableEnfant

    DataColumn col1 = ds.Tables["TableParent"].Columns["Id"];

    DataColumn col2 = ds.Tables["TableEnfant"].Columns["IdParent"];

    // constraint

    ForeignKeyConstraint FK = new ForeignKeyConstraint(“FKParentEnfant”, col1, col2);

    FK.DeleteRule = Rule.Cascade;

    FK.UpdateRule = Rule.Cascade;

    FK.AcceptRejectRule = AcceptRejectRule.None;

    ds.Tables[TableEnfant].Constraints.Add(FK);

    ds.EnforceConstraints = true;

    // Relation

    DataRelation dr = new DataRelation("FKParentEnfant", col1, col2, false);

    ds.Relations.Add(dr);

     

    #endregion

     

    Connection.Open();

    daParent.Fill(ds,”TableParent”);

    daEnfant.Fill(ds,”TableEnfant”);

    Connection.Close();

     

    // BINDINGSOURCE

     

    bindingSourceParent.DataSource = ds;

    bindingSourceParent.DataMember = "TableParent";

     

    bindingSourceEnfant.DataSource = bindingSourceParent;

    bindingSourceEnfant.DataMember = "FKParentEnfant";

     

    // Enregistrement

     

    this.Validate();

    bindingSourceParent.EndEdit();

    daParent.Update(ds.Tables["TableParent"]);

    bindingSourceEnfant.EndEdit();

    daEnfant.Update(ds.Tables["TableEnfant"]);

     

     

    Cordialement

    Bertrand.
    • Marqué comme réponse Bertrand2011 vendredi 21 janvier 2011 22:16
    vendredi 21 janvier 2011 22:15

Toutes les réponses

  • Bonjour,

    Normalement, avec une BindingSource, cela devrait fonctionner de lui-même.

    Plusieurs pistes pour résoudre le problème :

    • La relation est-elle bien déclarée en ForeignKey dans le DataSet ?
    • Les règles d'Update de la relation sont-elles activées ? Il ne faut pas qu'elles soient à None, je me souviens plus trop ce qu'il faut mais il doit exister un Cascade.

    Sinon, plutôt que de faire un UpdateAll, essayer de faire d'abord l'Update de la table PArent, puis ensuite celle de la table Enfant.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 13 janvier 2011 13:20
  • lorsque j'active la relation Foreignkey cascade pour update et delete j'obtient l'erreur suivante :

    System.Data.invalidconstraintexception : foreignkeyconstraint FK_profils_id_profils_pro a besoin des valeurs de cle enfant (-1) dans la table parente etc....

     

     

     

    jeudi 13 janvier 2011 13:52
  • Bonjour,

    Tu as remplacé ton UpdateAll avec des updates dans l'ordre d'abord le parent, ensuite l'enfant ?

    Si c'est déjà le cas, essaie de désactiver les Constraints dans ton DataSet pour voir ce que cela donne.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 13 janvier 2011 14:11
  • Bonjour,

    Je viens de penser à un truc !!

    Pour le BindingSource, pour la table parent il faut utiliser un BindingSource qui lit les données de la table parent, mais pour la table enfant, il faut utiliser un bindingsource qui utilise la Foreign Key !

    Donc dans la définition du bindinsource enfant, il faut mettre comme DataSource le Bindingsource issu de la FK vers le parent.

    Si ce n'est pas clair, je dois pouvoir trouver un article qui explique cela bien mieux que moi :)

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 13 janvier 2011 14:15
  • Bonjour,

     

    Thomas, merci pour les réponses de ce thread !

    Bertrand2011, je vous remercie de nous tenir au courant avec l’évolution de votre projet et de nous dire si les informations de Thomas vous ont aidé.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    lundi 17 janvier 2011 15:10
  • Désolé de ne pas avoir répondu avant, mais j'étais sur d'autres choses.

    Tout d'abord merci pour l'article,

    Non mon problème n'est pas résolu, ma relation fonctionne pour Select, Update

     mais pas pour insert (le champ RefNo de la table enfant n'est pas renseigné avec la valeur du champ en relation de la table parent).

    J’explore une autre piste avec l'évènement RowUpdated sur le DataAdapter parent et enfant.

    Merci pour votre aide

     

    Cordialement

    Bertrand

    lundi 17 janvier 2011 19:02
  • Bonjour,

     

    Si vos recherches donnent des résultats, je vous remercie de nous tenir au courant dans ce thread.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     


    Suivez MSDN sur Twitter 

    mardi 18 janvier 2011 09:38
  • Bonjour Bertrand,

    Je dois avouer que je suis étonné que cela ne fonctionne pas.

    Peux-tu nous dire ce que les BindingSource profils_idBindingSource et profils_proBindingSource ont comme DataSource et DataMember ?

    Voilà à quoi cela devrait ressembler :

     

    profils_idBindingSource.DataSource = MonDataSet;
    
    profils_idBindingSource.DataMember = "profils_id";
    
    
    profils_proBindingSource.DataSource = profils_idBindingSource;
    
    profils_proBindingSource.DataMember = "FK_Profils_Id_Profils_Pro"; // Le nom de votre relation
    

     

    Parce qu'on est dans le cas standard Maitre/Detail, qui ne devrait te poser aucun problème.

    Je te mets le lien sur la MSDN : http://msdn.microsoft.com/fr-fr/library/c12c1kx4.aspx

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 19 janvier 2011 10:28
  • Bonjour thomas,

     

    Je te joins une synthèse de mon code, je pense que ça sera plus facile d’en discuter par la suite.

     

    private DataSet dsProfils;

    private DataTable dtProfils_id, dtProfils_pro;

    private MySqlDataAdapter daProfils_id, daProfils_pro;

    private MySqlConnection Connection;

     

    dsProfils  = new DataSet("ProfilDataSet");

    Connection = new MySqlConnection(connectionString);

     

    //àprofils_id (Master)

     

    daProfils_id = new MySqlDataAdapter();

    daProfils_id.SelectCommand = new MySqlCommand("SELECT RefNo,Nom,Prenom FROM profils_id", Connection);

    daProfils_id.SelectCommand.CommandType = CommandType.Text;

    daProfils_id.InsertCommand = new MySqlCommand("INSERT INTO profils_id (Nom,Prenom) VALUES (@Nom,@Prenom)", Connection);

    daProfils_id.InsertCommand.CommandType = CommandType.Text;

    // Add the parameter for the daProfils_id InsertCommand.

    MySqlParameter parameter = daProfils_id.InsertCommand.Parameters.Add("@RefNo", MySqlDbType.Int32, 0, "RefNo");

    parameter.Direction = ParameterDirection.Output;

    daProfils_id.InsertCommand.Parameters.Add("@Nom", MySqlDbType.String, 50, "Nom");

    daProfils_id.InsertCommand.Parameters.Add("@Prenom", MySqlDbType.String, 50, "Prenom");

    daProfils_id.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;

     

    daProfils_id.FillSchema(dsProfils, SchemaType.Source);       

    dtProfils_id = dsProfils.Tables[0];

    dtProfils_id.TableName = "profils_id";

     

    //àprofils_pro (Détail)

     

    daProfils_pro = new MySqlDataAdapter();

    daProfils_pro.SelectCommand = new MySqlCommand("SELECT ID,RefNo,Code_Qualif FROM profils_pro", Connection);

    daProfils_pro.SelectCommand.CommandType = CommandType.Text;

    daProfils_pro.InsertCommand = new MySqlCommand("INSERT INTO profils_pro (RefNo,Code_Qualif) VALUES (@RefNo,@Code_Qualif)", Connection);

    daProfils_pro.InsertCommand.CommandType = CommandType.Text;

    MySqlParameter parameter =

    daProfils_pro.InsertCommand.Parameters.Add("@RefNo", MySqlDbType.Int32, 0, "RefNo");

    daProfils_pro.InsertCommand.Parameters.Add("@Code_Qualif", MySqlDbType.Int32,5, "Code_Qualif");

    daProfils_pro.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;

     

    daProfils_pro.FillSchema(dsProfils, SchemaType.Source);

    dtProfils_pro = dsProfils.Tables[1];

    dtProfils_pro.TableName = "profils_pro";

     

    //àRelation

     

    DataColumn parentColumn = dsProfils.Tables[“profils_id”].Columns[“RefNo”];

    DataColumn childColumn =  dsProfils.Tables[“profils_pro”].Columns[“RefNo”];

    // Create DataRelation.

    DataRelation  relCustOrder = new DataRelation(“IDPRO”, parentColumn, childColumn, false);

    // Add the relation to the DataSet.

    dsProfils.Relations.Add(relCustOrder);

     

     

    Connection.Open();

    daProfils_id.Fill(dtProfils_id);

    daProfils_pro.Fill(dtProfils_pro);

    Connection.Close();

     

    //àcode form_load

     

    ProfilbindingSource.DataSource = DataPid.DataSetProfils;

    ProfilbindingSource.DataMember = "profils_id";

     

    RefnotextBox.DataBindings.Add("Text", ProfilbindingSource, "RefNo");

    NomtextBox.DataBindings.Add("Text", ProfilbindingSource, "Nom");

    PrenomtextBox.DataBindings.Add("Text", ProfilbindingSource, "Prenom");

     

    ProbindingSource.DataSource = ProfilbindingSource;

    ProbindingSource.DataMember = "IDPRO";

    dataGridView1.DataSource = ProbindingSource;

     

    //àcode save

     

    this.Validate();

    ProfilbindingSource.EndEdit();

    DataPid.ConnectionProfilsID.Open();

    DataPid.DataAdapterProfilsID.Update(DataPid.DataTableProfilsID);

    DataPid.DataAdapterProfilsPRO.Update(DataPid.DataTableProfilsPRO);

    DataPid.ConnectionProfilsID.Close();

     

     

    PS

    Aujourd’hui j’ai testé l’évènement rowupdated sur le DataAdapter profils_id qui exécute une requête du type « SELECT @@IDENTITY FROM profils_id » pour retourner le RefNo et une procédure juste avant l’update de profils_pro qui met à jour le paramètre @RefNo cela fonctionne. Mais je pense que la mise à jour du paramètre @RefNo devrait s’alimenter tout seul grâce à la relation ???

     

    Cordialement

    Bertrand

    mercredi 19 janvier 2011 20:30
  • Bonjour Bertrand,

    Alors je regarde ton code, et ça m'a l'air plutôt bon, SAUF ... Et oui, y'a toujours un sauf ;)

    Sauf que je ne vois pas à quel moment tu choisis la ligne sur laquelle ta BindingSource Master est sélectionnée.

    Car pour que la relation fonctionne, il faut qu'une ligne Master ait été sélectionnée dans ton BindingSource.

    Dans ton code, pour les données Master, tu les affectes dans des TextBox, ce qui m'étonne.

    En général, les données Master, tu les affiches dans une Gridview ou au moins une ComboBox, dans laquelle tu sélectionnes la ligne Master qui t'intéresse et qui te permet de filtrer automatiquement les données Details correspondantes.

    En gros, ce que je te propose, c'est de garder ton code, sauf qu'au lieu de mettre une TextBox RefnotextBox, mets une ComboBox, avec Datasource = ProfilbindingSource, DataMember = "RefNo".

    Ensuite il faut vérifier que :

    • lorsque tu sélectionnes différents RefNo dans ta Combobox, la grille se met à jour toute seule avec les bonnes données Profil.
    • lorsque tu ajoutes une ligne dans ta gridview, le RefNo est bien renseigné avec celui du Master.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 20 janvier 2011 08:47
  • Bonjour thomas,

    J’ai testé avec un combobox et le résultat est le même, puisque en réalité le problème vient du fait que la table maitre génère temporairement une valeur pour le champ RefNo (-1), et que celui-ci est utiliser des que je saisi des valeurs dans la table enfant.

    En faisant après l’update de la table maitre:

    foreach (DataRow row in test.dsProfils.Tables["profils_pro"].Rows)

     

                {

                    if (row.RowState == DataRowState.Added)

                    {

                        row["RefNo"] = test.RefNo.ToString();//à contient le lastinsertid

                    }

                }

    test.daProfils_PRO.Update(test.dsProfils.Tables[

    "profils_pro"]);

     

    "profils_pro"]);

    "profils_pro"]);

    Le problème est résolu, mais si je suis obligé de faire ca sur toutes les tables qui vont êtres liées (8) lors de l’ajout d’un profil dans la cvthèque cela risque d’être long.

     

    Maintenant peut être que c’est la seule solution, mais j’aimerai que tu me le confirme.

    PS

    Ce code est en aucun cas le code définitif mais juste un essai pour comprendre le principe d’une relation dans c#,

    en vue d’un portage d’appli que j’ai déjà développé en delphi, c’est la raison pour la qu’elle le refno est dans un textbox,

    et que j’utilise des boutons pour naviguer.

    Merci de ton aide

    Cordialement

    Bertrand

     

     
    jeudi 20 janvier 2011 14:05
  • Bonjour Bertrand,

    Si tu as la patience d'attendre ce soir vu que je n'ai pas de VS ici, j'aimerais bien que tu m'envoies ton mini projet de simulation, car j'aimerais le tester.

    Mon mail : tai (at) sharplog (point) fr

    Comme ça je ferai 2 choses :

    1. T'envoyer un exemple qui fonctionne que tu puisses le regarder si t'as le temps.

    2. Analyser où est-ce que ça cloche dans ton code, car je suis sûr que c'est un petit truc.

    Pour l'analyse, je voudrais que tu me dises exactement quelle est la manip que tu réalises et le comportement attendu. Par exemple, lors de ton cas d'utilisation, la ligne Master existe-t-elle toujours ou bien la crées-tu elle aussi au vol ? Si elle existe, je suppose que tu l'updates ou même pas ?

    Pour l'exemple que je vais t'envoyer, tu veux quoi ? Vu que ca devrait pas me prendre plus de 10 minutes, je peux te faire une dépendance entre une combobox et une grille, ou entre 2 grilles, ou autre, comme tu le souhaites.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 20 janvier 2011 14:21
  • Bonsoir Thomas,

    Je vais t'envoyer de suite le petit projet en question, ainsi que la structure de la base.

    La situation est simple, j'ai un formulaire de saisie qui correspond à tous les champs des tables :

    profils_la,profils_lg,profils_pro,pofils_mobilite,profils_codecalcul,profils_habilitation,profils_secteur qui sont reliées par le champ RefNo de profils_id.

    l'utilisateur rempli le formulaire puis une fois celui-ci completé, un bouton Save permet de lancer l'enregistrement dans la base.

    Donc le refno n'existe pas encore pendant la saisie et sera générer au vol, d'où l'interêt de la relation et du paramètre @refno qui selon moi devrait mettre à jour le champ refno des tables détails.

    pour info j'utilise les drivers .net mysql 6.3.6 (http://dev.mysql.com/downloads/connector/net/).

    PS

    La prochaine étape sera d'enregistrer le formulaire au format xml (avant la maj de la base juste pour garder en local une trace de la saisie au cas où il y aurait un problème) et donc de pouvoir lire ce fichier pour éviter de devoir remplir à nouveau le formulaire.

    Encore merci pour ton aide.

    Cordialement,

    bertrand


     

    jeudi 20 janvier 2011 20:21
  • Bonsoir Bertrand,

    Je viens de t'envoyer un exemple qui résout ton problème, je te laisse tester et jouer avec. Pour l'analyse, comme je te disais dans le mail, je n'ai pas eu ta BD ni ton DataSet, donc difficile d'avancer.

    Mais l'exemple reprend ta problématique, et fait ce qui est demandé.

    Si cela te parait convaincant, j'en mettrai les idées directrices ici :)

    Allez, je file au dodo, lever dans 4h :D

    Cordialement,

    Thomas

    PS : pour le format XML, je te propose qu'on ouvre un nouveau thread a ce moment-là ;)

    Et de rien, tout le plaisir est pour moi !


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    vendredi 21 janvier 2011 01:29
  • Bonjour thomas,

    J’ai bien reçu ton programme et je te remercie.

    Effectivement en recréant mes tables sur SQLSERVEUR cela fonctionne, mais pas sur MYSQL.

    J’ai donc regardé de plus près quelles étaient les différences entre SQLSERVEUR et MYSQL, et je me suis rendu compte d’une différence  majeure lors de la création de  la requête INSERT de la table Parent.

    Sur SQL après l’instruction insert une instruction SELECT est rajoutée pour rafraichir le champ Id, et voilà donc pourquoi cela fonctionne sur SQL et pas sur MYSQL.

    En résumer pour ceux qui utilisent MYSQL, pour que le champ en relation se mette à jour dans la table enfant, Il faut modifier la commande INSERT de la manière suivante :

    “INSERT INTO TableParent (Col1,Col2) VALUES(@Param1,@Param2) ;SELECT  Id,Col1,Col2 FROM TableParent WHERE Id=@@IDENTITY”.

    Avec une relation sur la colonne Parent.idàEnfant.id, et une contrainte de clé étrangère qui définit la règle de mise à jour sur cascade, le champ id de la table enfant est mis à jour correctement.

    Exemple complet :

    DataSet  ds = new DataSet("MonDataSet");

    MySqlConnection Connection = new MySqlConnection(connectionString);

     

    #region TableParent (Master)

     

    MySqlDataAdapter daParent = new MySqlDataAdapter();

    //-->Select

    sql = "SELECT Id,Col1,Col2 FROM tableparent“;

    cmd = new MySqlCommand(sql, Connection);

    daParent.SelectCommand = cmd;         

    //--->Insert

    sql = "INSERT INTO tableparent (Col1,Col2) VALUES (@Col1,@Col2); SELECT Id,Col1,Col2 FROM tableparent WHERE Id=@@IDENTITY";

    cmd = new MySqlCommand(sql, Connection);

    cmd.CommandType = CommandType.Text;

    cmd.Parameters.Add("@Id", MySqlDbType.Int32, 0, "Id");

    cmd.Parameters["@Id"].Direction = ParameterDirection.Output;

    cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");

    cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");

    daParent.InsertCommand = cmd;

    cmd.UpdatedRowSource = UpdateRowSource.Both;

     

    #endregion

     

    #region TableEnfant (Child)

     

    MySqlDataAdapter daEnfant = new MySqlDataAdapter();

    //-->Select

    sql = "SELECT Id,IdParent,Col1,Col2 FROM tableenfant“;

    cmd = new MySqlCommand(sql, Connection);

    daEnfant.SelectCommand = cmd;         

    //--->Insert

    sql = "INSERT INTO tableenfant (IdParent,Col1,Col2) VALUES (@IdParent,@Col1,@Col2)";

    cmd = new MySqlCommand(sql, Connection);

    cmd.CommandType = CommandType.Text;

    cmd.Parameters.Add("@IdParent", MySqlDbType.Int32, 0, "IdParent");

    cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");

    cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");

    daEnfant.InsertCommand = cmd;

    cmd.UpdatedRowSource = UpdateRowSource.Both;

     

    #endregion

     

    #region Relation (Master-->Child)

     

    // Create Relation TableParent --> TableEnfant

    DataColumn col1 = ds.Tables["TableParent"].Columns["Id"];

    DataColumn col2 = ds.Tables["TableEnfant"].Columns["IdParent"];

    // constraint

    ForeignKeyConstraint FK = new ForeignKeyConstraint(“FKParentEnfant”, col1, col2);

    FK.DeleteRule = Rule.Cascade;

    FK.UpdateRule = Rule.Cascade;

    FK.AcceptRejectRule = AcceptRejectRule.None;

    ds.Tables[TableEnfant].Constraints.Add(FK);

    ds.EnforceConstraints = true;

    // Relation

    DataRelation dr = new DataRelation("FKParentEnfant", col1, col2, false);

    ds.Relations.Add(dr);

     

    #endregion

     

    Connection.Open();

    daParent.Fill(ds,”TableParent”);

    daEnfant.Fill(ds,”TableEnfant”);

    Connection.Close();

     

    // BINDINGSOURCE

     

    bindingSourceParent.DataSource = ds;

    bindingSourceParent.DataMember = "TableParent";

     

    bindingSourceEnfant.DataSource = bindingSourceParent;

    bindingSourceEnfant.DataMember = "FKParentEnfant";

     

    // Enregistrement

     

    this.Validate();

    bindingSourceParent.EndEdit();

    daParent.Update(ds.Tables["TableParent"]);

    bindingSourceEnfant.EndEdit();

    daEnfant.Update(ds.Tables["TableEnfant"]);

     

     

    Cordialement

    Bertrand.
    • Marqué comme réponse Bertrand2011 vendredi 21 janvier 2011 22:16
    vendredi 21 janvier 2011 22:15
  • Bonjour Bertrand,

    Merci d'avoir mis l'explication :)

    Bonne continuation !

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mardi 25 janvier 2011 12:13