There is already an open datareader assiciated with this connection, which must be closed first.

27/12/2010 - 18:58 von Jan Kornblum | Report spam
Hallöchen an Alle, die zwischen den Jahren auch arbeiten müssen,

eine Windows Forms Anwendung sieht in etwa so aus:

1) ein "Haupt-" Grid
2) weitere "Detail-" Grids mit den Details zu dem in 1) selektierten
Datensatz (aus anderen Tabellen, mit teils sehr komplexer Select-Logik)

Die Grids sind an eigene DataTables gebunden. Über das
"CurrentChanged"-Event (CurrencyManager) werden die "Detail-" Grids
jweiles neu befüllt, wenn sich der Datensatz im "Haupt-" Grid àndert.
Für das Befüllen des "Haupt-" Grids und der anderen Grids wird ein und
dieselbe DB-Connection verwendet.

Funktioniert auch soweit ganz gut. Nun muss das Hauptgrid allerdings
alle 10 Sekunden automatisch aktualisiert werden, was momentan über
einen "Timer.tick" ablàuft.

Hier klappts dann nicht mehr, sobald die DataAdapter.Fill Methode für
eines der "Child"-Grids ausgeführt wird: "There is already an open
datareader assiciated with this connection, which must be closed
first."

Theoretisch làuft ja Folgendes ab:

1. DataAdapterHaupt.Fill(DataTableHaupt)
2. CurrencyManagerHaupt.CurrentChanged -> wird ausgelöst
3. DataAdapterDetail1.Fill(DataTableDetail1) -> Fehler "Open
Datareader"

Wenn ich "manuell" den aktuellen Datensatz im Hauptgrid wechsle (Durch
Klicken in andere Zeile), klappts, obwohl dabei ja eigentlich auch die
obigen 3 Schritte ablaufen!? Liegt also irgendwie daran, dass es nicht
klappt, wenn der ganze Vorgang "vom Timer.tick initiiert wurde", kann
das sein?

Schafft hier ein BackgroundWorker abhilfe?? Und falls ja, wie stellt
man das an, da die Objekte ja wowohl vom Backgroundworker als auch vom
Frontend / User Interface verwendet werden??? Habe mal gelesen, hier
müsste man trennen...

Lieben Gruß

Jan
 

Lesen sie die antworten

#1 Peter Fleischer
31/12/2010 - 19:48 | Warnen spam
Hi Jan,
ohne die konkrete Aufgabenstellung zu kennen, ist es schwer, eine optimale
Lösung zu skizzieren. Ich versuche die Nutzung global gültiger Variablen zu
reduzieren. Member, die nur mit lokalen (innerhalb der Member deklarierten)
und formalen Parametern auskommen, sind ohne weitere Zutaten
multi-threadfàhig und auch leichter testbar.

Wenn mehrere Parameter zu übergeben sind, dann sollten diese gekapselt
übergeben werden. Im konkreten Beispiel wàre das anstellte FK gleich ein
Verweis auf das Datenobjekt. Aus ihm können dann die Details wie FK
extrahiert werden.

Peter

Ähnliche fragen