我正在使用SubSonic 2.1并在使用
执行交易时遇到问题SharedDbConnectionScope和TransactionScope。 问题是在obj.Save()方法中我得到一个“连接必须是有效且开放的”异常
我将问题追溯到这一行:
// Loads a SubSonic ActiveRecord object
User user = new User(User.Columns.Username, "John Doe");
在User类的这个构造函数中,调用了一个方法“LoadParam”,它最终会
if (rdr != null)
rdr.Close();
看起来rdr.Close()隐式关闭我的连接,这在使用AutomaticConnection时很好。但在交易过程中,关闭连接通常不是一个好主意:-)
我的问题是,如果这是设计或MySqlDataReader中的错误。
答案 0 :(得分:0)
这太棘手了! 经过一点调试后,我在SubSonic2 MySqlDataReader.cs文件中找到了以下方法:
public override IDataReader GetReader(QueryCommand qry)
{
AutomaticConnectionScope conn = new AutomaticConnectionScope(this);
...
cmd.Connection = (MySqlConnection)conn.Connection;
IDataReader rdr;
try
{
rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch(MySqlException x)
{
conn.Dispose();
throw x;
}
...
}
由于我使用的是SharedDbConnection,这是错误的。在SqlDataProvider中,它已被修复,但不是MySqlDataReader。
它应该是这样的:
try
{
// if it is a shared connection, we shouldn't be telling the reader to close it when it is done
rdr = conn .IsUsingSharedConnection ?
cmd.ExecuteReader() :
cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (MySqlException)
{
// AutoConnectionScope will figure out what to do with the connection
conn.Dispose();
//rethrow retaining stack trace.
throw;
}
非常重的bug,它使得在事务中查询变得不可能(我必须承认我以前从未需要这个)。