Fragensteller
Probleme mit DataRelation in DataSet

Frage
-
allo, habe auch so ein Problem. Ich habe ein DataSet mit 20 Tabellen.
Die erste Tabelle (Tabelle 0) "kann" eine 1:N Beziehung ju jeder ander Tabelle haben (Tabelle 1 - 20).
Nun möchte ich eine DataRelation und genauso ein ForeignKey erstellen.
Die DataRelation soll erstmal das Zusammengehören von Tabelle 0 zu jeder anderen bestimmen.
Der ForeignKey soll Rule.Delete auf "Cascade" setzen, damit alle Datensätze in Tabelle 1 - Tabelle 20 gelöscht werden sobald ein Datensatz in Tabelle 0 gelöscht wird.
Beim anlegen der DataRelation
C#-Code:
DataColumn parentCol = Form1._dsSqlTabellen.Tables[0].Columns["Dateiname"];
DataColumn childCol = Form1._dsSqlTabellen.Tables[1].Columns["Bezeichnung"];
Form1._dsSqlTabellen.Relations.Add("Rel01", parentCol, childCol, true);
bekomme ich sofort die Fehlermeldung: "This constraint cannot be enabled as not all values have corresponding parent values"
Dieser Fehler tritt schon bei der ersten Relation von Tabelle 0 zu Tabelle 1 auf. Es ist aber auch so, das von Tabelle 0 nicht in jeder der anderen Tabelle ein Bezug besteht. Das heiß also ein Datensatz in Tabelle 0 hat evtl. erst einen Partner in Tabell 5 oder tabelle 10. Kann das ein Grund für die Meldung sein?
Ich habe gerade noch etwas festgestellt. Ich lese ja uas einer SQL-Datenbank die Daten in das DataSet. Es besteht aber keine Relations. Wenn ich das DataSet klone, kann ich die Relations und ForeignKeys erzeugen. Also hängt es dasmit zusammen, das es zu jedem Parent-Datensatz eine N-Zahl von Child-Datensätze geben muss. Kann ich das irgendwie deaktivieren, damit die Parent-Child- Beziehung trotzdem wirkt, obwohl es keinen Child-Datensatz zum Parent-Datensatz gibt?
Wer hat eine Idee?- Typ geändert Robert BreitenhoferModerator Dienstag, 10. Januar 2012 17:05 Frage
Alle Antworten
-
Hi,
nur zum Verständnis: Bei einer 1:N beziehung bedeutet dies, dass es nicht zu jedem Parent ein Child geben muss. Es kann 0...N Childs geben.
Aber es muss für jedes Child ein Parent geben!
Die Fehlermeldung deutet also darauf hin, dass es in der Table[1] einen Eintrag in "Bezeichnung" gab, zu dem es in der Tabelle[0] in "Dateiname" kein Gegenstück gab.
Du solltest also Deine Daten einmal diesbezüglich prüfen.
Generell solltest Du bei Datenbanken von Anfang an darauf achten, dass die Relationen immer eingetragen sind, so dass Du gar nicht erst invalide Daten bekommst. Eine Bereinigung kann später ganz schön Kopfschmerzen verursachen.
Aber Du kannst ja Dinge etwas prüfen - was für eine Datenbank hast Du? Da kannst Du ja etwas machen wie:
SELECT * FROM [Table1] WHERE [Bezeichnung] NOT IN (SELECT [Dateiname] FROM [Table0])
Tabellennamen musst Du natürlich anpassen, damit es passt.Mit den besten Grüßen,
Konrad
-
Hallo, es ist aber so, das ich eben in der Parent-Tabelle immer einen Eintrag habe, und aber in den Child-Tabellen Datensätze fehlen. Andersherum wird es nie der Fall sein. Wenn kein Eintra in der Parent-Tabelle , dann auch kein EIntrag in den Child-Tabellen.
Die Daten die ich verarbeite, haben eben diese Struktur. Sonst müsste ich leere DAtensätze anlegen, wenn ein Parentdatensatz nicht überall in allen Child-Tabellen belegt wird.
Wie könnte ich das noch umgehen? ICh möchte eine besonders schnelle Apllikation mit untyp. DataSet und LinQ schaffen.
Also, ich muss Daten aus über 20 DataSet-Tabellen löschen (Datensätze). Dabei habe ich eine Liste mit ca. 5000 Dateinamen, die ich iteriere, und dabei auch die Tabellen iteriere, die DataRows suche und dann lösche. Und das dauert. Deswegen hätte ich gerne das mit den DataRelations, evtl. würde mir das dann Zeitgewinn beim löschen bringen, da ich nur noch in der Tabelle 0 Datensätze löschen muss.- Bearbeitet oema Dienstag, 10. Januar 2012 15:13 Erklärung
-
Also wie ich bereits gesagt habe: Bei einer 1:N Beziehung kann N auch 0 sein. Bist Du sicher, dass die Daten korrekt sind und jedes CHild ein Parent hat? WIe gesagt deutet die Fehlermeldung auf dieses Problem hin:
This constraint cannot be enabled as not all values have corresponding parent values
Also übersetzt in etwas: nicht alle Werte der Child Tabelle haben einen entsprechenden Wert in der Parent Tabelle.
(Und ich wundere mich etwas, dass in den Feldern "Bezeichnung" und "Dateiname" jeweils die gleichen Werte enthalten sein sollen... Aber das sind ja nur Namen und die können frei gewählt werden ...)
Mit den besten Grüßen,
Konrad
-
Ja, stimmt. da muss ich nochmal nachsehen, wieso in den Child was stehen soll und in der Parent nicht. Werde ich untersuchen. Melde mich wieder. Noch was. Kann ich davon ausgehen, das ich einen Geschwindigkeitsvorteil erreiche, wenn ich im DataSet Löschvorgänge durchführe, so wie ich das oben beschreiben habe ?