using (Something something = new Something())
{
try
{
}
finally
{
something.SomeCleanup();
}
}
或者说,是否应该在隐式的
something.Dispose()
调用中执行所有清理任务?以下是有问题的代码:public static DataTable GetDataTable(string cmdText, IEnumerable<Parameter> parameters)
{
// Create an empty memory table.
DataTable dataTable = new DataTable();
// Open a connection to the database.
using (SqlConnection connection = new SqlConnection(ConfigurationTool.ConnectionString))
{
connection.Open();
// Specify the stored procedure call and its parameters.
using (SqlCommand command = new SqlCommand(cmdText, connection))
{
command.CommandType = CommandType.StoredProcedure;
SqlParameterCollection parameterCollection = command.Parameters;
foreach (Parameter parameter in parameters)
parameterCollection.Add(parameter.SqlParameter);
try
{
// Execute the stored procedure and retrieve the results in the table.
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
try
{
dataAdapter.Fill(dataTable);
}
catch
{
dataTable.Dispose();
dataTable = null;
}
}
finally
{
//parameterCollection.Clear();
}
}
}
return dataTable;
}
注意:我已经定义了Parameter
类,以便这个函数的用户不必直接处理SqlParameter
的创建。可以使用Parameter
类的SqlParameter
属性来检索SqlParameter
。
在某个时刻,我的程序执行以下操作(无法发布代码,因为涉及到很多类;基本上,我有一个小型框架创建了许多对象):
- 创建一个
Parameter
数组。 GetDataTable('sp_one', parameters)
。GetDataTable('sp_two', parameters)
。
Something
类。实际上,我的Something
类是微软自己的SqlConnection
和SqlParameter
。常识告诉我们微软的程序员应该足够聪明,在Dispose
方法中关闭打开的数据库连接(当然,并不意味着他们不应该提供Close
方法),但文档中并没有说明。我真的很想使用 C++ 并访问 STL 的源代码。 - isekaijinSqlConnection.Dispose
和Close
做的事情是一样的(除了能够在Close
后重新打开而不是Dispose
)。如果您的连接实际上没有关闭,可能是由于连接池。顺便说一下,您实际上可以访问源代码,它已经发布了,还可以使用 Reflector http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1 - František ŽiačikSqlConnection.Dispose
实际上关闭了连接,所以这是我的无知的错。但是我非常确定,当我尝试将SqlParameter第二次添加到SqlParameterCollection时,即使第一个SqlParameterCollection
属于已经释放的SqlCommand
,我仍然会收到“Another SqlParameterCollection contains the SqlParameter”错误。 - isekaijin