Benutzer mit den meisten Antworten
OUTER APPLY Anweisung im DataTableAdapter

Frage
-
Hallo!
Ich möchte in einem SQL-Statement eines DataTableAdapters den OUTER APPLY Operator (Ab SQL 2005 definiert) verwenden.
Bei der Erstellung des TableAdapters mit dem VS-Assistenten bekomme ich die Fehlermeldung:
Das SQL-Konstrukt oder die Anweisung: "OUTER APPLY" wird nicht unterstützt.
Da es relativ wenig alternativen für die Lösung der SQL Abfrage gibt, meine Frage, kann man das umgehen?
Fred.
PS:
Im SQL Server Management Studio wird das SQL Statement natürlich fehlerfrei ausgeführt.
- Bearbeitet perlfred Freitag, 24. August 2012 12:03 Frage eindeutiger formuliert
Antworten
-
Hallo Fred und Stefan,
Da es relativ wenig Alternativen für die Lösung der SQL Abfrage gibt, meine Frage, kann man das umgehen?
Einige Zusatztipps: Da es sich oberflächlich betrachtet um ein Designer-Problem handelt, könnte man auch versucht sein, die "OUTER APPLY"-Anweisung direkt im Designer-Code einzupflegen ([DataSet].Designer.cs), und zwar in InitCommandCollection(). Das eigentliche Problem besteht aber leider darin, dass eine OUTER APPLY-Abfrage potentiell Datensätze mit duplizierten Privatschlüsseln zurückgibt, was in den meisten Fällen zu einer ConstraintException führt. Freilich könnte man DataSet.EnforceConstraints auf false setzen und die Fill()-Methode würde dann sogar funktionieren. Öffnet man aber später mal den Designer sind alle Änderungen verloren.Eine zweite Möglichkeit wäre einfach die Klasse SqlCommand zu verwenden. Über DataTable.Load(SqlDataReader) oder new SqlDataAdapter(SqlCommand).Fill(DataTable) könnte man ganz einfach an die Daten kommen. Diesen Code könnte man in der [DataSet].cs in eine Methode zur partiellen Klasse des jeweiligen Adapters kapseln, so dass der Zugriff ebenfalls bequem über SqlDataAdapter erfolgen könnte.
Gruß
Marcel- Als Antwort markiert perlfred Montag, 27. August 2012 15:07
Alle Antworten
-
Hallo Fred und Stefan,
Da es relativ wenig Alternativen für die Lösung der SQL Abfrage gibt, meine Frage, kann man das umgehen?
Einige Zusatztipps: Da es sich oberflächlich betrachtet um ein Designer-Problem handelt, könnte man auch versucht sein, die "OUTER APPLY"-Anweisung direkt im Designer-Code einzupflegen ([DataSet].Designer.cs), und zwar in InitCommandCollection(). Das eigentliche Problem besteht aber leider darin, dass eine OUTER APPLY-Abfrage potentiell Datensätze mit duplizierten Privatschlüsseln zurückgibt, was in den meisten Fällen zu einer ConstraintException führt. Freilich könnte man DataSet.EnforceConstraints auf false setzen und die Fill()-Methode würde dann sogar funktionieren. Öffnet man aber später mal den Designer sind alle Änderungen verloren.Eine zweite Möglichkeit wäre einfach die Klasse SqlCommand zu verwenden. Über DataTable.Load(SqlDataReader) oder new SqlDataAdapter(SqlCommand).Fill(DataTable) könnte man ganz einfach an die Daten kommen. Diesen Code könnte man in der [DataSet].cs in eine Methode zur partiellen Klasse des jeweiligen Adapters kapseln, so dass der Zugriff ebenfalls bequem über SqlDataAdapter erfolgen könnte.
Gruß
Marcel- Als Antwort markiert perlfred Montag, 27. August 2012 15:07
-
Hallo Fred,
Der Outer Apply ergibt zunächst mal ein kartesisches Produkt.
Der Tableadapter basiert auf der Annahme das es Primary Keys gibt. Die Werte müssen eindeutig sein.
Ohne es getestet zu haben: das soll nicht funktionieren können.Grüße Alexander
-
Hallo Marcel!
Mit so einen Hintergrundwissen zu programmieren mach ja richtig Spass!
new SqlDataAdapter(SqlCommand).Fill(DataTable) könnte man ganz einfach an die Daten kommen. Diesen Code könnte man in der [DataSet].cs in eine Methode zur partiellen Klasse des jeweiligen Adapters kapseln, so dass der Zugriff ebenfalls bequem über SqlDataAdapter erfolgen könnte.
Genau so funktioniert es 100%ig !!! mit Apply-Abfragen!
Vielen Dank für diese Lösung!!!!!
Fred.