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
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