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
Hallo Grimmbizkit,
arbeite bei solchen Geschichten mit usings. (Sprich: Dispose).
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Ich lasse mir da gerne Tipps geben.
Was hältst du denn für besser?
Gruß Simon
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Morgen,
leider brauchte das einfügen von Using(...) keine besserung meines Problems
😦
Gruß Simon
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
Dazu auch [Hinweis] Wie poste ich richtig? 1.1 bevor das hier ein Endlosthema wird.
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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
@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.