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