7

朋友们,当我在 asp.net 中编写这些代码时,我收到如下错误:

已经有一个打开的 DataReader 与此命令关联,必须先关闭

请帮帮我

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

    }
4

3 回答 3

17

您需要更改连接字符串并添加此选项

 "MultipleActiveResultSets=True;"

从 SQL Server 2005 开始,有 MARS 选项。
使用 MARS,一个打开的连接一次可以服务多个命令。因此,例如,您的连接字符串应该是这样的

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

请参阅 MARS 上的文档

“正常”配置中,当SqlDataReader打开时,SqlConnection 正忙于为阅读器提供服务,无法接受其他命令。
(参见 SqlDataReader 链接上的注释)。

当您尝试使用同一连接发出命令时,上面的代码会打开一个阅读器。
有一些解决方法,比如填充一个 DataSet 然后循环它(但对于大型集,这会影响性能),所以微软的 SQL 团队引入了 MARS

于 2013-04-08T09:45:16.930 回答
0

建议不要使用嵌套sql,会降低应用程序性能,而是使用sql海量插入。因此,您可以将代码更改为:

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();
于 2017-05-16T12:28:50.933 回答
-1

当数据读取器打开时,您不能为同一连接执行多个命令语句...改用 SqlDataAdapter.. 使用 dataadapter 和 DataSet 将使您的工作更轻松..

于 2013-04-08T09:46:06.027 回答