DataReader-Problem

27/05/2008 - 08:48 von Andreas | Report spam
Hallo Zusammen,

ich schreibe an mehreren Stellen Daten in eine MySQL-Tabelle. Dabei verwende
ich überall die gleiche Variable (Public MySQL_Cmd as DbCommand).

Um Daten zu lesen, verwende ich einen DbDataReader.

Mein Problem ist nun, dass sporadisch folgende Fehlermeldung auftritt:
"Diesem Befehl ist bereits ein geöffneter DataReader zugeordnet, der zuerst
geschlossen werden muss."

Dort, wo ich den DataReader anwende, wird er am Ende auch wieder
geschlossen, sprich ich weiß nicht genau, wo der Fehler liegt. Jetzt bin ich
am überlegen, ob ich viell. für jede Verwendung einen eigenen DataReader
deklariere bzw. auch eine eigene Variable für das DBCommand.

Ist das sinnvoll oder gibt es eine andere Möglichkeit, sicherzustellen, dass
der DataReader, sobald er verwendet wird, auch wieder geschlossen wird?

Gruß & Danke
Andreas
 

Lesen sie die antworten

#1 Elmar Boye
27/05/2008 - 10:43 | Warnen spam
Hallo Andreas,

Andreas schrieb:
ich schreibe an mehreren Stellen Daten in eine MySQL-Tabelle. Dabei verwende
ich überall die gleiche Variable (Public MySQL_Cmd as DbCommand).



Das solltest Du sobald möglich vollstàndig beseitigen...
Öffentliche Variablen sollte man in Datenbank-Zugriffsroutinen
vollstàndig vermeiden.

Um Daten zu lesen, verwende ich einen DbDataReader.

Mein Problem ist nun, dass sporadisch folgende Fehlermeldung auftritt:
"Diesem Befehl ist bereits ein geöffneter DataReader zugeordnet, der zuerst
geschlossen werden muss."

Dort, wo ich den DataReader anwende, wird er am Ende auch wieder
geschlossen, sprich ich weiß nicht genau, wo der Fehler liegt.



Auch wenn Du alles schließt, kann schnell das Problem, entstehen dass
Du an untergeordneter Stelle einen weiteren aufmachen willst.
Und nicht nur, dass für hàufig für eine DbCommand Ableitung (wie
MySqlCommand oder andere) nur ein aktiver DataReader zulàssig ist,
oftmals gilt das auch für die Verbindung.

Jetzt bin ich
am überlegen, ob ich viell. für jede Verwendung einen eigenen DataReader
deklariere bzw. auch eine eigene Variable für das DBCommand.
Ist das sinnvoll oder gibt es eine andere Möglichkeit, sicherzustellen, dass
der DataReader, sobald er verwendet wird, auch wieder geschlossen wird?



Um die wenigsten Abhàngigkeiten zu haben solltest Du die Instanzen
so weit wie möglich lokal halten. Und alle Instanzen sobald als möglich
mittels "using" (Dispose Pattern) freigeben. Ein Grundmuster wàre:

Using connection As New MySqlConnection(My.Settings.ConnectionString)
connection.Open()
Using Command As New MySqlCommand("SELECT...", connection)
Using reader As MySqlDataReader = Command.ExecuteReader(CommandBehavior.CloseConnection)
' Verarbeitung ...
End Using
End Using
End Using

Ist die Verarbeitung komplexer und auf mehrere Methoden verteilt,
solltest Du das ganze in eine Klasse kapseln und dort ggf. mit einer
lokalen Instanz arbeiten (1. Wahl) oder den DataReader an die Methode
übergeben (2. Wahl -für bestehenden Code).

Gruß Elmar

Ähnliche fragen