Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何关闭active datareader c_C#_Mysql - Fatal编程技术网

C# 如何关闭active datareader c

C# 如何关闭active datareader c,c#,mysql,C#,Mysql,我试图从mySQL数据库中选择值。一切都很好,但第一次运行代码时,我忘了关闭datareader。现在,每次我运行更新的代码时,它都会出错,指出该连接已经有一个活动的datareader,必须先关闭它。我已尝试结束SQL实例并重新启动电脑,但错误依然存在。如何关闭此数据读取器 下面是更新的代码 public static int getProductIDbyName(string productName) { try { if (c

我试图从mySQL数据库中选择值。一切都很好,但第一次运行代码时,我忘了关闭datareader。现在,每次我运行更新的代码时,它都会出错,指出该连接已经有一个活动的datareader,必须先关闭它。我已尝试结束SQL实例并重新启动电脑,但错误依然存在。如何关闭此数据读取器

下面是更新的代码

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.当您读取一组数据时,您正在启动一个命令来执行其他操作?如果没有:代码将非常有用我已经用我正在使用的代码更新了问题。