gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:32:30 34 4
gpt4 key购买 nike

我们有两种不同的查询策略,我们希望在不打开冗余连接的情况下在我们的网站上结合使用。一种策略是使用企业库来拉取 Database 对象并在 Database 上执行 Execute_____(DbCommand),而不直接选择任何类型的连接。像这样有效:

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 中使用 old 策略调用一个使用 new 策略的数据访问方法时,会导致不必要的提升——我不确定我们是否有能力为其配置促销(我们没有对 SQL Server 的管理访问权限)。

在我们继续修改查询构建器库以使用企业库的 Database 对象之前...... 是否有方法检索(如果存在)打开的上次由 Database.Execute_______() 方法之一使用的连接?

最佳答案

是的,您可以获得与事务关联的连接。 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;
}
}

关于enterprise-library - 获取 DatabaseFactory.GetDatabase().ExecuteReader() 使用的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17089947/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com