none
ExecuteReader erfordert eine geöffnete und verfügbare Verbindung. Der aktuelle Status der Verbindung ist 'Geöffnet'. RRS feed

  • 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) +1434

    Ich 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

    Donnerstag, 16. August 2018 06:48

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
    Donnerstag, 16. August 2018 15:28

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

    Donnerstag, 16. August 2018 07:05
  • Hallo Peter,
    ich definiere lediglich die Connection:

    SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["connLGV"].ToString());

    Uwe


    Mittelung vom Forum

    Donnerstag, 16. August 2018 07:35
  • 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

    Donnerstag, 16. August 2018 07:37
  • Tja, weil ich dachte, das brauche ich beim SqlDataAdapter nicht. Der macht das automatisch.

    Wäre wohl sicherer?


    Mittelung vom Forum

    Donnerstag, 16. August 2018 07:57
  • 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

    Donnerstag, 16. August 2018 08:32
  • 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

    Donnerstag, 16. August 2018 08:56
  • 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
    Donnerstag, 16. August 2018 15:28
  • Danke Peter,
    ich versuchs damit.

    Uwe


    Mittelung vom Forum

    Freitag, 17. August 2018 07:19