2013-04-08 3 views
6

Freunde geschlossen werden muss, wenn ich diese Code in asp.net schreiben bekomme ich einen Fehler wie folgt aus:wenn mehrere SQL-Befehle zeigt Fehler setzen: Es gibt bereits eine offene Datareader mit diesem Befehl zugeordnet, der zuerst

Es gibt bereits eine offene Datareader mit diesem Befehl zugeordnet, die zuerst geschlossen werden muss mich

Hilfe bitte

SqlConnection con = obj.getcon(); 
con.Open(); 

     SqlCommand cmd = new SqlCommand("select student_id from student_details", con); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     { 
      String ss=dr[0].ToString(); 
      if (val == ss) 
      { 



       SqlCommand cmd1 = new SqlCommand("insert student_vs_testsession_details(student_id,testsession_id,testsession_status) values('" + val + "','" + Test + "','')", con); 
       int val1 = cmd1.ExecuteNonQuery(); 


      } 
      else 
      { 


       string message = "<script language=JavaScript> alert('StudentID does not exists!'); </script>"; 
       if (!Page.IsStartupScriptRegistered("clientScript")) 
       { 
        Page.RegisterStartupScript("clientScript", message); 
       } 
      } 

     } 
    dr.Close(); 
     // con.Close(); 

    } 
+5

Do * NOT * Inline-Parameter in Ihre SQL-Anweisungen tun! Es ist der schnellste Weg, Probleme mit Injection-Angriffen zu haben (nein, die Eingabe zu entziehen reicht nicht aus) - werfen Sie einen Blick auf die Verwendung parametrisierter Abfragen. – PhonicUK

+0

thankyou .. aber nach der Parametrisierung habe ich den gleichen Fehler – nsds

Antwort

12

Sie müssen die Verbindungszeichenfolge ändern, und fügen Sie diese Option

"MultipleActiveResultSets=True;" 

Ausgehend von SQL Server 2005 gibt es MARS Option.
Mit MARS eine einzige geöffnet Verbindung konnte mehr als einen Befehl gleichzeitig dienen. So soll beispielsweise die Verbindungszeichenfolge wie diese

See the docs on MARS

In einer ‚normalen‘ Konfiguration

"Server=myServerAddress;" + 
"Database=myDataBase;" + 
"Trusted_Connection=True;" + 
"MultipleActiveResultSets=true;" 
sein, wenn ein SqlDataReader geöffnet ist, die SqlConnection beschäftigt ist, den Leser zu dienen und nicht akzeptieren kann andere Befehle.
(Siehe Anmerkungen zum Link zu SqlDataReader).

Ihr Code oben hat ein Lesegerät geöffnet, wenn Sie versuchen, einen Befehl mit derselben Verbindung auszugeben.
Es gibt Workarounds wie einen DataSet füllen und das Schleifen über sie (aber für große Mengen dieser Performance auswirken), so dass das SQL-Team bei Microsoft eingeführt MARS

+0

, aber diese Verbindungszeichenfolge funktioniert ordnungsgemäß für eine andere SQL-Befehle – nsds

+0

danke somuch :) – nsds

-1

Sie können nicht mehrere Befehlsanweisungen für die gleiche Verbindung ausgeführt, während der Datenreader ist an ... verwenden Sie stattdessen SqlDataAdapter .. Verwenden von DataAdapter und DataSet wird Ihre Arbeit einfacher zu machen ..

+0

Dies ist falsch, mit 'MultipleActiveResultSets = True;' in der Verbindungszeichenfolge ermöglicht dies. – cybermonkey

0

Ich schlage vor, Sie nicht verschachtelte sql, die die Anwendungsleistung verlangsamt, sondern SQL massiven Einsatz verwenden. So können Sie Ihren Code zu ändern:

SqlConnection con = obj.getcon(); 

con.Open(); 
SqlCommand cmd1 = new SqlCommand("insert into student_vs_testsession_details(student_id,testsession_id,testsession_status) select student_id, " + "'Test','' from student_details where student_id = '" + val + "'", con); 
int val1 = cmd1.ExecuteNonQuery(); 


     SqlCommand cmd = new SqlCommand("select student_id from student_details where student_id != " + val , con); 

     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     { 
      String ss=dr[0].ToString(); 

       string message = "<script language=JavaScript> alert('StudentID does not exists!'); </script>"; 
       if (!Page.IsStartupScriptRegistered("clientScript")) 
       { 
        Page.RegisterStartupScript("clientScript", message); 
       } 

     } 

dr.Close(); 
Verwandte Themen