3

我们有两种不同的查询策略,理想情况下我们希望在我们的站点上一起操作而不打开冗余连接。一种策略是使用企业库来拉取Database对象和Execute_____(DbCommand)s 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;
}

另一种较新的策略使用一个库,该库要求一个IDbConnection,它Close()在执行后立即 es。所以,我们做这样的事情:

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

但是,返回的连接CreateConnection()与 使用的连接不同Database.ExecuteReader(),后者显然在查询之间保持打开状态。因此,当我们在使用 a 中的旧策略之后调用使用策略的数据访问方法时,它会导致不必要的提升——我不确定我们是否有能力配置的提升(我们没有管理权限到 SQL 服务器)。TransactionScope

在我们继续修改查询构建器库以使用企业库的Database对象之前......有没有办法检索(如果存在)其中一种Database.Execute_______()方法最后使用的打开连接?

4

1 回答 1

3

Yes, you can get the connection associated with a transaction. Enterprise Library internally manages a collection of transactions and the associated database connections so if you are in a transaction you can retrieve the connection associated with a database using the static TransactionScopeConnections.GetConnection method:

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 回答