You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET连接MySQL时DataReader与NonQuery的异常排查求助

问题与排查结论

我特意创建了两个独立数据库连接,分别用于DataReader查询和NonQuery更新操作,代码如下:

连接初始化

DataReaderConnect = DBUtils.GetDBConnection(_DbUserName, _DbPassword);
DataReaderConnect.Open();

NonQueryConnect = DBUtils.GetDBConnection(_DbUserName, _DbPassword);
NonQueryConnect.Open();

对应操作方法

public async Task UpdateUser(cUser.UserObject User)
{
    string SQL = $"UPDATE {_DbName}.dbUserTable SET Name = @Name....";
    using MySqlCommand Command = new MySqlCommand(SQL, NonQueryConnect);
    Command.Parameters.AddWithValue("@Name", User.Name);
    ...
    await Command.ExecuteNonQueryAsync().ConfigureAwait(false);
}
public async Task<cUser.UserObject> GetUser(int ttvUserID)
{
    List<cUser.UserObject> Users = new List<cUser.UserObject>();
    string SQL = $"SELECT * FROM {_DbName}.dbUserTable WHERE TwitchID = @ID";
    using MySqlCommand Command = new MySqlCommand(SQL, DataReaderConnect);
    Command.Parameters.AddWithValue("@ID", ttvUserID);
    using var sqlReader = await Command.ExecuteReaderAsync().ConfigureAwait(false);
    while (await sqlReader.ReadAsync().ConfigureAwait(false))
    {
        Users.Add(new cUser.UserObject()
        {
            dbID = Convert.ToInt32(sqlReader[0]),
            TwitchID = Convert.ToInt32(sqlReader[1]),
            Name = sqlReader[2].ToString(),
            isSub = Convert.ToInt32(sqlReader[3]),
            isVip = Convert.ToInt32(sqlReader[4])
        });
    }                     
}

但运行时还是抛出异常:There is already an open DataReader associated with this Connection which must be closed first.,一开始完全搞不懂,明明没混用两个连接。

后来终于排查出问题:.NET里,同一数据库连接不仅不能同时混用DataReader和NonQuery操作,连同时存在多个DataReader也不允许。比如如果异步场景下多次调用GetUser,前一个DataReader还没完成释放,同一连接上又开了新的DataReader,就会触发这个错误。


内容的提问来源于stack exchange,提问作者user2213608

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:45:47