サブソニック:mysqldatareaderは接続を閉じます
-
23-10-2019 - |
質問
私は亜音速2.1を使用しており、ENTCが問題を争っています。
SharedDBConnectionScopeおよびTransactionscope。問題は、obj.save()メソッドで「接続が有効でオープンである必要がある」例外を取得することです。
このラインの問題を追跡しました:
// Loads a SubSonic ActiveRecord object
User user = new User(User.Columns.Username, "John Doe");
ユーザークラスAメソッドのこのコンストラクターでは、「loadparam」と呼ばれます。
if (rdr != null)
rdr.Close();
rdr.close()は、自動接続を使用するときに問題ない接続を暗黙的に閉じるようです。しかし、トランザクション中は、接続を閉じることは時には良い考えではありません:-)
私の質問は、これが設計によるものか、それがmysqldatareaderのエラーであるかどうかです。
解決
それはトリッキーでした!少しデバッグした後、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;
}
かなり重いバグ、それはトランザクションでのクエリを不可能にしました(私はこれをこれまでに必要としなかったことを認めなければなりません)。
所属していません StackOverflow