.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
相关产品推荐
相关产品推荐

