LINQ to SQL-Klassen: Fehlermeldung nach Ausführung einer "gespeicherten Prozedur"

17/04/2008 - 18:46 von Oskar Vaia | Report spam
Hallo,

ich versuche von meinem SQL-Server über ein LINQ zu SQL-Klassen-Element
Daten über eine gespeicherte Prozedur in meine Anwendung zu bekommen:

Hier kurz der Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim dc = New xenia2DataContext()

Dim resultsR = From r In dc.ProvBerechn(20080331,
CType(Val(TextBox2.Text.ToString), Int32))

RaiseEvent AnzahlKunden(resultsR.First.n_doc, resultsR.Count)
End Sub

Bei dem Ausführung der Zeile:
RaiseEvent AnzahlKunden(resultsR.First.n_doc, resultsR.Count)
erhalte ich folgende Fehlermeldung:


InvalidOperation Exception wurde nicht von Benutzercode behandelt.
Die Abfrageergebnisse können höchstens einmal enumeriert werden.


Was hat die Meldung zu bedeuten?
Ich verwende VB 2008.

Dank und Grüße

Oskar
 

Lesen sie die antworten

#1 Elmar Boye
18/04/2008 - 10:35 | Warnen spam
Hallo Oskar,

Oskar Vaia schrieb:
ich versuche von meinem SQL-Server über ein LINQ zu SQL-Klassen-Element
Daten über eine gespeicherte Prozedur in meine Anwendung zu bekommen:

Hier kurz der Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim dc = New xenia2DataContext()

Dim resultsR = From r In dc.ProvBerechn(20080331, _


CType(Val(TextBox2.Text.ToString), Int32))

Nebenbei: Ich hoffe das ist nur Testcode, denn Eingabeparameter
solltest Du etwas besser überprüfen.


RaiseEvent AnzahlKunden(resultsR.First.n_doc, resultsR.Count)
End Sub

Bei dem Ausführung der Zeile:
RaiseEvent AnzahlKunden(resultsR.First.n_doc, resultsR.Count)
erhalte ich folgende Fehlermeldung:

InvalidOperation Exception wurde nicht von Benutzercode behandelt.
Die Abfrageergebnisse können höchstens einmal enumeriert werden.



Die Meldung sagt ziemlich deutlich, wo das Problem liegt:
Der Aufruf einer Prozedur liefert ein ISingleResult, das entspricht
sinngemàß einem ADO.NET (Sql)DataReader. Und der kann bekanntlich
nur einmalig durchlaufen werden.
Im Kontext von Linq (To Sql) wird ist ein ISingleResult ein
IEnumerable<T> (also eine Enumeration).

Nun versuchst Du aber mit den Funktionen First und Count im RaiseEvent
die Auflistung zu durchlaufen.

Eine Lösung wàre das Ergebnis in eine List(Of T) umzuwandeln:
Dim resultsR = From r In dc.ProvBerechn(...).ToList()

damit wird das Ergebnis abgerufen und in eine Liste umgewandelt.
Diese kann dann beliebig oft enumeriert werden.

Wobei man grundsàtzlich sagen muß, daß Du dadurch ziemlich
ineffizienten Code erhàlst. Denn Du rufst u. U. eine Menge Daten
ab, um am Ende nur das erste Element und die Anzahl der Elemente
zu übergeben.
Was auch eine der größte Gefahren von Linq ist, da man nicht
mehr direkt sieht, was im Hintergrund so alles passiert.

Gruß Elmar

Ähnliche fragen