Laden...

Fragen zur Relation

Letzter Beitrag vor 17 Jahren 9 Posts 2.053 Views
Fragen zur Relation

Hi habe zwei Fragen zu dem SQL Server 2005 und ADO.NET - DataTable.

Frage1:
Wenn ich zwischen zwei Tabellen im SQL Server eine Relation ("Beziehung") aufgebaut habe und in der Haupttabelle(z.b "Kontinente") einen Eintrag lösche, wird dann auch in der Tabelle "Länder" alle Länder von dem zugehörigen Kontinent gleich mitgelöscht?

Frage 2:
Ich habe ein DataTable in meiner SQLTable Klasse, in der ich eine egal welche Tabelle im SQL-Server2005 Express verarbeiten will.

Die klasse soll auch ein alleskönner in Sachen Relationen werden. Wenn die Tabelle eine Relation im SQLServer2005 besutzt dann wäre es doch super wenn man dies auch umsetzt.

Den Primary Key kann man ganz einfach ergänzen:
dt.PrimaryKey = new DataColumn[] {dt.Columns["KundenCode"]}
Da gebe ich nur an welches Feld in der Tabelle der Primary Key ist.

Im Fall wenn die DataTable ein foreignKey besitzt ist das Problem, dass ich die DataTable von der MasterTabelle haben muss, also ein weitere vollgeladene Tabelle.
Kann man das umgehen, ich hoffe ihr wisst auf was ich hinauswill 🙂

Gruß Kevin

tss..

Hallo KevinWinter

Zu Frage 1:
Schau dir mal ForeignKeyConstraint.DeleteRule bzw. ForeignKeyConstraint.UpdateRule an. Die ConstraintCollection erreichst du über DataTable.Constraints.

In der MSN Doku hats bei der ForeignKeyConstraint Klasse ein gutes Beispiel. Der Onlinelink wäre http://msdn2.microsoft.com/en-us/library/st1t2c35(VS.80).aspx.

Gruss,
.unreal

edit: Link fixed

Das dies mit ForeignKeyConstraint Funktioniert funktioniert ist gut. Aber das hilft nur bediengt weiter.

Ich verusche gerade ein O/R Mapping zu schreiben und benutzte dafür eine Klasse SQLTable die ein DataTable als Tabellenspeicher benutze.

Für einfache Tabellen mit oder ohne Unique ist das Okey, kann auch wie oben beschrieben ein Primary Key anlegen, wenn ich aber ForeignKeyConstrain anlegen will, brauche ich die Info von einer zusätzlichen DataTable.

Siehe:
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
custDS.Tables["CustTable"].Columns["CustomerID"],
custDS.Tables["OrdersTable"].Columns["CustomerID"]);

Ich will doch nur sagen, hallo DataSet, wenn du was löschst und du hast einen PrimaryKey dann lösche auch die Einträge in den Child - Tabellen im SQL Server.

tss..

Hallo KevinWinter

Original von KevinWinter
wenn ich aber ForeignKeyConstrain anlegen will, brauche ich die Info von einer zusätzlichen DataTable

Die brauchst du immer, ansonsten kann dein DS ja gar nicht wissen, ob irgend ein ForeignKey auf dein PrimaryKey zeigt. Wie soll das DataSet sonst wissen, wo eine Relation besteht?

Gruss,
.unreal

Ich glaube das Problem gefunden zu haben.

Im SQLServer2005 habe ich beim anlegen der Tabellen gleich die Beziewhungen eingefügt.

Wenn ich in der Tabelle Kontinent den Eintrag Afrika lösche, will ich in der Tabelle Länder alle Afrikanischen Länder gelöscht haben.

Wie oder Was muss ich im Datenbank Explorer tun, um diese automatisierung zu erlangen, oder ist die schon Standardgemäß so eingerichten, wenn ich eine Beiehung zwischen zwei Tabellen erstelle.

Gru0 Kevin

tss..

Hallo KevinWinter

Nun ist deine Frage klar 🙂. Wir sind hier nicht in einer Anwendung sondern auf der SQL-Server Ebene. Dies ist relativ einfach: Rechtsklick auf eine Tabelle/Modify. Dort im Fenster oben auf Table Designer/Relationships... Das letzte einstellbaren Property mit dem Plus aufklappen, dort kannst du Delete/Update Rule auf Cascade setzen.

Diese Funktion ist mit hoher Vorsicht zu geniessen.

Gruss,
.unreal

Anfangs habe ich es auf der Anwendungsebene versucht, wie duu oben lesen kannst, aber auf SQL Swerver Ebene ist das total auch möglich. Aber ich habe die den SQLServer 2005 Express.

Bin jetzt nochmal in die Beziehungseinstellungen rein, wie du gesagt hast, schau dir mal den Scrrenshot an, klaube da müsste ich was umstellen....

tss..

Habe wie du meinst diese Eisntellung gefunden aber ich kann nur folgende Optionen setzten:

  • NULL festlegen
  • Keine Aktion
  • Überlappend
  • Standart festlegen

Da ist aber kein Cascade drinn 🙁

gruß Kevin

tss..

Hallo KevinWinter

Na, Cascade ist auch Englisch.

  • NULL Festlegen -> setzt NULL als FK (wird nix gelöscht, aber Verbindung ist weg)
  • Keine Aktion -> Wird wohl ein Fehler Geben und sagen, dass der Parent-Datensatz nicht gelöscht werden kann, da Childs vorhanden
  • Überlappen -> Wird wohl Cascade sein
  • Standard festlegen -> Ich nehm an: Wie NULL Festlegen, nur kann man anstatt NULL nen beliebigen Wert geben

Gruss,
.unreal

P.S Installier den Manager auf Englisch

edit:
"überlappen"... naja, ich sage mal das ist Cascade weils nix anderes gibt 🙂 Scheiss übersetzung...