我的功能如下所示。我的问题是:我们是否需要在此函数中关闭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;
}
答案 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
时没有明显的危害,如果没有处理该对象,我记得唯一的问题是参数缓存必须等到垃圾收集被释放。