3

冗長な接続を開かずに、理想的にはサイトで組み合わせて操作したい 2 つの異なるクエリ戦略があります。1 つの戦略では、エンタープライズ ライブラリを使用して、接続を直接選択せずに上のDatabaseオブジェクトとをプルします。効果的には次のようになります。Execute_____(DbCommand)Database

Database db = DatabaseFactory.CreateDatabase();
DbCommand q = db.GetStoredProcCommand("SomeProc");
using (IDataReader r = db.ExecuteReader(q))
{
  List<RecordType> rv = new List<RecordType>();
  while (r.Read())
  {
    rv.Add(RecordType.CreateFromReader(r));
  }
  return rv;
}

もう 1 つの新しい戦略では、実行直後に esIDbConnectionを要求するライブラリを使用します。Close()したがって、次のようにします。

DbConnection c = DatabaseFactory.CreateDatabase().CreateConnection();
using (QueryBuilder qb = new QueryBuilder(c))
{
  return qb.Find<RecordType>(ConditionCollection);
}

しかし、 によって返される接続は、 によってCreateConnection()使用されるものと同じではなく、Database.ExecuteReader()明らかにクエリ間で開いたままになっています。そのため、 内で古い戦略を使用した後に新しい戦略を使用してデータ アクセス メソッドを呼び出すと、不要なプロモーションが発生します。これは、構成する機能があるかどうかわかりません (管理アクセス権がありません)。 SQL Server に)。TransactionScope

query-builder-library を変更して Enterprise Library のDatabaseオブジェクトを操作する方法を説明する前に...メソッドの 1 つによって最後に使用された開いている接続が存在する場合、それを取得するDatabase.Execute_______()方法はありますか?

4

1 に答える 1

3

はい、トランザクションに関連付けられた接続を取得できます。Enterprise Library は、トランザクションのコレクションと関連するデータベース接続を内部的に管理するため、トランザクション内にいる場合は、静的TransactionScopeConnections.GetConnectionメソッドを使用してデータベースに関連付けられた接続を取得できます。

using (var scope = new TransactionScope())
{
    IEnumerable<RecordType> records = GetRecordTypes();

    Database db = DatabaseFactory.CreateDatabase();
    DbConnection connection = TransactionScopeConnections.GetConnection(db).Connection;
}

public static IEnumerable<RecordType> GetRecordTypes()
{
    Database db = DatabaseFactory.CreateDatabase();
    DbCommand q = db.GetStoredProcCommand("GetLogEntries");
    using (IDataReader r = db.ExecuteReader(q))
    {
        List<RecordType> rv = new List<RecordType>();
        while (r.Read())
        {
            rv.Add(RecordType.CreateFromReader(r));
        }
        return rv;
    }
}
于 2013-06-14T03:17:16.333 に答える