我不能在现有的数据读取器中打开新的数据读取器吗? 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();
答案 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 }
}