Noob ADO.NET问题:我可以执行以下操作吗?
我有以下函数,由我的Web服务中的每个WebMethod
间接调用:
public static DataTable GetDataTable(string cmdText, SqlParameter[] parameters)
{
// Read the connection string from the web.config file.
Configuration configuration = WebConfigurationManager.OpenWebConfiguration("/WSProveedores");
ConnectionStringSettings connectionString = configuration.ConnectionStrings.ConnectionStrings["..."];
SqlConnection connection = null;
SqlCommand command = null;
SqlParameterCollection parameterCollection = null;
SqlDataAdapter dataAdapter = null;
DataTable dataTable = null;
try
{
// Open a connection to the database.
connection = new SqlConnection(connectionString.ConnectionString);
connection.Open();
// Specify the stored procedure call and its parameters.
command = new SqlCommand(cmdText, connection);
command.CommandType = CommandType.StoredProcedure;
parameterCollection = command.Parameters;
foreach (SqlParameter parameter in parameters)
parameterCollection.Add(parameter);
// Execute the stored procedure and retrieve the results in a table.
dataAdapter = new SqlDataAdapter(command);
dataTable = new DataTable();
dataAdapter.Fill(dataTable);
}
finally
{
if (connection != null)
{
if (command != null)
{
if (dataAdapter != null)
{
// Here the DataTable gets disposed.
if (dataTable != null)
dataTable.Dispose();
dataAdapter.Dispose();
}
parameterCollection.Clear();
command.Dispose();
}
if (connection.State != ConnectionState.Closed)
connection.Close();
connection.Dispose();
}
}
// However, I still return the DataTable
// as if nothing had happened.
return dataTable;
}
答案 0 :(得分:2)
一般规则是处理实现IDisposable
的任何内容,无论它是否“需要”。让您远离“需要它”的时间,而您却没有想到Dispose。
一旦你在对象上调用了Dispose,就不应该再使用它了。期。它违反了Dispose的整个概念。
这就是为什么不应该在从方法返回的对象上调用Dispose的原因。将它留给调用者在完成对象时调用Dispose。
using (SqlConnection connection = new SqlConnection(connectionString.ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(cmdText, connection))
{
//...
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
{
DataTable dataTable = new DataTable();
dataAdapter.Fill(dataTable);
return dataTable;
}
}
}
答案 1 :(得分:1)
好吧,你不能吃蛋糕并吃掉它。)
关闭连接等等,当然,但为什么需要处理该表?这不是必要的。按原样返回。
否则你将处于这样的位置......将表复制到其他地方然后返回它?如果您使用ORM作为示例并将数据映射到对象然后返回对象,这将是有意义的,但如果您不是,那么只需直接使用表/数据集。