myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » DataSet BindingSource Master Detail über 3 Ebenen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

DataSet BindingSource Master Detail über 3 Ebenen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
andrej
myCSharp.de-Mitglied

Dabei seit: 26.06.2012
Beiträge: 3


andrej ist offline

DataSet BindingSource Master Detail über 3 Ebenen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen

Ich habe ein allgemeines Master Detail Problem, welches über 3 Ebenen geht.
ZIEL: Ich will NEUE Daten hinzufügen und erst ganz am Ende über meinen TableAdapter SPEICHERN/UPDATEN, sodass alle ForeignKey Abhängigkeiten aufgelöst werden.

Ich schilder ganz kurz das klassische Problem, welches über BindingSourcen recht simpel zu lösen ist.
Meine Tabellen sehen wire folgt aus:

Code:
1:
2:
3:
4:
5:
6:
7:
8:
CREATE TABLE kopf (nr INT NOT NULL IDENTITY, zusatzname NVARCHAR(20))
CREATE UNIQUE INDEX kopf_pk ON kopf ( nr ) ;
ALTER TABLE kopf ADD PRIMARY KEY ( nr );

CREATE TABLE pos (nr INT NOT NULL, posnr INT NOT NULL, zusatz NVARCHAR(20))
CREATE UNIQUE INDEX pos_pk ON pos ( nr, posnr ) ;
ALTER TABLE pos ADD PRIMARY KEY ( nr, posnr );
ALTER TABLE pos ADD CONSTRAINT pos_fk_nr FOREIGN KEY (nr) REFERENCES kopf (nr);

Wenn ich dann zwei BindingSourcen habe, dann sehen diese Verknüft wie folgt aus:

C#-Code:
kopfBindingSource.DataSource = DATASET
kopfBindingSource.DataMember = "kopf"

posBindingSource.DataSource = kopfBindingSource
posBindingSource.DataMember = "pos_fk_nr"

Das funktioniert super!!!

--------------------------------------------------------

Jetzt zuim eigentlichen Problem:
Ich habe jetzt 3 Tabellen, die miteinander verknüpft sind:

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
CREATE TABLE kopf_master (nr_master INT NOT NULL IDENTITY, name_master NVARCHAR(20))
CREATE UNIQUE INDEX kopf_master_pk ON kopf_master ( nr_master ) ;
ALTER TABLE kopf_master ADD PRIMARY KEY ( nr_master );

CREATE TABLE kopf (nr INT NOT NULL, zusatzname NVARCHAR(20))
CREATE UNIQUE INDEX kopf_pk ON kopf ( nr ) ;
ALTER TABLE kopf ADD PRIMARY KEY ( nr );
ALTER TABLE kopf ADD CONSTRAINT kopf_fk_nr FOREIGN KEY (nr) REFERENCES kopf_master (nr_master)

CREATE TABLE pos (nr INT NOT NULL, posnr INT NOT NULL, zusatz NVARCHAR(20))
CREATE UNIQUE INDEX pos_pk ON pos ( nr, posnr ) ;
ALTER TABLE pos ADD PRIMARY KEY ( nr, posnr );
ALTER TABLE pos ADD CONSTRAINT pos_fk_nr FOREIGN KEY (nr) REFERENCES kopf (nr);

Leider funktioniert folgendes nicht:

C#-Code:
kopf_masterBindingSource.DataSource = DATASET
kopf_masterBindingSource.DataMember = "kopf_master"

kopfBindingSource.DataSource = kopf_masterBindingSource
kopfBindingSource.DataMember = "kopf_fk_nr"

posBindingSource.DataSource = kopfBindingSource
posBindingSource.DataMember = "pos_fk_nr"

Ich erhalte folgende Fehlermeldung:

Fehlermeldung:
Der Wert NULL kann in die nr-Spalte, spoc.dbo.pos-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT.
Die Anweisung wurde beendet.

Ich habe ein Beispielprojekt angehängt, was aus nur paar Zeilen Code besteht, aber das Problem genau schildert!


Ich hoffe wirklich, dass mir jemand helfen kann
Danke im Voraus
Andrej


Dateianhang:
zip master_detail.zip (40,24 KB, 35 mal heruntergeladen)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von andrej am 26.06.2012 10:42.

26.06.2012 10:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

dein teil startet nicht:
Fehler 7 "LC.exe" wurde mit dem Code -1 beendet. WindowsFormsApplication1

Ansonsten scheint mir, dass du die Tabellen in falscher Reihenfolge befüllst:

C#-Code:
            // TODO: Diese Codezeile lädt Daten in die Tabelle "spocDataSet.kopf_master". Sie können sie bei Bedarf verschieben oder entfernen.
            this.kopf_masterTableAdapter.Fill(this.spocDataSet.kopf_master);
            // TODO: Diese Codezeile lädt Daten in die Tabelle "spocDataSet.pos". Sie können sie bei Bedarf verschieben oder entfernen.
            this.posTableAdapter.Fill(this.spocDataSet.pos);
            // TODO: Diese Codezeile lädt Daten in die Tabelle "spocDataSet.kopf". Sie können sie bei Bedarf verschieben oder entfernen.
            this.kopfTableAdapter.Fill(this.spocDataSet.kopf);

Es dürfen niemals untergeordnete Tabellen vor ihren ParentTables befüllt wern.

Aber ich habe auch dein Create-Table-Zeugs nicht richtig durchblickt, und nehme an, du wolltest damit sagen, dass die Verknüpfungen der Tabellen kurzgefasst so aussehen:

kopf_master->kopf->pos

?

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ErfinderDesRades am 26.06.2012 13:36.

26.06.2012 13:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
andrej
myCSharp.de-Mitglied

Dabei seit: 26.06.2012
Beiträge: 3

Themenstarter Thema begonnen von andrej

andrej ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

HI

das ist korrekt
die Tabellen stehen in der Beziehung:
master_kopf (1:1) kopf (1:n) pos

Eine klassische Beziehung kopf (1:n) pos ist kein Problem.
Jetzt kommt eigentlich nur master_kopf hinzu

Die Reihenfolge habe ich geändert, hilft aber trotzdem nicht.
Das Füllen kann ich eigentlich auch weglassen, da es auch mit leeren Datenbank-Tabellen nicht funktioniert

Wieso das Testprogramm nicht funktioniert kann ich net sagen, auf jedenfall müsste ein loakler SQL Server vorhanden sein, den connectionString müsste man ebenfalls anpassen
26.06.2012 14:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 4.426


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

keine ahnung, was ich am connectionstring drehen sollte - sicherlich habe ich deine DB nicht auf meinem System.

jdfs fund ich angehängtes Dataset, und das ist sicher nicht funktionstüchtig, mindestens weil kopfmaster gar keine Spalte hat - ich verstehe garnet, wie da eine DataRelation anknüpfen kann.

ErfinderDesRades hat dieses Bild angehängt:

Shots00.png

26.06.2012 15:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
andrej
myCSharp.de-Mitglied

Dabei seit: 26.06.2012
Beiträge: 3

Themenstarter Thema begonnen von andrej

andrej ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi

ich weiß nicht wieso dein Bild die Spalten nicht anzeigt, aba mit angegebenen SQL sieht das so aus:

Könnte auch daran liegen, dass ich MS Visual Studio 2010 nutze ...

andrej hat dieses Bild angehängt:

Capture.png

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von andrej am 26.06.2012 17:37.

26.06.2012 17:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Monate.
Der letzte Beitrag ist älter als 11 Monate.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 18.06.2013 23:38