C# 如何关闭active datareader c
我试图从mySQL数据库中选择值。一切都很好,但第一次运行代码时,我忘了关闭datareader。现在,每次我运行更新的代码时,它都会出错,指出该连接已经有一个活动的datareader,必须先关闭它。我已尝试结束SQL实例并重新启动电脑,但错误依然存在。如何关闭此数据读取器 下面是更新的代码C# 如何关闭active datareader c,c#,mysql,C#,Mysql,我试图从mySQL数据库中选择值。一切都很好,但第一次运行代码时,我忘了关闭datareader。现在,每次我运行更新的代码时,它都会出错,指出该连接已经有一个活动的datareader,必须先关闭它。我已尝试结束SQL实例并重新启动电脑,但错误依然存在。如何关闭此数据读取器 下面是更新的代码 public static int getProductIDbyName(string productName) { try { if (c
public static int getProductIDbyName(string productName)
{
try
{
if (connection.State.ToString()!="Open")
{
connection.Open();
}
string query = "SELECT * FROM `tblproduct` WHERE `ProductName` = '"+productName+"'";
if (connection.State.ToString() == "Open")
{
int result = 0;
using (MySqlCommand cmd = new MySqlCommand(query, connection))
{
using (var dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
result = Convert.ToInt16(dataReader["ID"].ToString());
}
dataReader.Close();
}
}
connection.Close();
MySqlConnection.ClearAllPools();
return result;
}
}
catch (Exception)
{
throw;
}
return 0;
}
当您在DbCommand上使用ExecuteReader时,您获得的读取器是一次性的,即它实现IDisposable。您应该使用using块来使用它。然后:当代码离开块时,一切都将自动发生:
using(var reader = cmd.ExecuteReader())
{
// ... consume the data
}
或者,可以使用Dapper free等工具正确地完成这项工作,并简化ADO.NET的编写。?如果您显示数据读取器代码,这可能会有所帮助……我们可以看到一些代码吗?编辑:您是说这一段代码是创建读取器的唯一代码,并导致这种情况吗?是否没有其他可能在连接上运行的代码?我强烈怀疑这是一种额外的想法:永远不要将输入连接到SQL中;您应该使用参数。今天早些时候,我以Dapper为例写了一篇关于这方面的论文:-并且:您不需要使用ToString来比较枚举值-只是:将其与枚举值进行比较我认为可能存在。有没有一种方法可以允许多个读卡器通过同一个连接工作?是的,这就是我更新代码的方式,但这并不能解决问题,它只是防止问题再次发生。问题是,当它试图创建一个新的datareader时,它会中断,因为有一个先前存在的datareader。@HeinBotha只要你在每个使用Reader的地方都这样做,它就会正常工作。您确定没有执行涉及嵌套读取器的操作吗?i、 e.当您读取一组数据时,您正在启动一个命令来执行其他操作?如果没有:代码将非常有用我已经用我正在使用的代码更新了问题。