SqlDataAdapter在Fill()函数后关闭SqlConnection吗?

时间:2011-09-12 13:33:52

标签: c# .net sql-server sqlconnection sqlconnection.close

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);

2 个答案:

答案 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#