我有多个进程将数据插入到数据库中的同一个表中。我对所有进程使用一个数据库连接。当我尝试运行其中一个 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/