获取DatabaseFactory.GetDatabase()使用的连接.ExecuteReader()

时间:2013-06-13 14:41:34

标签: enterprise-library asp.net-3.5 transactionscope

我们有两种不同的查询策略,我们希望在不打开冗余连接的情况下在我们的站点上一起操作。一种策略使用企业库在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;
}

另一个更新的策略是使用一个库来询问IDbConnection,它在执行后立即Close()。所以,我们做这样的事情:

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

但是,CreateConnection()返回的连接与Database.ExecuteReader()使用的连接不同,TransactionScope显然在查询之间保持打开状态。因此,当我们在Database内使用策略后使用 new 策略调用数据访问方法时,会导致不必要的促销 - 促销我们不确定我们是否具备配置能力(我们没有对SQL Server的管理访问权限)。

在我们沿着修改query-builder-library以使用Enterprise Library的Database.Execute_______()对象的路径前...... 有没有办法检索(如果存在)上次使用的打开连接通过其中一种{{1}}方法

1 个答案:

答案 0 :(得分: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;
    }
}