我是否需要显式处置SqlDataAdapter?

时间:2013-08-13 09:36:49

标签: c# database-connection

this thread中,有人建议在操作之后, 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怎么样?

4 个答案:

答案 0 :(得分:9)

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

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

这样编译器将确保在大括号中的代码完成执行后,在“using”中创建的所有对象上调用Dispose(它使用try..finally来执行此操作)。

GC不负责在对象上调用Dispose,它的主要职责是从堆中收集不再引用的对象。一个例外是你的班级是Finalizable。在这种情况下,GC将确保首先调用对象的终结器,然后收集它。您可以在Finalizer中调用Dispose,这有一个很好的模式,称为“Dispose Method”:http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

但是一般规则是(除了几个例外):如果你实例化一个实现IDisposable的对象,你有责任在它上面调用Dispose。

答案 1 :(得分:5)

从代码示例中包含SqlDataAdapter Class

的MSDN协议
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 statement中。来自那篇链接的文章:

  

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

答案 2 :(得分:2)

通常......是的,你这样做 在某些情况下,当不需要调用Dispose时,这些情况基于实现细节,不应被视为一般方法。

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

GC可以收集对象,该对象在不调用IDisposable的情况下实现Dispose。但是,如果该对象拥有OS句柄,例如,您有两种方法:立即释放句柄(调用Dispose),或等待终结器(但是当终结器运行时,只知道GC)。

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

答案 3 :(得分:1)

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();
}**

一旦你到达街区尽头,使用将把它丢弃。