2013-07-29 13 views
5

私はC#で準備された文を作成しようとしています。c#oracle sql prepared statement

何らかの理由で、私が試したすべてが例外で終了します。

*。これは今の私のコードです:

私が得る例外は: "操作はオブジェクトの現在の状態のために有効ではありません。"

using (OracleCommand cmd = new OracleCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.Text; 

     cmd.CommandText = "insert into daily_cdr_logs " + 
       "(message) " + 
       "values " + 
       "(:message)"; 

     cmd.Parameters.Add(:message, msg); 
     //OracleDbType.Int32, postpaid_duration, ParameterDirection.Input); 
     cmd.Prepare(); 
     cmd.ExecuteNonQuery(); 
    } 
  • 私は何人かの人々がParameters.AddWithValueでこれをやって見てきました。私はOracleCommand.Parametersの関数AddWithValueを見つける傾ける何らかの理由ではなく、私はOracle.DataAccess.Clientを輸入していると私は、接続は、あなたが呼び出す前にオープンにする必要があり、2010年
+0

以前に接続を開いたことがありますか? – Steve

+2

あなたは以前にそれを聞いていませんか? http:// stackoverflow。com/questions/17921492/c-sharp-equivalent-to-java-prepared-statement –

+0

Prepare行またはExecuteNonQuery行で例外が発生していますか? – Steve

答えて

0

のVisual Studioを使用して、オラクルDATAACCESSのrefferanceを持っていますcmd.ExecuteNonQuery()

はこれを試してみてください:

cmd.Connection.Open(); 
cmd.ExecuteNonQuery(); 
+2

接続が開かれています – susparsy

0

は、この方法を試してみてください:

using (OracleCommand cmd = new OracleCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.Text; 

     cmd.CommandText = "insert into daily_cdr_logs " + 
       "(message) " + 
       "values " + 
       "(:message)"; 

     OracleParameter pMsg = new OracleParameter("message",OracleDbType.Varchar2); 
      pMsg.Value = msg; 

     cmd.Parameters.Add(pMsg); 

     //OracleDbType.Int32, postpaid_duration, ParameterDirection.Input); 
     cmd.Prepare(); 
     cmd.ExecuteNonQuery(); 
    } 
+0

DbType.Varchar;存在しない、おそらくoracledbtypes? – susparsy

+0

@susparsyおそらく 'Varchar2'ですか?私は答えを編集しました。 – Parado

3

一般的なルールが必要と近い/できるだけ早くあなたが完了しているとして、それを処分した場合にのみ接続をオープンしています。接続プールは自動的に管理されるため、新しい接続を開いても重い作業は発生しません。接続を開いて閉じて同じ接続を再度開くと、新しいネイティブ接続は実際には作成されません。前の接続プールが接続プールからフェッチされます。デフォルトは通常正常ですので、接続を作成するときにプーリングするものを渡さないことをお勧めします。 10個のコマンドを連続して実行している場合は、接続を開き、10個のコマンドを実行して閉じます。彼らが次々に実行されることが保証され、他のことをするときにあなたが接続を「保持」していない場合にのみ、それを行います。他の操作が必要な場合は、接続を終了してから接続を終了してください。これにより、通常は最高のパフォーマンスが得られます。

ほぼ。試してみてください:

cmd = new command(...); 
cmd.parameters.Add(...) 
cmd.parameters.Add(...) 

その後、connection.open() //結果

をコマンドを実行し、使用
0

準備コマンドのSQL Serverのバージョンを使用して、準備を呼び出す前に、各パラメータのデータ型を指定

必要です には、準備されるステートメント。変数 の長さのデータ型を持つ各パラメーターについては、Sizeプロパティーを最大サイズ に設定する必要があります。準備コマンドがのIDbCommandクラスで定義されており、私は、これはOracleのも事実であると仮定し、他のADO.NETクラスによって継承されているので、これらの条件が

を満たしていない場合に次の行を追加しますので、エラーを返します準備あなたのコマンドにパラメータを追加してください(そして、Prepareを呼び出すときに接続が既に開いていることを確認してください)

cmd.CommandText = "insert into daily_cdr_logs (message) " + 
        "values (:message)"; 
OracleParameter p = new OracleParameter(":message", DbType.Varchar); 
p.Size = 2000; // as a wild guess 
p.Value = msg; 
cmd.Parameters.Add(p); 
cmd.Prepare(); 
cmd.ExecuteNonQuery(); 
関連する問題