是否需要显式处理SqlDataAdapter

本文关键字:处理 SqlDataAdapter 是否 | 更新日期: 2023-09-27 18:27:32

在这个线程中,有一个建议是,在操作之后,SqlDataAdapter的实例会像这样显式处理。

String connString = @"your connection string here";
String query = "select * from table";
SqlConnection conn = new SqlConnection(connString);        
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dataTable);
conn.Close();
da.Dispose();

真的有必要吗?GC呢?

是否需要显式处理SqlDataAdapter

强烈建议手动处理IDisposable对象。有一个很好的语法快捷方式:

using SqlConnection con = new SqlConnection(connstring);
using SqlCommand com = new SqlCommand();
using SqlDataAdapter da = new SqlDataAdapter();
com.Connection = con;
//etc..

通过这种方式,编译器将确保在使用创建的所有对象超出作用域后调用Dispose()(它使用try..finally来实现这一点)。

GC不负责对对象调用Dispose(),它的主要职责是从不再引用的堆中收集对象。一个例外是,如果您的类是Finalizable。在这种情况下,GC将确保首先调用对象的终结器,然后收集它。你可以在你的Finalizer中调用Dispose(),有一个很好的模式叫做";处置方法":http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

但一般规则是(有几个例外):如果您正在实例化一个实现IDisposable的对象,则您有责任对其调用Dispose

来自MSDN文章中SqlDataAdapter类的代码示例:

private static DataSet SelectRows(DataSet dataset, string connectionString,string queryString) 
{
    using (SqlConnection connection = 
        new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(
            queryString, connection);
        adapter.Fill(dataset);
        return dataset;
    }
}

SqlConnection被封装在using语句中,而不是SqlDataAdapter

所以我想说这不是必须的。

也就是说,有些人倾向于如果它实现IDisposable,就处理掉它

在这种情况下,还可以将SqlDataAdapter封装在using语句中。来自链接文章:

通常,当使用IDisposable对象时,应该声明和在using语句中实例化它。

通常。。。是的。
在某些情况下,不需要调用Dispose,但这些情况是基于实现细节的,不应被视为通用方法。

一次性不是垃圾收集。它是关于确定性资源清理的。这些东西是平行的宇宙。

GC可以收集对象,该对象在不调用Dispose的情况下实现IDisposable。但是,例如,如果该对象持有操作系统句柄,则有两种方法:要么立即释放句柄(调用Dispose),要么等待终结器(但终结器何时运行,只知道GC)。

当你的资源得到管理时,情况会更糟
不应在终结器中释放托管资源。因此,所有资源清理都是Dispose方法的责任。如果不调用Dispose,托管资源将永远不会被清理(最流行的示例是事件取消预订),这会导致内存泄漏。

String connString = @"your connection string here";
String query = "select * from table";
SqlConnection conn = new SqlConnection(connString);        
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
**Using(SqlDataAdapter da = new SqlDataAdapter(cmd))
{
    da.Fill(dataTable);
    conn.Close();
}**

一旦你到达街区的尽头,使用就会帮你处理掉。