是否需要显式处理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呢?
强烈建议手动处理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();
}**
一旦你到达街区的尽头,使用就会帮你处理掉。