EF: DataReader Einstellungen wo?

15/07/2009 - 13:40 von Georg Gungl | Report spam
Hallo NG,

ich habe mit EF bisher noch keine Erfahrungen, würde es aber gerne mal
anschauen.
Deshalb heute im Rahmen eines Tesprojekts als DB-Zugriff mal versucht:

+ ADO.NET Entity Data Model "DevDb.edmx"
+ Paar Views unter Beibehaltung der Defaulteinstellungen zum Modell
hinzugefügt (z.B. Zustiege)

Wenn ich nun versuche gleichzeitig mit 2 Abfragen auf die gleiche View
selektierend loszugehen bekomme ich die Fehlermeldung:
"Diesem Befehl ist bereits ein geöffneter DataReader zugeordnet, der zuerst
geschlossen werden muss"

Wie/wo kann ich beeinflussen, wie der DataReader im Hintergrund erzeugt
wird?

Danke,
Ciao:
GG ;-)

P.S.:
Falls die Auswahl doch ein Rolle spielt, hier die entspr. Zeilen:
<code type="cs">
Edmx.OcReiseDaten edmxReiseDaten = new Edmx.OcReiseDaten();

//...

#region Fahrplaene

var fahrplaene = (from f in edmxReiseDaten.Zustiege
select new { f.fahrplan,
f.bezeichnung,
f.tagesversatz }
).Distinct();

if (0 == fahrplaene.Count())
export.Fahrplaene = null;
else
{
export.Fahrplaene = new FahrplanTyp[fahrplaene.Count()];

int i = 0;
foreach (var fahrplan in fahrplaene)
{
export.Fahrplaene[i] = new FahrplanTyp();
export.Fahrplaene[i].Code = fahrplan.fahrplan;
export.Fahrplaene[i].Bezeichnung = fahrplan.bezeichnung;
export.Fahrplaene[i].ZeitTyp = (null == fahrplan.tagesversatz) ?
FahrplanZeitTyp.Zeitdifferenz : FahrplanZeitTyp.Echtzeit;

var haltestellen = from h in edmxReiseDaten.Zustiege
where (h.fahrplan == fahrplan.fahrplan)
orderby h.haltestelle
select h;

// Hier kommt die Exception...
export.Fahrplaene[i].Haltestellen = new
HaltestelleTyp[haltestellen.Count()];

int j = 0;
foreach (var haltestelle in haltestellen)
{
export.Fahrplaene[i].Haltestellen[j] = new HaltestelleTyp();

//...

j++;
}
i++;
}
}

#endregion // Fahrplaene
</code>
 

Lesen sie die antworten

#1 Elmar Boye
15/07/2009 - 13:55 | Warnen spam
Hallo Georg,

"Georg Gungl" schrieb ...
ich habe mit EF bisher noch keine Erfahrungen, würde es aber gerne mal anschauen.

Wenn ich nun versuche gleichzeitig mit 2 Abfragen auf die gleiche View selektierend loszugehen bekomme ich die Fehlermeldung:
"Diesem Befehl ist bereits ein geöffneter DataReader zugeordnet, der zuerst geschlossen werden muss"



Ob es die gleiche View ist, ist letztendlich belanglos.
Wichtig ist vielmehr die Einstellung MultipleActiveResultsets=true
in der Verbindungszeichenfolge, denn nur dann erlaubt der SQL Server
mehr als eine aktiven DataReader für eine Verbindung.


Wie/wo kann ich beeinflussen, wie der DataReader im Hintergrund erzeugt wird?



In der Regel sollte man das Verhalten eher vermeiden und die Daten
nur einmalig abrufen. Mehr dazu findest Du u. a. unter:
http://msdn.microsoft.com/de-de/lib...96272.aspx
Strukturieren von Abfrageergebnissen (Entity Framework)


#region Fahrplaene

var fahrplaene = (from f in edmxReiseDaten.Zustiege
select new { f.fahrplan,
f.bezeichnung,
f.tagesversatz }
).Distinct();

if (0 == fahrplaene.Count())



dieses wiederholte Abrufen von Count ist eher ineffizient ...

export.Fahrplaene = null;
else
{
export.Fahrplaene = new FahrplanTyp[fahrplaene.Count()];



... und wird in Mehrplatzumgebungen schnell gefàhrlich.
Unabhàngig davon dass man eine List<T> einem Array in solchen
Szenarien ohnehin vorziehen würde.

Sinnvoller wàre es, Du rufst die Daten gleich via ToList() ab.
Damit wird die Abfrage ausgeführt und das Ergebnis steht einmalig fest.

// Hier kommt die Exception...
export.Fahrplaene[i].Haltestellen = new HaltestelleTyp[haltestellen.Count()];



Hier gleiches in Grün.
Wobei die Exception schon verschwinden würde, wenn Du die
Daten in eine Liste abgerufen hàttest.

Gruß Elmar

Ähnliche fragen