我正在使用c#构建应用程序,我决定将企业库用于DAL(SQL Server)。
我不记得在哪里,但我读过一篇关于EntLib的文章,其中说连接是自动关闭的。
是真的吗?
如果没有,管理中间层连接的最佳方法是什么? 在每种方法中打开和关闭?
以上是我如何使用EntLib
的示例方法public DataSet ReturnSomething
{
var sqlStr = "select something";
DbCommand cmd = db.GetSqlStringCommand(sqlStr);
db.AddInParameter(cmd, "@param1", SqlDbType.BigInt, hotelID);
db.AddInParameter(cmd, "@param2", SqlDbType.NVarChar, date);
return db.ExecuteDataSet(cmd);
}
提前致谢。
答案 0 :(得分:2)
ExecuteDataSet方法返回包含所有数据的DataSet对象。这为您提供了自己的本地副本。对ExecuteDataSet的调用会打开一个连接,填充一个DataSet,并在返回结果之前关闭连接
了解更多信息:
答案 1 :(得分:0)
我认为您应该使用类似于Façade的静态类,它将为您的库子系统提供正确的连接。
public static class SystemFacade {
// Used as a subsystem to which the connections are provided.
private static readonly SystemFactory _systemFactory = new SystemFactory();
public static IList<Customer> GetCustomers() {
using (var connection = OpenConnection(nameOfEntLibNamedConnection))
return _systemFactory.GetCustomers(connection);
}
public static DbConnection OpenConnection(string connectionName) {
var connection =
// Read EntLib config and create a new connection here, and assure
// it is opened before you return it.
if (connection.State == ConnectionState.Closed)
connection.Open();
return connection;
}
}
internal class SystemFactory {
internal IList<Customer> GetCustomers(DbConnection connection) {
// Place code to get customers here.
}
}
使用此代码:
public class MyPageClass {
private void DisplayCustomers() {
GridView.DataSource = SystemFacade.GetCustomers();
}
}
在此代码示例中,您有一个静态类,它提供类库的功能和特性。 Façade类用于为用户提供所有可能的操作,但您不希望因使用什么连接而头疼。等等。您只需要基础数据存储区之外的客户列表。然后,拨打GetCustomers
就可以了。
Façade是一个“智能”类,它知道从何处获取信息,因此相应地创建连接并从子系统工厂订购客户。工厂按照要求进行操作,获取可用的连接并检索客户,而不会询问任何其他问题。
这有帮助吗?
答案 2 :(得分:0)
是的,EntLib为您关闭连接(实际上它将它们释放回连接池)。这是我们最初开始使用EntLib的主要原因。
然而,对于我们现在已经开始使用实体框架的所有新开发,我们发现效率更高。