C# 放置多个sql命令时显示错误:已经有一个打开的DataReader与此命令关联,必须先关闭该命令

C# 放置多个sql命令时显示错误:已经有一个打开的DataReader与此命令关联,必须先关闭该命令,c#,asp.net,sql-server,asp.net-mvc,C#,Asp.net,Sql Server,Asp.net Mvc,朋友们,当我在asp.net中编写这些代码时,会出现如下错误: 已存在与此命令关联的打开的DataReader,该命令 必须先关闭 请帮帮我 SqlConnection con = obj.getcon(); con.Open(); SqlCommand cmd = new SqlCommand("select student_id from student_details", con); SqlDataReader dr = cmd.ExecuteReader()

朋友们,当我在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();

    }
SqlConnection-con=obj.getcon();
con.Open();
SqlCommand cmd=newsqlcommand(“从学生详细信息中选择学生id”,con);
SqlDataReader dr=cmd.ExecuteReader();
while(dr.Read())
{
字符串ss=dr[0]。ToString();
如果(val==ss)
{
SqlCommand cmd1=新的SqlCommand(“插入学生与测试会话详细信息(学生id、测试会话id、测试会话状态)”值(“+val+”、“+Test+”、“”),con);
int val1=cmd1.ExecuteNonQuery();
}
其他的
{
string message=“警报('StudentID不存在!”);”;
如果(!Page.isstartupscript已注册(“clientScript”))
{
RegisterStartupScript(“clientScript”,消息);
}
}
} 
Close博士();
//con.Close();
}

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

 "MultipleActiveResultSets=True;"
从SQL Server 2005开始,有MARS选项。
在火星上,一个打开的连接一次可以服务于多个命令。 例如,您的连接字符串应该如下所示

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

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

当您尝试使用相同的连接发出命令时,上面的代码有一个读卡器打开。

有一些解决方法,比如填充数据集,然后在数据集上循环(但对于大型数据集,这将影响性能),因此Microsoft的SQL团队引入了MARS,在datareader打开时,您不能为同一连接执行多个命令语句。。。请改用SqlDataAdapter。。使用dataadapter和DataSet将使您的工作更加轻松。

我建议您不要使用嵌套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();
SqlConnection-con=obj.getcon();
con.Open();
SqlCommand cmd1=新的SqlCommand(“插入到学生_vs_testsession_详细信息中(学生_id、测试Session_id、测试Session_状态)从学生_详细信息中选择学生_id“+”‘测试’,”,其中学生_id=“+val+”,con);
int val1=cmd1.ExecuteNonQuery();
SqlCommand cmd=new SqlCommand(“从学生详细信息中选择学生id,其中学生id!=”+val,con);
SqlDataReader dr=cmd.ExecuteReader();
while(dr.Read())
{
字符串ss=dr[0]。ToString();
string message=“警报('StudentID不存在!”);”;
如果(!Page.isstartupscript已注册(“clientScript”))
{
RegisterStartupScript(“clientScript”,消息);
}
} 
Close博士();

不要在SQL语句中使用内联参数!这是出现注入攻击问题的最快方法(不,转义输入是不够的)-看看如何使用参数化查询。谢谢。。但参数化后,我有相同的错误,但该连接字符串对另一条sql命令正常工作这是不正确的,使用
MultipleActiveResultSets=True允许此操作。