企业库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
如果对象未被处置,则没有明显的危害,我记得看到的唯一问题是参数缓存会必须等到垃圾收集被释放。
我的函数如下所示。我的问题是:我们是否需要在此函数中关闭 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
如果对象未被处置,则没有明显的危害,我记得看到的唯一问题是参数缓存会必须等到垃圾收集被释放。