2012-04-26 13 views
4

私は、次のコードのセットを持っている:ネストされた "using"ステートメントの適切な形式は?

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
{ 
    conn.Open(); 

    using (OracleCommand cmd = new OracleCommand(m_sql, conn)) 
    { 
     using (OracleDataReader reader = cmd.ExecuteReader()) 
     { 
      reader.Read(); 
     } 
    } 

    conn.Close(); 
} 

はこれをフォーマットする良い方法はありますか?確かに、後で私はおそらく、接続を開いたり、クエリを実行したり、後で別の関数に接続を終了したりすることになるだろうが、このネストはまだ "舞台裏"にある。

私はそうのようなものをフォーマットすることができ、別のスレッドで読む:

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
using (OracleCommand cmd = new OracleCommand(m_sql, conn)) 

しかし、私は、私はそのようなブラケットを省略することができると信じていないこれらのステートメントのそれぞれの間にコードを持っていることを考慮。私はまだC#のまだ全く新しい/ noobだから私は最高/最も安全なプラクティスを探しています。ありがとう。

+0

dispose(using)は暗黙的にcloseを呼び出すため、接続を閉じる必要はありません。 –

+0

@Tim Schmelter:そのおかげでありがとう。私はそれが本当に確信していたが、私はむしろ安全だと思った。しかし、私は、Open-> Read < - Closeよりも明確にならないので、書き出すことの説明のようなものでもあります。それを残して起こりうる問題はありますか? – Kittoes0124

+0

@Kittoes - いいえ、問題ありません。また、 'cmd.ExecuteReader(CommandBehavior.CloseConnection)'を実行することもできます。これにより、接続も終了します。 –

答えて

3

私は間違っているかもしれませんが、OracleCommandに渡す前に接続を開く必要はないと思います。コマンドを実行する前にそれを開くだけです。

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
using (OracleCommand cmd = new OracleCommand(m_sql, conn)) 
{ 
    conn.Open(); 
    using (OracleDataReader reader = cmd.ExecuteReader()) 
    { 
     reader.Read(); 
    } 
} 

(あなたはまた、明示的にどちらか近い接続を廃棄するため、必要はありませんそれを自動的に閉じる必要があります):だから、上記のように書くことができます。

上記のコードには何も特別なものはありません(それ以外のものはうまくありません)。通常は、このようなブロックに単一のコマンドを適用する通常のC#ルールを使用しています。

if (...) 
if (...) 
    dosomething(); // Look Ma, no curly braces 

複数の単一のステートメントを「積み重ねている」ということだけです。

2

conn.Close()に電話する必要はありませんが、適切な書式が設定されていますが、接続は、それが宣言されたusingブロックの最後に配置される(したがって閉鎖される)ため、

ただし、2番目のステートメントの大括弧は、そのステートメント全体がもう1つのusingブロックであるため、省略することができます。

2

最初に使用するステートメントには、conn.Open()コールがあるので、角かっこが必要です。 2番目と3番目は、あなたが述べたように積み重ねることができます。これはかなり慣用的なC#です(私の場合は優先されます)。

0
using (OracleConnection conn = new OracleConnection(m_fceConn)) 
{ 
    conn.Open(); 

    using (OracleDataReader reader = new OracleCommand(m_sql, conn).ExecuteReader()) 
    { 
     reader.Read(); 
    } 

    conn.Close(); 
} 

EDIT 考え直しで、これをしません。コマンドオブジェクトを破棄することはありません。私は何をしないかの例としてここに答えを残します。

+1

これは、Oracleライブラリのその他のトリッキーがそれをしない限り、コマンドを破棄しません。 –

+0

ああ、良いキャッチ。それを修正する方法はありますか? – therealmitchconnors

+0

あなたはいつでもあなたの答えを編集したり、もはや関連性のないものを削除することができます。 –

関連する問題