Announcement

Collapse
No announcement yet.

DataSet Insert-Anweisung für Master Detail (AutoInkrement)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataSet Insert-Anweisung für Master Detail (AutoInkrement)

    Hallo Zusammen...

    ich habe mich jetzt die letzt Zeit mit einem DataSet (Designer) gespielt.
    Mein Ziel war es, ein Master Detail Formular zu erzeugen. Sprich auf einem Formular ein DataGrid für die Personen und ein DataGrid für Adressen.

    Gegeben (MSSQL2008R2 Express):

    - Tabelle tblPerson
    PersonID (AutoInc)
    Name
    Vorname

    - Tabelle tblAdresse
    AdresseID (AutoInc)
    PersonID
    Straße
    PLZ
    Ort

    - (tblPerson)PersonID steht mit (tblAdresse)PersonID in Beziehung

    Nun hatte ich das Problem wenn ich eine neue Person erstellt habe, steht erstmal -1 bei PersonID. Wenn ich nun ohne vorher zu speichern im AdressDataGrid Adressen erstelle steht bei PersonID eben diese -1 drinnen.
    Wenn ich nun auf "Speichern" klicke bekomme ich eine "foreign key Verletzung".
    Ich habe mir einen Code gebastelt mit dem das ganze jetzt klappt.

    Bitte schaut euch diesen Code mal an und sagt mir ob ich dieses Problem korrekt angepackt habe.

    [highlight=c#]
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    this.tblPersonTableAdapter.Fill(this.testDataSet.t blPerson);
    }

    private void tblPersonBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
    tblPersonBindingSource.EndEdit();
    tblAdresseBindingSource.EndEdit();

    if (((DataRowView)(tblPersonBindingSource.Current)).R ow.RowState == DataRowState.Added)
    {
    TestDataSet.tblAdresseDataTable lstAdresse = new TestDataSet.tblAdresseDataTable();

    //Liste aus DS in temporäre Liste packen
    lstAdresse = (TestDataSet.tblAdresseDataTable)testDataSet.tblAd resse.Copy();

    //Liste aus DS leeren um eine Schlüsselverletzung beim Speichern der Person zu vermeiden
    testDataSet.tblAdresse.Clear();

    //Speichern der tblPerson (Durch SCOPE_IDENTITY() wird die tatsächliche ID der Datenban in mein DataTable eingetragen)
    tblPersonTableAdapter.Update(testDataSet.tblPerson );

    //Auslesen der ID
    int id = Convert.ToInt32(((DataRowView)tblPersonBindingSour ce.Current).Row["PersonID"]);

    //["PersonID"] der Temporäre Liste mit tatsächlicher Liste füllen und an DS Table zurückschreiben.
    for (int i = 0; i < lstAdresse.Rows.Count; i++)
    {
    lstAdresse.Rows[i]["PersonID"] = id;
    testDataSet.tblAdresse.Rows.Add(lstAdresse.Rows[i].ItemArray);
    }

    //Speichern der tblAdresse
    tblAdresseTableAdapter.Update(testDataSet.tblAdres se);


    }
    else
    {

    this.tableAdapterManager.UpdateAll(this.testDataSe t);
    }
    }

    private void tblAdresseBindingSource_AddingNew(object sender, AddingNewEventArgs e)
    {
    tblPersonBindingSource.EndEdit();
    }

    private void tblAdresseDataGridView_Leave(object sender, EventArgs e)
    {
    tblAdresseBindingSource.EndEdit();
    }


    //Nur Adressen der relevanten Person aus DB holen
    private void tblPersonBindingSource_CurrentItemChanged(object sender, EventArgs e)
    {

    if (((DataRowView)(tblPersonBindingSource.Current)).R ow.RowState == DataRowState.Added)
    {
    testDataSet.tblAdresse.Clear();

    }
    else
    {
    int id = Convert.ToInt32(((DataRowView)tblPersonBindingSour ce.Current).Row["PersonID"]);
    this.tblAdresseTableAdapter.Fill(this.testDataSet. tblAdresse, id);
    }
    }
    [/highlight]

    Schon mal vielen Dank (und schlagt mir nicht den Kopf dafür ab! )

    Gruß
    Christian
    Zuletzt editiert von Humml87; 17.02.2012, 17:51.
Working...
X