我可以处理DataTable并且以后仍然使用它的数据吗?

时间:2011-03-04 23:23:12

标签: ado.net

Noob ADO.NET问题:我可以执行以下操作吗?

  1. 以某种方式检索DataTable。
  2. 处理它。
  3. 仍在使用其数据。 (但不要将其发送回数据库,或请求数据库更新它。)
  4. 我有以下函数,由我的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;
    }
    

2 个答案:

答案 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作为示例并将数据映射到对象然后返回对象,这将是有意义的,但如果您不是,那么只需直接使用表/数据集。