0

SubSonic 2.1 を使用していますが、Transaction の実行中に問題が発生しました。

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 のエラーなのかということです。

4

1 に答える 1

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;
        }

かなり重大なバグで、トランザクションでのクエリが不可能になりました (以前は必要なかったと認めざるを得ません)。

于 2010-06-02T12:14:40.347 に答える