我们需要在企业库4.1中关闭DbCommand吗?

时间:2016-12-20 04:08:46

标签: c# enterprise-library

我的功能如下所示。我的问题是:我们是否需要在此函数中关闭cmd。我的理解是企业库在使用后会自动关闭连接。

    const String STORED_PROCEDURE_NAME = "LTR_GetLicenseDetails";
    const string DB_CONNECTION_NAME = "LTRDB";
    MSPData.Database db;
    DbCommand cmd = null;

    db = CreateDatabase(DB_CONNECTION_NAME);
    DataSet ds;

    try
    {
        //Need to close cmd in enterprise libra
        cmd = db.GetStoredProcCommand(STORED_PROCEDURE_NAME);

        ds = ExecuteDataSet(db, cmd);
    }
    catch (Exception ex)
    {
        thrown ex;
    }

1 个答案:

答案 0 :(得分:1)

Database.GetStoredProcCommand会返回IDbCommand,其中会IDisposable。通常,如果一个对象实现IDisposable,则应该在不再需要该对象时将其处理掉。

事实上,如果您调用不接受命令的Enterprise Library方法,他们将构造一个命令并将其处理掉。 e.g。

public virtual DataSet ExecuteDataSet(string storedProcedureName,
                                        params object[] parameterValues)
{
    using (DbCommand command = GetStoredProcCommand(storedProcedureName, parameterValues))
    {
        return ExecuteDataSet(command);
    }
}

您对Enterprise Library的理解是正确的 - 在调用Database.Execute *方法之一(例如ExecuteDataSet)时将关闭连接。因此,不处理命令对象不会导致孤立的数据库连接。但是,根据数据库提供程序的不同,可能会导致其他类型的泄漏。

就SQL Server而言,我最后一次查看SqlCommand时没有明显的危害,如果没有处理该对象,我记得唯一的问题是参数缓存必须等到垃圾收集被释放。