4

次のコードセットがあります。

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#に慣れていない/初心者なので、ここで最善/最も安全な方法を探しています。ありがとう。

4

4 に答える 4

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

複数の単一ステートメントを「スタック」しているだけです。

于 2012-04-26T22:58:10.033 に答える
2

あなたが持っているものは適切にフォーマットされていますが、それを宣言したブロックconn.Close()の最後で接続が破棄される (したがって閉じられる) ため、呼び出す必要はありません。using

ただし、2 番目のステートメントの括弧は省略できます。これは、そのステートメント全体が単なる別のusingブロックであるためです。

于 2012-04-26T22:51:07.363 に答える
2

conn.Open()そこに呼び出しがあるため、最初の using ステートメントには括弧が必要です。あなたが述べたように、2番目と3番目は積み重ねることができます。これはかなり慣用的なC#です(私の場合は好ましい)。

于 2012-04-26T22:51:19.623 に答える
0
using (OracleConnection conn = new OracleConnection(m_fceConn))
{
    conn.Open();

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

    conn.Close();
}

EDIT 考え直し て、これをしないでください。コマンド オブジェクトは破棄されません。してはいけないことの例として、ここに答えを残しておきます。

于 2012-04-26T22:52:15.367 に答える