Benutzer mit den meisten Antworten
ExecuteReader erfordert eine geöffnete und verfügbare Verbindung. Der aktuelle Status der Verbindung ist 'Geöffnet'.

Frage
-
Hallo NG,
bei unserem Projekt bekomme ich oft o.g. Meldung, die ja eigentlich ein Wiederspruch ist.Im konkreten Fall nutze ich einen SqlDataAdapter, wo man ja nicht unbedingt die Connection öffnen muss.
[InvalidOperationException: ExecuteReader erfordert eine geöffnete und verfügbare Verbindung. Der aktuelle Status der Verbindung ist 'Geöffnet'.]
System.Data.SqlClient.SqlConnection.GetOpenConnection(String method) +4925084
System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +11
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130
System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) +162
System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +115
Proced.TRV_Popul(TreeNode Node, Int32 UNr, Int32 Deep, Int32 Filter, Boolean Einh, Boolean Lose, Boolean del, Boolean DAnz) +1434Ich werde nun mal versuchen, trotzdem die Connection zu öffnen, mal sehen, ob das hilft, aber so recht kann ich mir keinen Reim darauf machen.
Kennt jemand das Problem und eine Lösung?
Uwe
Mittelung vom Forum
Antworten
-
Hi Uwe,
nein, ich meine Using Adapter im Using-Scope der SqlConnection:using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connLGV"].ToString())) { using (SqlDataAdapter cmd1 = new SqlDataAdapter(qry, con)) { cmd1.Fill(dt); } }
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert uwe domschke Freitag, 17. August 2018 07:11
Alle Antworten
-
Hi Uwe,
dieser Widerspruch (nur mit einen i anstelle ie :-) kann in einer Web-Anwendung entstehen, wenn die Verbindung nicht separat in der Methode mit using genutzt wird. Da kann es möglich sein, dass eins parallele Anfrage die Verbindung trennt und die eigentliche Anfrage in dieses Widerspruch läuft.Ein SqlDataAdapter benötigt keine geöffnete Verbindung. Er öffnet selbständig und verlässt beim Dispose (End Using des SqlDataAdapters) die Verbindung so wie vorgefunden.
Prüfe mal, was da noch alles im using-Scope der SqlConnection gemacht wird.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hi Uwe,
und warum nicht mit using? Wo ist Close und Dispose?--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hi Uwe,
die Notwendigkeit der Freigabe von Speicher nach der Nutzung (Close+Dispose) sollte zu den Grundkenntnissen jedes Programmierers gehören. Gerade bei Web-Anwendungen kann das schnell zur Blockierung wegen fehlendem Speicherplatz führen.Kapsle bitte die Connection in using und innerhalb dieses Scopes dann den SqlDataAdapter auch in using. Das ConnectionPooling der Laufzeitumgebung unterstützt Dich, damit nicht jedes Mal der SQL Server den gesamten Anmeldeprozess vollständig ausführen muss.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hallo Peter,
meinst Du das so:using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connLGV"].ToString()))
{
SqlDataAdapter cmd1 = new SqlDataAdapter(qry, con);
cmd1.Fill(dt);
con.Dispose();
}Uwe
Mittelung vom Forum
-
Hi Uwe,
nein, ich meine Using Adapter im Using-Scope der SqlConnection:using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connLGV"].ToString())) { using (SqlDataAdapter cmd1 = new SqlDataAdapter(qry, con)) { cmd1.Fill(dt); } }
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert uwe domschke Freitag, 17. August 2018 07:11