C# 企业库管理连接

C# 企业库管理连接,c#,asp.net,sql-server,enterprise-library,C#,Asp.net,Sql Server,Enterprise Library,我正在用c#构建一个应用程序,我决定使用DAL(SQL Server)的企业库 我不记得在哪里,但我读过一篇关于EntLib的文章,上面说连接是自动关闭的 这是真的吗 如果不是,管理中间层连接的最佳方法是什么? 在每个方法中打开和关闭 上面是我如何使用EntLib的示例方法 public DataSet ReturnSomething { var sqlStr = "select something"; DbCommand cmd = db.GetSqlStringCommand

我正在用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);
}


提前感谢。

ExecuteDataSet方法返回一个包含所有数据的DataSet对象。这将提供您自己的本地副本。调用ExecuteDataSet会打开连接,填充数据集,并在返回结果之前关闭连接

有关更多信息:


我认为您应该使用类似于静态类的东西作为外观,为您的库子系统提供正确的连接

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.
    }
}
在这个代码示例中,您有一个静态类,它提供类库的功能和特性。Façade类用于向用户提供所有可能的操作,但您不想对使用什么连接等感到头痛。您只需要底层数据存储中的客户列表。然后,调用
GetCustomers
即可

Façade是一个“智能”类,它知道从哪里获取信息,因此创建相应的连接,并从子系统工厂订购客户。工厂按照要求进行操作,获取可用连接并检索客户,而无需询问任何进一步的问题


这有帮助吗?

是的,EntLib会为您关闭连接(实际上它会将连接释放回连接池)。这就是我们最初开始使用EntLib的主要原因


然而,对于所有新的开发,我们现在已经开始使用实体框架,我们发现这更有效率。

如果我想获得一个数据阅读器或插入、删除、更新,该怎么办?如何处理连接?hello@Massimiliano Peluso我想保持连接打开,直到我不想手动关闭它。那么我们能做什么呢?所以我读的文章是错误的,我必须关闭和打开每次使用的连接!感谢您的帮助Will MarcouillerNo,您不需要手动管理连接-该块将自动为您打开和关闭连接。这个解决方案太过分了,尤其是在使用数据集的情况下。所有这些透明度让我担心。因此,我不必打开连接,也不必关闭连接。当我执行一个新的“操作”时,它从池中获取可用的连接(如果可用),或者它打开一个新的连接?我在数据库中执行sp_who2,有超过15个处于睡眠状态的连接。我是唯一一个使用这个数据库的用户,所以我认为可用连接的数量太多了。是的,这是全自动的,试着把你的代码放在一个循环中运行1000次。连接的数量不应该增加。这很奇怪,有些地方出了问题,因为正如我之前所说,我有超过15个连接。似乎它没有关闭连接,并且在每次请求时都会创建一个新的连接。我认为问题来自datareader。我将尝试检查与dataset而不是datareader的连接。听起来好像您正在泄漏datareader。您是在using块内调用db.ExecuteReader(),还是随后关闭datareader?在执行此操作之前,连接将保持打开状态。
public class MyPageClass {
    private void DisplayCustomers() {
        GridView.DataSource = SystemFacade.GetCustomers();
    }
}