Foreign Key Problem

05/10/2008 - 13:56 von Harald Bacik | Report spam
Hallo NG

Ich arbeite mit VB2008+SP1 & stehe gerade vor einem kleinen Ràtsel.

Folgende Situation: Ich habe 2 Tabellen, die per Foreign-Key Klausel
miteinander verbunden sind.
Ich habe jetzt ein DataSet erstellt, dass aber eine Where Klausel
beinhaltet. - D.h. der Parent Table des DataSet's hat schon eine
Einschrànkung. - Wenn ich jetzt versuche "alle" Daten der Child Table zu
laden bekomme ich (logischerweise) eine Fehlermeldung, dass ich die
Foreign-Keys nicht berücksichtige.

Wie gehe ich da jetzt richtig vor?

DANKE im Voraus
 

Lesen sie die antworten

#1 Elmar Boye
06/10/2008 - 11:36 | Warnen spam
Hallo Harald,

Harald Bacik schrieb:
Folgende Situation: Ich habe 2 Tabellen, die per Foreign-Key Klausel
miteinander verbunden sind.
Ich habe jetzt ein DataSet erstellt, dass aber eine Where Klausel
beinhaltet. - D.h. der Parent Table des DataSet's hat schon eine
Einschrànkung. - Wenn ich jetzt versuche "alle" Daten der Child Table zu
laden bekomme ich (logischerweise) eine Fehlermeldung, dass ich die
Foreign-Keys nicht berücksichtige.



Du hast zwei Möglichkeiten:
Erstens (die bessere): Verwende die Einschrànkung auch für die
Child Tabelle(n). Das kann in Form eines JOINs geschenen.
Beispielhaft ausgehend von den Customersder Northwind wàre das:
SELECT * FROM dbo.Customers AS c
WHERE c.Country = @Country /* N'Germany' */
und für die Orders dann:
SELECT o.* FROM dbo.Orders AS o
INNER JOIN dbo.Customers AS c
ON o.CustomerID = c.CustomerID
WHERE c.Country = @Country /* N'Germany' */
und àquivalent die Order Details usw.
Bei Providern wie dem SQL Client die Batchfàhig sind, kann
das mit einem einzigen Adapter geschehen.

Zweitens (die schlechtere, vor allem wenn es viele Parent Zeilen sind):
Verwende eine Abfrage, die jeweils den Verknüpfungsschlüssel enthàlt,
für oben also:
SELECT o.* FROM dbo.Orders AS o
WHERE CustomerID = @CustomerID
und iteriere über die Rows der Parent Tabelle und führe die
Abfrage je Parent aus.
Die DataTable darf nur einmalig am Anfang gelöscht werden
und die Zeilen werden dann hinzugefügt werden - bei Typed DataSets
zu beachten, wo ClearBeforeFill im Standard auf True steht.

Die Methode eignet sich eher, wenn man die Child Daten verzögert
laden will, um den Speicher zu schonen und die jeweils aktuellen
anzeigen möchte.

Gruß Elmar

Ähnliche fragen