已经有一个与此命令关联的打开DataReader,必须先关闭它。我不能在现有的数据阅读器中打开新的数据阅读器

时间:2013-10-07 06:21:46

标签: c# asp.net sql-server

我不能在现有的数据读取器中打开新的数据读取器吗? plzz帮助我。我是c#

的新手
string statement11 = "SELECT Planning FROM allow where NPLID=(SELECT MAX(NPLID) FROM allow)";

SqlCommand myCommand11 = new SqlCommand(statement11, con1);
SqlDataReader plan2 = myCommand11.ExecuteReader();
while(plan2.Read())

if (!plan2.IsDBNull(0) && "ok" == plan2.GetString(0))
{
    string statement99 = "SELECT Dropplan FROM NPLQAnew where NPLID=(SELECT MAX(NPLID) FROM allow)";
    SqlDataReader myReader1 = null;
    SqlCommand myCommand114 = new SqlCommand(statement99, con1);
    SqlDataReader plandrop = myCommand114.ExecuteReader();
    while (plandrop.Read())
        if (plandrop.IsDBNull(0) && plandrop.GetString(0) == "Red")
        {

            Lblplan1.BackColor = System.Drawing.Color.Red;
        }
        else if (plandrop.IsDBNull(0) && "amber" == plandrop.GetString(0))
        {

            Lblplan1.BackColor = System.Drawing.Color.Orange;
        }
        else if (plandrop.IsDBNull(0) && "Green" == plandrop.GetString(0))
        {
            Lblplan1.BackColor = System.Drawing.Color.Green;
        }
    plandrop.Close();


    this.Lblplan1.Visible = true;



}

plan2.Close();

5 个答案:

答案 0 :(得分:3)

默认情况下,SQL Server客户端不允许您在同一连接上打开两个同时查询。例如,如果您正在读取一个数据读取器的结果,则无法使用相同的连接从一秒钟开始读取。而且,通过SQL Server连接池的工作方式,即使要求“新”连接也不能保证也能正常工作。

您有几个选项可以解决这个问题。第一个是重构代码以消除嵌套的SQL执行调用;例如,在循环并处理它们之前,将第一个查询的结果加载到内存中。

更简单的答案是在您的连接上启用“MARS” - Multiple Active Recordsets - 。这样做是在连接字符串上设置"MARS Connection=True选项以打开该功能。这通常非常安全,并且默认情况下它只是保留旧应用程序的2005年之前的行为,但链接的文章确实提供了一些指导。

答案 1 :(得分:1)

您可以尝试在连接字符串中设置MultipleActiveResultSets=True

答案 2 :(得分:0)

不,你不能在同一个连接上执行此操作,但你可以实现 Multiple Active Result Sets (MARS) ,希望您拥有sqlserver 2005及更高版本。

您需要为第二个命令打开不同的连接。

答案 3 :(得分:0)

使用 USING 语句。 using语句以正确的方式调用对象上的Dispose方法,并且一旦调用Dispose,它也会导致对象本身超出范围。

错误:已将数据读取器连接到当前连接字符串。尝试先关闭数据阅读器。

答案 4 :(得分:0)

这一行之后

  if (!plan2.IsDBNull(0) && "ok" == plan2.GetString(0))
  {
   //open a new sql connection here
   //your string statement99

    :
    :


  // then close your second sql connection here before the  last  }  

  }