在SqlDataAdapter
功能之后SqlConnection
是关闭Fill()
还是我需要自己关闭它?
string cnStr = @"Data Source=TEST;Initial Catalog=Suite;Persist Security Info=True;User ID=app;Password=Immmmmm";
cn = new SqlConnection(cnStr);
SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM Date", cn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
cn.Close() // ????????
Console.WriteLine(ds.Tables[0].Rows.Count);
Console.WriteLine(cn.State);
答案 0 :(得分:14)
在您目前的使用情况中,它会为您关闭:
如果是IDbConnection 在调用Fill之前关闭它,它被打开以检索数据和 然后关闭如果在调用Fill之前连接已打开,则为 仍然开放。
http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx
我认为用using
语句自己明确地照顾它总是更好:
using (SqlConnection conn = new SqlConnection(""))
{
conn.Open();
// Do Stuff.
} // Closes here on dispose.
这通常更具可读性,并不依赖于人们理解SqlDataAdapter.Fill
的内部工作原理,只需要理解using
语句和连接。
但是,如果您知道连接在适配器使用之前关闭(例如,您刚刚创建了连接)并且它不用于其他任何东西,那么您的代码是非常安全的有效的。
就个人而言,我写的是这样的:
string cnStr = "Data Source=TEST;Initial Catalog=Suite;Persist Security Info=True;User ID=app;Password=Immmmmm";
DataSet ds = new DataSet();
using (SqlConnection cn = new SqlConnection(cnStr))
using (SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM Date", cn))
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
conn.Open();
adapter.Fill(ds);
}
答案 1 :(得分:4)
据我所知,您需要通过自己关闭连接
最好的办法是
using(SqlConnection con = new SqlConnection())
{
// you code
}
这会自动关闭你的连接
在处理一次性物体时,使用C#中的块非常方便。一次性对象是那些可以在调用dispose时显式释放它们使用的资源的对象。我们知道.Net垃圾收集是非确定性的,因此您无法预测对象何时会被垃圾收集。阅读这篇文章了解更多详情:understanding ‘using’ block in C#