2010-12-08 15 views
4

私は、コードのこの部分を持っている:C#閉じるsqlconnectionとsqldatareaderかどうか?

 
SqlConnection conn; 
string strconString = System.Configuration.ConfigurationManager.ConnectionStrings["SQLCONN"].ToString(); 
conn = new SqlConnection(strconString); 
string cmdstr = "select status from racpw where vtgid = " + vtgid; 
SqlCommand cmdselect = new SqlCommand(cmdstr, conn); 
conn.Open(); 
SqlDataReader dtr = cmdselect.ExecuteReader(); 
if (dtr.Read()) 
{ 
return; 
} 
else 
{ 
... 
} 
dtr.Close(); 
conn.Close(); 

今、私の質問です。 返された場合、私の接続とdtrは自動的に閉じられますか、または接続が閉じられた後にbool変数を使用して戻り値を返す必要がありますか?

答えて

9

あなたが復帰する前に、接続を閉じる必要があります。 SqlConnectionはIDisposableインターフェイスを実装しているため、これを実行する最善の方法はUSINGブロックです。その場合、例外がスローされても接続を閉じる必要があることに注意する必要はありません。

以下の例を参照してください。他の人が指摘したように、SqlConnectionオブジェクトは、IDisposableを実装し

using (var conn = new SqlConnection(strconString)) 
{ 
    string cmdstr = 
     "select status from racpw where vtgid = " + vtgid; 
    using (var cmdselect = new SqlCommand(cmdstr, conn)) 
    { 
     conn.Open(); 
     using(var dtr = cmdselect.ExecuteReader()) 
     { 
      if (dtr.Read()) 
      { 
       return; 
      } 
      else 
      { 
       ... 
      } 
     } 
    } 
} 
3

代わりにusingブロックを使用することをお勧めします。これは、メソッドの途中で返す場合でもDisposeへの呼び出しを強制します:usingが実際にtry/finallyブロックであり、そしてあなたが返す場合でも、finallyブロックが実行されDisposeを実行しているため

string strconString = System.Configuration.ConfigurationManager 
    .ConnectionStrings["SQLCONN"].ToString(); 

using (SqlConnection conn = new SqlConnection(strconString)) 
{ 
    string cmdstr = 
     "select status from racpw where vtgid = " + vtgid; 

    using(SqlCommand cmdselect = new SqlCommand(cmdstr, conn)) 
    { 
     conn.Open(); 
     using(SqlDataReader dtr = cmdselect.ExecuteReader()) 
     { 
      if (dtr.Read()) 
      { 
       return; 
      } 
      else 
      { 
       ... 
      } 
     } 
    } 
} 

これは動作しますあなたのSqlCommandSqlDataReaderにここで

4

はあなたのコードを改善する方法は次のとおりです。

var connectionString = System.Configuration.ConfigurationManager 
    .ConnectionStrings["SQLCONN"].ToString(); 

using (var conn = new SqlConnection(connectionString)) 
{ 
    conn.Open(); 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = 
      "select status from racpw where vtgid = @vtgid"; 

     cmd.Parameters.AddWithValue("@vtgid", vtgid); 

     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       ... 
      } 
     } 
    } 
} 

あなたは、閉じ処分を心配する必要はありません。この方法では...

1

を。 IDisposableが存在するため、リソースが解放されるタイミングを制御できます。あなた自身でDisposeを呼び出さなければ、あなたの接続は自動的に閉じられますが、これがいつ起きるかは制御できません(おそらくガベージコレクタがオブジェクトを収集するときに起こります)。

+0

つまり、接続はガベージコレクタによって閉じられません。その場合、新しい接続を再度作成して開くときにInvalidOperationExceptionが発生します。 – Egor4eg

関連する問題