Frage

Ich verwende VS2008 C # Express und die Northwind-Datenbank auf einer Windows Forms-Anwendung.

Ich habe per Drag & Drop die Stamm Details Bindung (I die Bestellungen verwendet und Bestelldaten) zur Einrichtung für die beiden datagridviews. An diesem Punkt funktioniert alles wie erwartet. Um nicht jede Zeile in der Tabelle zurückzukehren, mag ich auf die Tabelle Orders filtern, basierend auf einem Filter für die Tabelle Orders und auch auf einem Feld in der Orders Tabelle Details. Im Tableadapter-Konfigurations-Assistenten, verwenden ich den Query Builder einen neuen FillByMyFilter hinzuzufügen, die die folgende Abfrage erstellt:

SELECT Orders. [Order ID], Aufträge. [Customer ID], Aufträge. [Employee ID] Orders. [Schiffsname], Aufträge. [Schiff Adresse] Bestellungen. [Ship City], Aufträge. [Schiff Region],                       Bestellungen. [Schiff Postleitzahl] Orders. [Schiff Land], Bestellungen. [Schiff Via] Orders. [Bestelldatum] Orders. [Erforderlich Datum], Aufträge. [Versanddatum]                       Orders.Freight FROM Orders INNER JOIN                       [Order Details] auf Bestellungen. [Order ID] = [Order Details]. [Order ID] WHERE (Orders. [Schiffsname] LIKE N'A% ') und ([Order Details] .Quantity <20)

Ich habe dies durch die beiden Tabellen hinzugefügt, aber in der Tabelle Order Details jeden der Feld Boxen nicht überprüfen, so dass es nur die Spalten zurückgeben würde, die in der ursprünglichen Fill Abfrage verwendet wurden. Ich versuche nur an dieser Stelle das DataSet in der Haupttabelle zu filtern und nicht eine andere Anzahl von Spalten zurück. Kinder Reihen der Order Details sollten wie die Standard ungefilterten Ergebnismenge immer noch funktionieren.

Nun das Problem: Wenn ich die Schaltfläche Abfrage ausführen klicken, um es funktioniert gut. Ich erhalte 53 Zeilen aus der obigen Abfrage statt der 1078 den Standard-Fill von dem Designer erstellt. Es gibt die gleichen Spalten wie die ursprüngliche Füllung Abfrage. Aber wenn ich versuche, und führen Sie die Anwendung ich die folgende Einschränkung Fehler:

"Fehler bei Einschränkung zu ermöglichen. Eine oder mehr Zeilen Werte enthalten Verstoß gegen Nicht-Null, eindeutiges oder Fremdschlüssel-Constraints."

Was mache ich falsch?

UPDATE: Ich glaube, ich bin die Einschränkung Fehler bekommen, weil der INNER vom Assistenten erstellt JOIN. Wenn ich die Abfrage bearbeiten, um LEFT JOIN verwenden Sie dann den Assistenten, es zu INNER JOIN wechselt zurück.

Meine Frage steht immer noch als, wie Datensätze in der übergeordneten Tabelle filtern (Aufträge), basierend auf Kriterien sowohl von der Eltern-Kind-Tabelle. Mein nächster Test ist eine gespeicherte Prozedur, um zu versuchen und verwenden möchte aber nur die Table benutzerdefinierte FillBy Methode kennen.

Grüße,

debug

War es hilfreich?

Lösung 3

Danke an alle, die eine Antwort geschrieben. Hier ist, wie ich es tat die Tableadapter-Assistenten und die Nordwind-Datensatz eingegeben hat.

1) Rechtsklick auf die Übergeordnete Tabelle in den XSD-Designern, um die Abfrage hinzuzufügen oder zu konfigurieren. 2) Klicken Sie auf die Schaltfläche „Weiter“ im Assistenten, bis Sie die „Query Builder“ Knopf. Klicken Sie auf die Schaltfläche Query Builder, sich in der Query Builder-Modus zu gelangen. 3) Rechts klicken und die untergeordnete Tabelle in das Design-Fenster hinzuzufügen. Sie sollten beide Tabellen und die Standardeinschränkung haben, die sie verbindet. 4) Klicken Sie auf die Spalte auf der untergeordneten Tabelle, die Sie (das Häkchen filtern möchten später) entfernt werden, um es den Kriterien hinzufügen Teilfenster, so können Sie es filtern. 5) Fügen Sie die Filter für die Eltern-Kind-Spalt. In diesem Beispiel gefiltert ich den Schiffsnamen LIKE ‚A%‘ und die Bestellmenge <20.

Beachten Sie, dass an dieser Stelle Sie Ihre Abfrage durch Klicken auf die Schaltfläche Abfrage ausführen testen. Mit Hilfe der Northwind DB für SQL 2008 Compact Edition erhalte ich 53 Zeilen zurückgegeben. Wenn Sie es an dieser Stelle zu retten wären, würde es wegen des doppelten Primärschlüssels in der Ergebnismenge zur Laufzeit fehlschlagen. So sind die nächsten Schritte von ‚em loszuwerden.

6) in der Kriterienbereich, deaktivieren Sie das Kind Tabellenspalte, die Sie zuvor hinzugefügt. Der Filter wird bleiben und die gleiche Spalte wird nun auch in den Design-Fenstern deaktivieren werden. Wenn Sie die Abfrage ausführen haben Sie noch 53 Zeilen, aber ohne das Kind Tabellenspalte. 7) Rechtsklick auf das Design-Fenster und fügen Sie die „Group By“. An diesem Punkt, wenn Sie diese Abfrage ausführen, sollten Sie keine Duplikate in der Bestell-ID haben. Ich habe genau 29 Zeilen zurückgegeben. 8) Klicken Sie auf OK und dann auf die Schaltfläche „Weiter“, bis Sie Ihre neue FillBy Abfrage speichern. 9) ändern Sie den Quellcode Ihre neue FillBy zu verwenden.

Wenn ich die Anwendung lief, bekam ich die gefilterte Übergeordnete Tabelle mit den gleichen 29 Zeilen, die die Execute-Schaltfläche Abfrage zurückgegeben. Das Kind Tabelle arbeitete als erwartet und enthalten mindestens ein Kind Zeile, die eine Menge von <20 enthalten sind.

Für eine reale Anwendung, ich denke, es wäre besser, eine gespeicherte Prozedur oder LINQ zu verwenden. Aber dieses Problem hatte ich meinen Kopf kratzen und so ich „machte sie paßt“, nur weil es eine Herausforderung, (zumindest für mich) war.

Andere Tipps

Dieser Artikel enthält einige Vorschläge zur Fehlerbehebung die genaue Zeile verursacht das Problem zu lokalisieren:

DataSet Hölle - "fehlgeschlagen Einschränkungen aktivieren Eine oder mehr Zeilen enthalten Werte ...."

Wenn Sie die Orders.Designer.cs aussehen in (erraten, wie ich in VB arbeite), werden Sie wahrscheinlich eine eindeutige Einschränkung auf Bestellungen definiert sehen (für den Primärschlüssel).

Ich vermute, dass das Problem ist, wenn Sie Ihre Abfrage ausführen, Sie werden immer eine oder mehrere individuelle Bestellung wer hat> 1 OrderDetails.Quanity> 20 .... so wird die Bestellung zweimal in Ihrer resultset zurückgegeben werden, verletzen die Primärschlüssel.

Versuchen: SELECT * von Aufträgen, bei denen [Schiffsnamen] LIKE ‚% was auch immer% und OrderID in (wählen OrderID von Orderdetails wo Menge <20)

Dies ist wahrscheinlich ein sehr ineffizienter Weg, es zu tun, im Orakel würden Sie EXISTS () anstelle von IN () verwenden, aber ich weiß nicht, den SQL Server-äquivalent.

Hoffe, du hast diese beantwortet, aber wenn nicht, gibt dies einen Gedanken.

In ihrem Datensatz, wenn die Order und Orderdetail Tables eine Beziehung zwischen ihnen hat, dann funktioniert es etwas wie ein Zwang FK. So kann es keine Aufzeichnungen werden in der untergeordneten Tabelle (Orderdetail), die keine cooresponding Elternteil (Order) aufnehmen müssen. Also, was kann geschehen, wenn Sie die Bestellung Datatable zu aktualisieren, mit der Abfrage, die Sie oben erwähnt, gibt es noch Kind Zeilen in der Tabelle Orderdetail sind die refrernces zu Parent (Order) Aufzeichnungen haben, die nicht mehr da nach der Auffrischung sein wird. Das heißt, wenn Sie die Bestellung Datatable aktualisieren Sie müssen auch die Orderdetail Datentabelle aktualisieren, oder die Beziehung zwischen den beiden Tables entfernen.

Hope, das hilft ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top