2010-03-23 60 views
0

我正在使用Oracle .NET Provider,並且正在調用包中的存儲過程。我收到的信息是「電話號碼或類型錯誤」。我已經確保參數的添加順序是正確的,並且我已經徹底檢查了OracleDbType,儘管我懷疑這是我的問題所在。這裏是代碼隱藏:.NET Oracle提供程序:爲什麼我的存儲過程不起作用?

//設置初始東西,連接和命令 string msg = string.Empty; string oraConnString = ConfigurationManager.ConnectionStrings [「OracleServer」]。ConnectionString; OracleConnection oraConn = new OracleConnection(oraConnString); OracleCommand oraCmd = new OracleCommand(「PK_MOVEMENT.INSERT_REC」,oraConn); oraCmd.CommandType = CommandType.StoredProcedure;

try 
    { 
     //iterate the array 
     //grab 3 items at a time and do db insert, continue until all items are gone. Will always be divisible by 3. 
     for (int i = 0; i < theData.Length; i += 3) 
     { 
      //3 items hardcoded for now 
      string millCenter = "0010260510"; 
      string movementType = "RECEIPT"; 
      string feedCode = null; 
      string userID = "GRIMMETTM"; 
      string inventoryType = "INGREDIENT"; //set to FINISHED for feed stuff 
      string movementDate = theData[i + 0]; 
      string ingCode = System.Text.RegularExpressions.Regex.Match(theData[i + 1], @"^([0-9]*)").ToString(); 
      string pounds = theData[i + 2].Replace(",", ""); 

      //setup parameters 
      OracleParameter p1 = new OracleParameter("A_MILL_CENTER", OracleDbType.NVarchar2, 10); 
      p1.Direction = ParameterDirection.Input; 
      p1.Value = millCenter; 
      oraCmd.Parameters.Add(p1); 

      OracleParameter p2 = new OracleParameter("A_INGREDIENT_CODE", OracleDbType.NVarchar2, 50); 
      p2.Direction = ParameterDirection.Input; 
      p2.Value = ingCode; 
      oraCmd.Parameters.Add(p2); 

      OracleParameter p3 = new OracleParameter("A_FEED_CODE", OracleDbType.NVarchar2, 30); 
      p3.Direction = ParameterDirection.Input; 
      p3.Value = feedCode; 
      oraCmd.Parameters.Add(p3); 

      OracleParameter p4 = new OracleParameter("A_MOVEMENT_TYPE", OracleDbType.NVarchar2, 10); 
      p4.Direction = ParameterDirection.Input; 
      p4.Value = movementType; 
      oraCmd.Parameters.Add(p4); 

      OracleParameter p5 = new OracleParameter("A_MOVEMENT_DATE", OracleDbType.NVarchar2, 10); 
      p5.Direction = ParameterDirection.Input; 
      p5.Value = movementDate; 
      oraCmd.Parameters.Add(p5); 

      OracleParameter p6 = new OracleParameter("A_MOVEMENT_QTY", OracleDbType.Int64, 12); 
      p6.Direction = ParameterDirection.Input; 
      p6.Value = pounds; 
      oraCmd.Parameters.Add(p6); 

      OracleParameter p7 = new OracleParameter("INVENTORY_TYPE", OracleDbType.NVarchar2, 10); 
      p7.Direction = ParameterDirection.Input; 
      p7.Value = inventoryType; 
      oraCmd.Parameters.Add(p7); 

      OracleParameter p8 = new OracleParameter("A_CREATE_USERID", OracleDbType.NVarchar2, 20); 
      p8.Direction = ParameterDirection.Input; 
      p8.Value = userID; 
      oraCmd.Parameters.Add(p8); 

      OracleParameter p9 = new OracleParameter("A_RETURN_VALUE", OracleDbType.Int32, 10); 
      p9.Direction = ParameterDirection.Output; 
      oraCmd.Parameters.Add(p9); 

      //open and execute 
      oraConn.Open(); 
      oraCmd.ExecuteNonQuery(); 
      oraConn.Close(); 

     } 
    } 
    catch (OracleException oraEx) 
    { 
     msg = "An error has occured in the database: " + oraEx.ToString(); 
    } 
    catch (Exception ex) 
    { 
     msg = "An error has occured: " + ex.ToString(); 
    } 
    finally 
    { 
     //close connection 
     oraConn.Close(); 

    } 

    return msg; 
+0

「磅」(p6)真的是Int64嗎?雖然它應該仍然有效,但這是巨大的。你可以顯示程序的簽名嗎? – curtisk 2010-03-23 16:41:40

+0

你還可以發佈存儲過程的聲明嗎? – HitLikeAHammer 2010-03-23 16:42:12

+0

即使我設置feedcode不等於null,我得到這個。 – Matt 2010-03-23 17:41:22

回答

1

難道任何您指定的參數值的其實null?我不太瞭解Oracle的情況,但對於SQL Server,將null分配給參數會導致在執行過程時不會發送該參數(這會導致過程中抱怨參數數量)。取而代之的null你應該通過DBNull.Value

p1.Value = millCenter ?? DBNull.Value; 
+0

好點,讓它總是通過全套參數+1 – curtisk 2010-03-23 16:44:06

1

我認爲你的問題可能是您的第9個參數。如果這是存儲過程的返回值,則返回類型應設置爲ParameterDirection.ReturnValue

希望有所幫助。

0

我基本上踩在我自己的腳趾在這裏...我在循環中設置參數,然後在每次迭代後不清除它們。我現在很好。

相關問題