c# - MySQL ExecuteNonQuery 抛出 "There is already an open DataReader associated with this Command which must be closed first"异常

标签 c# mysql

我有多个进程将数据插入到数据库中的同一个表中。我对所有进程使用一个数据库连接。当我尝试运行其中一个 sql 命令时,出现了上述异常。我在网上做了一些研究,似乎 Mysql 服务器每个连接只支持一个数据读取器。并且由于每个进程都使用executeNonQuery来快速执行SQL命令,因此当发出新命令时,可能之前的datareader没有关闭。

有办法解决这个问题吗?

谢谢

最佳答案

错误的根本原因是(希望避免明显的情况),正在使用相同的连接,并且已经打开/执行。它们目前是静态吗?建议调查为什么池没有被使用或受到限制。

考虑重构您的代码以包含 using 语句。伪非编译示例:

private void ExecNonQuery(string sqlStatement)
{          
    using (var conn = new MySqlConnection(connString))
    {
       using (var cmd = new MySqlDataCommand(conn))
       {
           cmd.ExecuteNonQuery(sqlStatement);
       }
    }
}

private List<Customer> GetCustomers( )
{
    string sqlStatement = "SELECT ID, Name FROM Customer";                
    using (var conn = new MySqlConnection(connString))
    {
        using (var cmd = new MySqlDataCommand(conn))
        {
           //get a reader and do something
           using (var reader = new MySqlDataReader(sqlStatement))
           { 
               ...
           }
        }
    }
}

通过将这些对象的创建包装在 using 语句中,您将确保您的对象被正确关闭和处置。

我建议是的,您应该每次都打开一个新连接。 ADO.NET Driver for MySQL 应该使用正确的连接池。你真的不应该考虑这个问题。

为什么多个进程共享同一个连接?那里有什么需要?

关于c# - MySQL ExecuteNonQuery 抛出 "There is already an open DataReader associated with this Command which must be closed first"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689349/

相关文章:

c# - 获取 OAuth session 的过期时间

mySql 错误号 : 150 Create table statement inside

c# - 如何在 Windows 10 中打开显示设置(语法上,特别是使用 C#)?

c# - .Net Core IdentityServer4 获取认证用户

php - 查询以获取结果中的列名称和值?

javascript - 使用java脚本将数据从网站a传递到网站b,然后用作post查询

php - 如何补偿 MySQL 时区差异?

php - 无法添加外键约束 - Laravel Entrust

c# - 如何读取 Stream 并将其位置重置为零,即使 stream.CanSeek == false

C#,读/写分离和属性。需要图案