2013-04-08 9 views
6

Amici, quando scrivo questi codice in asp.net ottengo un errore come questo:quando mettono più comandi SQL che mostrano errore: Esiste già un DataReader aperto associato con questo comando che deve essere chiuso prima

C'è già un DataReader aperto associato con questo comando che devono essere chiusi prima

help me please

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 * NON * fa i parametri in linea nelle tue istruzioni SQL! È il modo più rapido per avere problemi con gli attacchi di iniezione (no, sfuggire l'input non è sufficiente): dai un'occhiata a come utilizzare le query con parametri. – PhonicUK

+0

grazie .. ma dopo la parametrizzazione ho lo stesso errore – nsds

risposta

12

è è necessario modificare la stringa di connessione e aggiungere questa opzione

"MultipleActiveResultSets=True;" 

A partire da SQL Server 2005 è disponibile l'opzione MARS.
Con MARS una singola connessione aperta può servire più di un comando alla volta. Così, per esempio, la stringa di connessione dovrebbe essere così

"Server=myServerAddress;" + 
"Database=myDataBase;" + 
"Trusted_Connection=True;" + 
"MultipleActiveResultSets=true;" 

See the docs on MARS

In una configurazione 'normale', quando un SqlDataReader è aperto, lo SqlConnection è occupato al servizio del lettore e non può accettare altri comandi.
(vedere le osservazioni sul collegamento a SqlDataReader).

Il codice sopra riportato ha un lettore aperto quando si tenta di emettere un comando utilizzando la stessa connessione.
Ci sono soluzioni alternative, come il riempimento di un DataSet e il loop su di esso (ma per grandi insiemi questo avrà un impatto prestazioni), in modo che il team di SQL di Microsoft ha introdotto MARS

+0

ma quella stringa di connessione funziona correttamente per altri comandi sql – nsds

+0

grazie piuttosto :) – nsds

-1

Non è possibile eseguire più istruzioni di comando per la stessa connessione, mentre il datareader è su ... usa invece SqlDataAdapter .. L'uso di dataadapter e DataSet renderà il tuo lavoro più facile ..

+0

Questo non è corretto, utilizzando 'MultipleActiveResultSets = True;' nella stringa di connessione consente questo. – cybermonkey

0

Ti suggerisco di non usare sql annidato, che rallenta le prestazioni dell'applicazione, ma usa l'inserto massiccio di SQL. Quindi puoi cambiare il tuo codice in:

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(); 
Problemi correlati