2012-10-31 5 views
2

내가 쿼리를 만드는거야 내가 가장 잘 내가 말할 수있는 오라클ORA-01008 : 널 (null)

Not all variables bound 오류를 넘어

를 얻이 수없는 것으로 바인딩 모든 변수는 모든 올바른 보인다. 내가 뭘 놓치고 있니?

코드가 무죄를 보호하기 위해 조금 ...이 마지막 줄에, ID에 대한 매개 변수를 놓치고있는 것 같습니다

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

결국이 문제를 해결할 수있었습니다. 내 문자열 중 하나가 실제로 null 인 것으로 밝혀졌습니다.이 버전에 OracleCommand (더 이상 사용되지 않음으로 표시됨)의 null 매개 변수를 삭제하는 버그가 있습니다. 나를위한 해결책은 실행하기 전에 픽스 업 기능을 실행하는 것이 었습니다.

기타 언급 된 것처럼 주문도 중요합니다. 그래서, 그것도 정확해야합니다.

여기 바로 실행하기 전에 호출, 나를 위해 일한 내용은 다음과 같습니다

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

Brilliant. 나를 위해 일했다! –

1

난독 화 : 또한

"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

고맙습니다. 그러나 그것은 정확하지 않습니다. –