C# MySQL ExecuteOnQuery抛出;已经有一个打开的DataReader与此命令关联,必须先关闭该命令";例外情况

C# MySQL ExecuteOnQuery抛出;已经有一个打开的DataReader与此命令关联,必须先关闭该命令";例外情况,c#,mysql,C#,Mysql,我有多个进程将数据插入数据库中的同一个表。我对所有进程使用一个数据库连接。当我试图运行一个sqlcommand时,我得到了上面的异常。我在网上做了一些研究,似乎Mysql服务器每个连接只支持一个datareader。而且,由于每个进程都使用ExecuteOnQuery快速执行SQL命令,因此在发出新命令时,以前的datareader可能没有关闭 有办法解决这个问题吗 谢谢,您的错误的根本原因是(希望避免明显的错误),相同的连接正在使用中,并且已经打开/正在执行。它们现在是静态的吗?建议调查池未被

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

有办法解决这个问题吗


谢谢,您的错误的根本原因是(希望避免明显的错误),相同的连接正在使用中,并且已经打开/正在执行。它们现在是静态的吗?建议调查池未被使用或受到限制的原因

考虑使用语句重构代码,使其具有
。伪,非对称性示例:

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

private List GetCustomers()
{
string sqlStatement=“从客户中选择ID、名称”;
使用(var conn=new MySqlConnection(connString))
{
使用(var cmd=new MySqlDataCommand(conn))
{
//找个读者做点什么
使用(var reader=newmysqldatareader(sqlStatement))
{ 
...
}
}
}
}
通过使用
语句在
中包装这些对象的创建,您将确保对象被正确关闭和处置

我建议是的,你应该每次都打开一个新的连接。应使用正确的连接池。你真的不应该去想它


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

这是否需要在每次尝试运行sql命令时打开新连接?我有多个进程共享同一个连接。谢谢。每个进程都从套接字接口接收数据并存储到数据库。数据有时从套接字接口以非常快的速度输入。你认为BeginExecutenQuery会有帮助吗?@user:我建议使用
进行重构,看看是否有帮助。也要避免任何
静态
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))
           { 
               ...
           }
        }
    }
}