Laden...

Wie umgehe ich offene DataRaeder?

Erstellt von Grimmbizkit vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.265 Views
G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 9 Jahren
Wie umgehe ich offene DataRaeder?

verwendetes Datenbanksystem: SQL

Hallo zusammen,

ich habe eine Frage, wie umgehe ich offene DataReader?

ich habe ein Formular mit 3 DataGridViews
Die daten werden geladen mit:


SqlCommand cmdS = new SqlCommand(cmd, conn);
SqlDataAdapter daChd = new SqlDataAdapter(cmdS);
daChd.Fill(dtChildTab);

Es werden pro grid verschiedenen daten geladen.

Wenn die Daten nun zu schnell geladen werden, sagt mit C# es gibt noch einen offenen Reader. Was mache ich das falsch

Gruß Simon

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Grimmbizkit,

arbeite bei solchen Geschichten mit usings. (Sprich: Dispose).

Gruss

Coffeebean

G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 9 Jahren

Hallo Coffeebean,

also so:





SqlCommand cmdS = new SqlCommand(cmd, conn);

using (SqlDataAdapter daChd = new SqlDataAdapter(cmdS))
{
    daChd.Fill(dtChildTab);
}
return dtChildTab

Das ganze ist in einer Klasse mit allen SqlBefehlen.
dtChildTab kommt als ref Parameter rein.


internal void ZuordGetChildData(Stammdaten.ZuordTyp typ, string masterNr, ref DataTable dtChildTab)

Gruß Simon

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Grimmbizkit,

wieso benutzt du ref-parameter? Brauchst du nicht. Wie du deine Sachen organisierst soll nicht das Thema sein. Aber was du Disposen kannst, solltest du auch tun. Mit Usings, wie dus in deinem zweiten Code schon gemacht hast. Möglichst überall, wo du was disposen kannst, arbeite mit Usings.

Gruss

Coffeebean

G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 9 Jahren

Ich lasse mir da gerne Tipps geben.
Was hältst du denn für besser?

  • Connection zum Server einmal (zentral) öffnen/schließen oder pro Methode?
  • Kann ich meinen zweiten Code noch besser machen? Usings für den Command schon?

Gruß Simon

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Grimmbizkit,

da sind wir ganz schnell beim Thema "Architektur". Grundsätzlich: Klar, öffne und schliesse die DB-Verbindung sauber da, wo du sie brauchst.

Ich wiederhole mich, wenn ich sage: Usings da, wo du usings gebrauchen kannst. (Findest aber zu deinem Beispiel genug Sachen im Internet).

Lager deine Sachen in Services/Repositories aus und gib zurück, was du zurückgegeben haben möchtest. Beachte die Seperation of Concerns und die Testbarkeit, dann fährst du schonmal nicht schlecht. Mache dir Schichten (UI/Logik/Datenbankzugriff).

Beachte bitte vorsorglich: [Hinweis] Wie poste ich richtig? Punkt 1.1 und Punkt 1.1.1

Gruss

Coffeebean

G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 9 Jahren

Morgen,

leider brauchte das einfügen von Using(...) keine besserung meines Problems

😦

Gruß Simon

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Grimmbizkit,

die Exception sagt, dass du einen offenen Reader hast. Den sehen wir hier in deinem Code nicht. Daher: Packe auch den Reader in ein Using. Du hast irgendwo noch einen offenen Reader rumfliegen.

Google-Suche nach There is already an open datareader asso dataadapter fill

Gruss

Coffeebean

Hinweis von Abt vor 9 Jahren

Dazu auch [Hinweis] Wie poste ich richtig? 1.1 bevor das hier ein Endlosthema wird.

3.825 Beiträge seit 2006
vor 9 Jahren

Was hältst du denn für besser?

  • Connection zum Server einmal (zentral) öffnen/schließen oder pro Methode?

Lies dazu : [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 9 Jahren

@Grimmbizkit:
Das kommt weil du die Grundlagen und unsere Artikel hier nicht gelesen hast.
Du benutzt eine Connection im Programm, und zusätzlich willst du nicht verstehen was man dir sagt.

DataAdapter hat auch eine Überladung wo man Sql und Connectionstring übergeben kann.