none
Dataset - Add DataRow über die Beziehung RRS feed

  • Frage

  • Hallo,

    ist das möglich, Datensätze evtl. über die Beziehung, Relation hinzu zufügen?

    Wenn ja wie?

    Bis dato ermittle ich den Fremdschlüssel und mache halt Add

    Grüße Oliver

    Donnerstag, 9. November 2017 17:37

Antworten

Alle Antworten

  • Hi Oliver,
    natürlich ist das möglich:

    BindingSource bs2 hält die zum aktuellen Master-Datensatz gehörenden Child-Datensätze. Dann einfach neuen Datensatz mit AddNew hinzufügen:

          var drv = (DataRowView)(bs2.AddNew());
          drv["Info"] = "neue Zeile"; // Eigenschaftswert im neuen Child-Datensatz


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 9. November 2017 18:48
  • Hallo Peter,

    Ok. Ich erstelle mit dem Wizard die Beziehung.

    Dann habe ich eine Relation. Muss ich die einem

    BindingSource Objekt zuweisen?

    Das ist mir unklar.

    Grüße Oliver

    Donnerstag, 9. November 2017 18:57
  • Hi Oliver,
    Mit dem Designer erstellst Du erst einmal die DataSet-Klassen. Wie erstellst Du die Repositories, die die Daten von den erstellten Typen halten?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 9. November 2017 19:48
  • Hallo Peter,

    Ich mache es so.

    https://goo.gl/fjyPzA

     

    Grüße Oliver

     


    Donnerstag, 9. November 2017 19:53
  • Hi Oliver,
    im von Dir genannten Thread ist nicht ersichtlich, wie das Repository für die Child-Datensätze aussieht. Vermutlich hast Du dafür nichts implementiert und greifst immer auf alle Child-Datensätze zu. In meinem Beispiel habe ich eine BindingSource für die Child-Datensätze zum Current Master-Datensatz genutzt.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks


    • Bearbeitet Peter Fleischer Freitag, 10. November 2017 16:06 Grammatikfehler
    Freitag, 10. November 2017 07:59
  • . In meinem Beispiel habe ich eine BindingSource für die Child-Datensätze zum Current Master-Datensatz genutzt.


    Hallo Peter,

    mir fehlt hier die Vorgehensweise.

    Ich nehme den Wizard, erstelle mir Primär-/Fremdschlüssel. Sauberes Datenmodell.

    Erstelle dann die Beziehungen über den Wizard, meist dann Benamung mit FK_PK_XXX etc.

    Wie kann ich jetzt anhand dem das Datenmodell schneller befüllen, ohne mühselig selber nach dem Fremdschlüssel zu suchen.

    Ich brauche da ein Bespiel, wenn Du eins hast. DANKE.

    Viele Grüße Oliver 

    Samstag, 11. November 2017 14:05
  • Hi Oliver,
    zu Deiner Ausgangsfrage hatte ich Dir schon geantwortet. Hier mal eine Konsolendemo zur Verdeutlichung:

    using System;
    using System.Data;
    
    namespace ConsoleApp1
    {
      class Program21
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            c.Execute();
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.WriteLine("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
        /// <summary>
        /// Klasse, die das arbeitende Programm simuliert
        /// </summary>
        internal class Demo
        {
          internal void Execute()
          {
            /// Master-Tabelle
            DataSet t1 = new DataSet();
            DataTable dtSide = new DataTable("Master");
            DataTable dtSerials = new DataTable("Child");
            t1.Tables.AddRange(new DataTable[] { dtSide, dtSerials });
            DataColumn col11 = dtSide.Columns.Add("Id", typeof(int));
            col11.AutoIncrement = true;
            col11.AutoIncrementSeed = -1;
            col11.AutoIncrementStep = -1;
            dtSide.Columns.Add("Number", typeof(string));
    
            // Child-Tabelle
            DataColumn col21 = dtSerials.Columns.Add("Id", typeof(int));
            col21.AutoIncrement = true;
            col21.AutoIncrementSeed = -1;
            col21.AutoIncrementStep = -1;
            DataColumn col22 = dtSerials.Columns.Add("IdSide", typeof(int));
            dtSerials.Columns.Add("Position", typeof(string));
    
            // Beziehung
            ForeignKeyConstraint fkc = new ForeignKeyConstraint("FKc", col11, col22) { DeleteRule = Rule.Cascade };
            dtSerials.Constraints.Add(fkc);
            t1.Relations.Add("rel1", col11, col22);
    
            // BindingSources
            System.Windows.Forms.BindingSource bsMaster = new System.Windows.Forms.BindingSource(t1, "Master");
            System.Windows.Forms.BindingSource bsChild = new System.Windows.Forms.BindingSource(bsMaster, "rel1");
    
            // Master-Datensätze
            for (int i = 1; i <= 10; i++)
            {
              DataRowView drv = bsMaster.AddNew() as DataRowView;
              drv["Number"] = $"Master {i}";
            }
    
            // Child-Datensätze
            Random rnd = new Random(); // Für zufälligen Master-Datensatz
            for (int i = 0; i < 100; i++)
            {
              bsMaster.Position = rnd.Next(0, bsMaster.Count);
              DataRowView drv = bsChild.AddNew() as DataRowView;
              drv.BeginEdit();
              drv["Position"] = $"Child {i + 1}";
              drv.EndEdit();
            }
    
            // Testanzeige
            foreach (DataRow row1 in dtSide.Rows)
            {
              Console.WriteLine($"{row1[0]} {row1[1]}");
              foreach (DataRow row2 in row1.GetChildRows("rel1"))
                Console.WriteLine($"  {row2[0]} {row2[1]} {row2[2]}");
            }
          }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Samstag, 11. November 2017 16:49
  • Hallo Peter,

    >Um Teile der Logik auszulagern, nutze rechte Maustaste auf markierte Codezeilen -> refactoring -> extract method.

    das wußte ich nicht. DANKE.

     

    // BindingSources

            System.Windows.Forms.BindingSource bsMaster = new System.Windows.Forms.BindingSource(t1, "Master");

     

    Ich muss das ohne Windows Form realisieren.

     

    So was erzeugt der Wizard, müsste irgendwie anders zu befüllen sein, denke ich.

    Weiß nur nicht wo ich suchen kann.

     

    Viele Grüße Oliver

     

     
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "15.0.0.0")]
    public DTCounterIndiciesRow[] GetDTCounterIndiciesRows() {
                    if ((this.Table.ChildRelations["FK_DTPositions_DTCounterIndicies"] == null)) {
                                   return new DTCounterIndiciesRow[0];
                    }
                    else {
                                   return ((DTCounterIndiciesRow[])(base.GetChildRows(this.Table.ChildRelations["FK_DTPositions_DTCounterIndicies"])));
                    }
    }
     
    DataSetMarkingCodes.DTCounterIndiciesRow myRow = new DataSetMarkingCodes.DTCounterIndiciesRow();
                        DSMarkingCodes.DTCounterIndicies.AddDTCounterIndiciesRow(myRow);
                                                                                  
                                                                                  


                                                                                   


    Samstag, 11. November 2017 21:09
  • Hi Oliver,
    unklar ist, wer Dir verbietet, Klassen aus dem Framework zu nutzen, z.B. die System.Windows.Forms.dll?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks


    Sonntag, 12. November 2017 00:43
  • Hallo Peter,

    wollte nur wissen, ob es nicht doch möglich ist die Features über den Wizard zu nutzen, ohne BindingSource.

    Für meinen Zweck reicht mal erst die Variante, die Du mir zeigtest.   Danke.

    Grüße Oliver

    Montag, 13. November 2017 17:41
  • Hi Oliver,
    natürlich kannst Du auch den Designer für die Erzeugung des Repositories nutzen. Die dazu gehörenden Anweisungen werden dann in der Designer-Datei abgelegt. Üblicherweise ist das in einer Windows Forms Anwendung die Designer-Datei eines Formulars. Dort kann man die Instanz des typisierten DataSets ablegen und auch die Instanzen von BindingSources. Im Eigenschaftsfenster kann man dann die Zuordnungen treffen.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 13. November 2017 19:17