2

アプリケーションで呼び出しOracleCommandd.ExecuteNonquery()ていますが、以下のコードで「この操作のために接続を開く必要があります」という例外が発生します。

using (OracleConnection connection = new OracleConnection(ConnectionString))
        {
            OracleCommand oracleCommand = new OracleCommand(procedureName, connection);
            oracleCommand.CommandType = CommandType.StoredProcedure;

            oracleCommand.ExecuteNonQuery();
        }

connection.Open();ステートメントの直後に配置usingすると、例外は発生しませんがusing、接続の開始フェーズと終了フェーズを処理するステートメントではありません(実際には、接続プールから/への接続の取得と終了のメニューです)。

4

2 に答える 2

3

ただし、接続の開始フェーズと終了フェーズを処理するステートメントを使用していません

いいえ
、関係usingありませconnection.Open()

using (OracleConnection connection = new OracleConnection(ConnectionString))
{
  connection.Open(); //<-- must have
  //rest of code omitted
}

connection.Close()接続が破棄されたときに発生するため、呼び出す必要はありません。usingこれがキーワードの真の目的です。

これは、using実際に翻訳すると次のようになります。

try
{
  //code omitted
}
finally
{
  connection.Dispose();
}
于 2013-06-19T09:23:05.617 に答える
3

ステートメントは、ステートメントのスコープusingで使用されるオブジェクトをインスタンス化するためにのみ使用されます。using接続を破棄するときに接続を閉じますが、開きません。自分で行う必要があります。MSDNから:

IDisposable オブジェクトを正しく使用するための便利な構文を提供します。

    using (OracleConnection connection = new OracleConnection(ConnectionString))
    {
          connection.Open();
          using (OracleCommand oracleCommand = new OracleCommand(procedureName, connection);)
          {
               oracleCommand.CommandType = CommandType.StoredProcedure;
               oracleCommand.ExecuteNonQuery();
          }
    }
于 2013-06-19T09:24:17.260 に答える