-2

我不能在现有数据阅读器中打开新的数据阅读器吗?请帮助我。我是 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();
4

5 回答 5

3

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

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

一个更简单的答案是在您的连接上启用“MARS” -多个活动记录集。这是通过"MARS Connection=True在连接字符串上设置选项以打开该功能来完成的。这通常很安全,默认情况下它只是关闭以保留旧应用程序的 2005 年之前的行为,但是链接的文章确实提供了一些指导。

于 2013-10-07T06:31:53.557 回答
1

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

于 2013-10-07T06:29:36.950 回答
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  }  

  }
于 2013-10-07T06:50:44.357 回答
0

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

或者

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

于 2013-10-07T06:30:01.053 回答
0

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

对于错误:当前连接字符串已经附加了数据读取器。尝试先关闭数据阅读器。

于 2013-10-07T06:30:08.623 回答