2011-09-12 7 views
7

SqlDataAdapterFill()の機能の後にSqlConnectionを閉じるか、自分で閉じる必要がありますか?あなたの現在の使用状況でFill()関数の後にSqlDataAdapterはSqlConnectionを閉じますか?

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

答えて

14

、それはあなたのために閉じます:

塗りつぶしが呼び出される前のIDbConnection が閉じている場合は、データを取得するために開かれ、 を閉じ。 Fillが呼び出される前に接続が開いている場合は、 が開いたままです。

using (SqlConnection conn = new SqlConnection("")) 
{ 
    conn.Open(); 

    // Do Stuff. 

} // Closes here on dispose. 

これは、多くの場合、より読みやすいと内部の仕組みを理解する人に依存しない:

http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx

私は明示的にusing文で、それを自分で応えるために、それは常に良いことだと思いますSqlDataAdapter.Fill、ちょうどusingのステートメントと接続です。

を知っていて、アダプタが使用する前に接続が閉じられている場合(接続を作成したばかりのように)、他の目的では使用されていないため、コードは完全に安全で有効です。私はあなたが行うには

ベストな方法を所有することにより、接続を終了する必要が知っているよう

using(SqlConnection con = new SqlConnection()) 
{ 
    // you code 
} 

これを

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);  
    } 
+0

を私は機能 – Wachburn

+1

の出口の実際@Wachburn前の状態を閉じているものは何でも建設CNを使用して、およびMSDNはこれを確認する相談せずにこのコードを記述する場合。申し訳ありませんが、私は初めてこれをキャッチしませんでした。 –

+0

コマンドが正常に実行された場合はそれを処理しますが、例外の場合はどうなりますか? (デッドロック、タイムアウトなど) –

4

さ:

個人的に、私はこのような何かを書きたいです自動的に接続を終了します

C#でブロックを使用すると、使い捨ての物品で。使い捨てオブジェクトは、処分のために呼び出されたときに使用するリソースを明示的に解放できるオブジェクトです。私たちが知っているように.Netガベージコレクションは非決定論的なので、いつオブジェクトがガベージコレクションされるかを正確に予測することはできません。

細部に多くのため、この記事を読む:understanding ‘using’ block in C#

関連する問題