Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Datenbank lässt sich nicht speichern


niggo233 - So 18.09.11 09:00
Titel: Datenbank lässt sich nicht speichern
Hallo
ich habe ein problem ich habe zwei Tabellen in einer Daten bank die per BindingSource mit einandere verbunden sind,es ist zwar nur eine Testdatenbank aber ich brauch das speichern natürlich für weitere Datenbankanwendungen.Die erste Tabelle heißt "Publishers" und dort kommt der Verlag für ein Buch hinein.Die zweite Tabelle heißt "Books" wo BooksId,PublisherId,Title und Author vorhanden ist.Wenn ich jetzt ein Verlag eingebe und dazu ein Buch vorhanden ist dann werden nur die Bücher von diesen Verlag angezeigt dieser Verlag war aber schon außerhalb der c# programmierung eingespeichert die zweite Tabelle also Books speichert er,aber wenn ich jetzt ein neuen Verlang speichern will stürtzt das Programm ab und zeigt mir eine ewig lange Fehlermeldung über den dataGridView
Hier mal mein kompletter Code für dieses Programm:

C#-Quelltext
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:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
]namespace test_datenbank
{
public partial class Form1 : Form
{
SqlDataAdapter adapterPublisher;
SqlDataAdapter adapterBooks;
DataSet dsLibrary;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Users\nig go\Documents\Visual Studio 2010\Projects\Library.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand command = new SqlCommand("SELECT * FROM Publishers", conn);
adapterPublisher = new SqlDataAdapter(command);
SqlCommandBuilder cbPublisher = new SqlCommandBuilder(adapterPublisher);

adapterBooks = new SqlDataAdapter("SELECT * FROM Books", conn);
SqlCommandBuilder cbBooks = new SqlCommandBuilder(adapterBooks);

dsLibrary = new DataSet();

dsLibrary.Tables.Add("Publishers");
adapterPublisher.Fill(dsLibrary, "Publishers");
dsLibrary.Tables.Add("Books");
adapterBooks.Fill(dsLibrary, "Books");

dsLibrary.Relations.Add("Publishers_Books",
dsLibrary.Tables["Publishers"].Columns["PublisherId"],
dsLibrary.Tables["Books"].Columns["PublisherId"]);

BindingSource bsPublishers = new BindingSource();
bsPublishers.DataSource = dsLibrary;
bsPublishers.DataMember = "Publishers";
dataGridView1.DataSource = bsPublishers;

dataGridView1.DataSource = bsPublishers;
dataGridView1.Columns[0].Visible = false;
BindingSource bsBooks = new BindingSource();
bsBooks.DataSource = bsPublishers;
bsBooks.DataMember = "Publishers_Books";

dataGridView2.DataSource = bsBooks;
}

private void btnAbbrechen_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void btnSpeichern_Click(object sender, EventArgs e)
{
adapterPublisher.Update(dsLibrary, "Publishers");
adapterBooks.Update(dsLibrary,"Books");
}
}
}



Ich hoffe jemand kann mir helfen
danke schon mal im voraus
Mfg

Moderiert von user profile iconKha: ".NET Version" geändert


ujr - So 18.09.11 14:34

user profile iconniggo233 hat folgendes geschrieben Zum zitierten Posting springen:
und zeigt mir eine ewig lange Fehlermeldung über den dataGridView


Und die lautet wie?


Kha - So 18.09.11 15:16

Hier geht es nicht wirklich um Silverlight, oder :gruebel: ?


niggo233 - So 18.09.11 19:18

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Hier geht es nicht wirklich um Silverlight, oder :gruebel: ?

Tut mir leid silverlight nicht nur 4.0
tut mir leid


niggo233 - So 18.09.11 19:19

Hier die fehlermeldung:

DataGridView-Ausnahme

System.Data.InvalidConstraintExeption:Für
ForeignKeyConstraint Publishers_Books müssen die
untergeordneten Schlüsselwerte(3) in der übergeordneten
Tabelle vorhanden sein.
bei
System.Data.ForeignKeyConstraint.CheckConstrait(DataRowchildRow,DataRowAction action)
bei
System.Data.DataTable.RaiseRowChanging(DataRowChangeEven
tArgs args,DataRow eRow,DateRowAction eAction,Boolean
fireEvent)
bei System.Data.DataTable.SetNewRecordWorker(DataRow
row,Int32 proposedRecord,DataRowAction action,Boolean
isInMerge,Boolean suppressEnsurePropertyChanged,Int32
position,Boolean fireEvent,Exeption&deferred Execption)
bei System.Data.DataRow.EndEdit()
bei System.Data.DataRowView.EndEdit()
bei System.Windows.Forms.CurrencyManager.End currentEdit()
bei
System.Windows.Forms.DataGridView.DataGridViewDataConnect
ion.OnRowValidating(DataGridViewCellCancelEventArgs e)
Behandel Sie das DataError-Ereignis,um dieses Standarddialogfeld zu ersetzen


Th69 - Mo 19.09.11 09:51

Hallo niggo233,

es müssen erst die Bücher abgespeichert werden, damit du dann Referenzen (Ids) auf diese in der Publisher-Tabelle angeben kannst (wegen des ForeignKeyConstraints).
Also vertausche einfach die beiden Update-Methoden:

C#-Quelltext
1:
2:
adapterBooks.Update(dsLibrary,"Books");
adapterPublisher.Update(dsLibrary, "Publishers");


niggo233 - Di 20.09.11 16:40

Hi
ja also daran liegt es nicht gleiche Fehlermeldung


Th69 - Di 20.09.11 17:22

Wenn du einen neuen Publisher (Verlag) anlegst, setzt du denn dann die 'PublisherId' korrekt und überträgst sie für die neuen Bücher?

Ein Tutorial gibt es unter http://www.codeproject.com/KB/database/databinding_tutorial.aspx?fid=1144420&df=90&mpp=25&noise=3&prof=False&sort=Position&view=Quick&fr=1#xx0xx
Schau dir mal den Abschnitt 'Hierarchical data binding with a DataSet' an (die Eigenschaften DataColumn.AutoIncrement... könnten für dich interessant sein).


niggo233 - Do 20.10.11 18:17

Hi
Danke geht jetzt