2013-07-29 91 views
5

我想在c#中創建一個準備好的語句。c#oracle sql語句

出於某種原因,我嘗試的一切都以exeption結束。

*。這是我現在的代碼:

我得到的異常是:「由於對象的當前狀態,操作無效」。

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和我有oracle的數據訪問refferance,使用Visual Studio 2010中
+0

您是否打開過連接? – Steve

+2

你以前沒問過嗎? HTTP://計算器。com/questions/17921492/c-sharp-equivalent-to-java-prepared-statement –

+0

Prepare行或ExecuteNonQuery行引發異常? – Steve

回答

0

連接需要打開你打電話之前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的類中定義的並且通過其他ADO.NET類繼承我假設這是真的還爲Oracle這些條件不能滿足

,從而添加下列行來將該參數添加到您的命令中(並且確保在您撥打準備時連接已打開)

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();