SubSonic:MySqlDataReader关闭连接

时间:2010-06-02 08:13:39

标签: mysql subsonic mysqldatareader

我正在使用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中的错误。

1 个答案:

答案 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,它使得在事务中查询变得不可能(我必须承认我以前从未需要这个)。