2012-10-31 39 views
2

我創建一個查詢,我似乎無法獲得超越Not all variables bound錯誤甲骨文ORA-01008:並非所有與空

是最好的,我可以告訴約束變量,一切看起來是正確的。我錯過了什麼?

代碼混淆了一下,以保護無辜...

OracleCommand execCmd = new OracleCommand(); 

OracleParameter outParam = 
     new OracleParameter("ID", OracleType.Int32); 
outParam.Value = DBNull.Value; 
outParam.Direction = System.Data.ParameterDirection.Output; 
execCmd.CommandText = "insert into o " + 
     "(A, B, " + 
     "C, D, E, " + 
     "F, G, H, I, " + 
     "J, K) " + 
     "VALUES (:A, :B, :C, :D, :E, " + 
     ":F, :G, :H, :I, :J, :K) " + 
     "RETURNING O_ID INTO :ID"; 
execCmd.Parameters.AddWithValue("A", og.N); 
execCmd.Parameters.AddWithValue("B", DBNull.Value); 
execCmd.Parameters.AddWithValue("C", DBNull.Value); 
execCmd.Parameters.AddWithValue("D", og.A); 
execCmd.Parameters.AddWithValue("E", 
    og.A1 + " " + og.A2 + " " + og.A3 + 
    " " + og.C); 
execCmd.Parameters.AddWithValue("F", DBNull.Value); 
execCmd.Parameters.AddWithValue("G", DBNull.Value); 
execCmd.Parameters.AddWithValue("H", og.Cs); 
execCmd.Parameters.AddWithValue("I", ss); 
execCmd.Parameters.AddWithValue("J", DBNull.Value); 
execCmd.Parameters.AddWithValue("K", "N"); 
execCmd.Parameters.Add(outParam); 
conn.executeCommand(execCmd, trx); 

回答

5

我最終能夠解決這個問題。原來我的其中一個字符串實際上是空的,並且此版本的OracleCommand(標記爲已棄用)中存在一個缺陷,導致它刪除空參數。對我來說,解決方案是在執行之前運行修復功能。

另外,正如其他人所說,順序很重要。所以,這也需要是正確的。

這裏是爲我工作,稱這是在執行前右:

private void PopulateNullParameters(OracleCommand cmd) 
{ 
    foreach (OracleParameter p in cmd.Parameters) 
    { 
     if (p.Value == null) 
     { 
      p.Value = DBNull.Value; 
     } 
    } 
} 
+0

輝煌。也爲我工作! –

1

它看起來像您缺少ID的參數,在最後一行:

"RETURNING ORGANIZATION_ID INTO :ID"; 

而且,基於this SO question,看起來OracleCommand對象按位置綁定參數,所以如果您的參數出現故障,您可能需要查看使用BindByName屬性:

using(OracleCommand cmd = con.CreateCommand()) { 
    ... 
    cmd.BindByName = true; 
    ... 
} 
+0

謝謝,但它的頂部居然宣佈,並在底部加入,以便/位置,所以'BindByName'不這個問題我不認爲。奇怪的是,我似乎錯過了那個屬性,雖然... –

0

嘗試與:結腸

例如你之前的參數名稱

execCmd.Parameters.AddWithValue(":NAME", org.Name); 
    execCmd.Parameters.AddWithValue(":EDP", DBNull.Value); 
    execCmd.Parameters.AddWithValue(":EDD", DBNull.Value); 
    execCmd.Parameters.AddWithValue(":ACRONYM", org.Acronym);  
    .... 
+0

謝謝,但那看起來不正確。 –