企业库4.1需要关闭DbCommand吗?

Do we need to close DbCommand in enterprise library 4.1?

我的函数如下所示。我的问题是:我们是否需要在此函数中关闭 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;
    }

Database.GetStoredProcCommand returns 一个 IDbCommand which implements IDisposable. In general, if an object implements IDisposable 那么当不再需要该对象时应该将其丢弃。

事实上,如果您调用不接受命令的企业库方法,它们将构造一个命令并处理它。例如

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

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

就 SQL 服务器而言,我上次查看 SqlCommand 如果对象未被处置,则没有明显的危害,我记得看到的唯一问题是参数缓存会必须等到垃圾收集被释放。