C# 正在获取System.InvalidOperationException错误,我对如何修复该错误感到困惑?
好吧,我正在写的脚本中有一部分,如果它已经在一个表中,它将插入新地址,但问题是我遇到了一个异常,我似乎无法修复,我调试了很多次,它说 System.InvalidOperationException:'已经有一个与此连接关联的打开的DataReader,必须先关闭它。' 我已经在谷歌上搜索过了,但没有什么真正的帮助,所以这里是给出错误的代码块C# 正在获取System.InvalidOperationException错误,我对如何修复该错误感到困惑?,c#,sql,ado.net,ctree,C#,Sql,Ado.net,Ctree,好吧,我正在写的脚本中有一部分,如果它已经在一个表中,它将插入新地址,但问题是我遇到了一个异常,我似乎无法修复,我调试了很多次,它说 System.InvalidOperationException:'已经有一个与此连接关联的打开的DataReader,必须先关闭它。' 我已经在谷歌上搜索过了,但没有什么真正的帮助,所以这里是给出错误的代码块 try { _conn.Open(); string compare = "SELECT addres
try
{
_conn.Open();
string compare =
"SELECT address, COUNT(*) FROM melena_edws m " +
"WHERE EXISTS (SELECT address FROM actuals a WHERE m.address = a.address) " +
"GROUP BY address ";
CtreeSqlCommand cmd = new CtreeSqlCommand(compare, _conn);
CtreeSqlDataReader reader = cmd.ExecuteReader();
int count = (int)cmd.ExecuteScalar();//<------Error is here
if(count > 0)
{
while (reader.Read())
{
Console.WriteLine(string.Format("{0,12}", reader["address"]));
//cmd2.ExecuteNonQuery();
reader.Close();
Compare($"{reader["address"]} ");
}
reader.Dispose();
_conn.Close();
}
else
{
Console.WriteLine("Address already within table");
}
}
catch (CtreeSqlException ctsqlEx)
{
Console.WriteLine(ctsqlEx + " error running command script ");
}
如果使用连接打开了DataReader,则连接对象不能用于其他命令。另一种方法是使用不同的连接,但是在您的上下文中,您实际上不需要做任何事情来统计sql文本返回的记录 如果没有行,DataReader.Read将立即返回false。或者,您可以只使用DataReader.HasRows属性来发现此事实,而无需进入循环并显示正确的错误消息 因此,您可以使用
_conn.Open();
string compare = "SELECT address, COUNT(*) FROM melena_edws m WHERE EXISTS (SELECT address FROM actuals a WHERE m.address = a.address) GROUP BY address ";
CtreeSqlCommand cmd = new CtreeSqlCommand(compare, _conn);
CtreeSqlDataReader reader = cmd.ExecuteReader()
if(reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(string.Format("{0,12}", reader["address"]));
Compare($"{reader["address"]} ");
}
}
else
{
// Display your message
}
reader.Dispose();
_conn.Close();
删除ExecuteScalar调用。你不需要它。如果行数为零,则whilereader.Read立即返回false,您将永远不会输入循环。是的,但不再使用计数。当然,您可以用ifreader.HasRows替换ifcount>0,然后继续使用else消息。看起来您正在使用全局/共享连接。由于该DataReader在使用完毕后未关闭或释放,因此可能还有其他原因可以解释此错误。我在哪里可以阅读reader.hasRows?因为我从来都不知道,如果我要修改代码,我实际上会得到一个指向reader objectNevermind的错误,这是我修改过的东西,但这确实有效,谢谢!