2011-06-20 53 views
3

我的情況Oracle.DataAccess(ODP.NET)數組綁定「值沒有在預期範圍內」

我使用ODP.NET Oracle提供與C#3.5,我想傳遞一個數組作爲參數的過程...這樣的:

var paramNames = new OracleParameter(); 
paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
paramNames.ParameterName = "P_JOB_TITLE"; 
paramNames.Size = 2; 
paramNames.Value = new string[2]{ "name1", "name1" }; 
cmd.Parameters.Add(paramNames); 

當運行時代碼進入paramNames.Value =新的字符串[2] { 「NAME1」, 「NAME1」};它與此錯誤

「值沒有在預期範圍內」

任何人都可以修復它趕上?

附加信息

指定OracleDbType誤差是固定的,但在執行給我一些錯誤

paramNames.OracleDbType = OracleDbType.Varchar2; 

「無法轉換類型的對象‘System.String []’爲類型「系統.IConvertible」。」

我的目標是做這樣的事情

http://aspalliance.com/621_Using_ODPNET_to_Insert_Multiple_Rows_within_a_Single_Round_Trip.3

WITH OUT參數

另一個問題插入out參數這樣

  paramNames = new OracleParameter(); 
      paramNames.ParameterName = "O_JOB_ID"; 
      paramNames.Size = 3; 
      paramNames.Direction = ParameterDirection.Output; 
      paramNames.OracleDbType = OracleDbType.Int32; 
      paramNames.Value = new int[3] { 0, 0, 0 }; ; 
      cmd.Parameters.Add(paramNames); 

它正確填寫時ExecuteNonQuery完成。例如,pls-sql過程執行3次插入,並且返回每個數組記錄的row-id。

但我出了差錯,例如isnerting第2行中,整個OUT參數(數組)在第0總是設置我預期至少PARAMS [0]。價值明顯增強

由於

回答

5

我想你想合併一個數組綁定 {簡單地綁定一個數組到一個參數讓它執行多次 - 這就是你提供的鏈接中的例子是如何做的} 關聯數組 {重新:PLSQLAssociativeArray與TABLE OF的INPUT參數。

既然你不發表您的包的/ proc正在運行,我假設你正在做這樣的事情(只是把這個下來,以驗證假設)

procedure insertdata(P_JOB_TITLE IN VARCHAR2) as 
begin 
insert into myTable(x) value (P_JOB_TITLE); 
end insertdata; 

要像執行此您需要使用文章的作者ArrayBindCount (check out this link, it also has an example)。 這也表明,如果你有多個參數,它會爲每一個參數指定一個ARRAY。

我們有這個執行所有P_JOB_TITLE(),您在

//this was missing in your example and MUST be there to tell ODP how many array elements to expect 
cmd.ArrayBindCount = 2; 

string[] jobTitleArray = {"name1", "name1"}; 

OracleParameter paramNames= new OracleParameter("P_JOB_TITLE", OracleDbType.Varchar2); 

    //paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray;/*once again, you are passing in an array of values to be executed and not a pl-sql table*/ 

    //paramNames.Size = 2; /* this is unnecessary since it is for a plsql-associative array*/ 
    paramNames.Value = jobTitleArray ; 
    cmd.Parameters.Add(paramNames); 

通過對於plSQLAssociativeArray例子來看看,當你安裝ODP @%ORA_HOME%\ ODP提供的樣品.NET \樣品\ 2.x的\ AssocArray

和用於陣列結合的例子(從你提供的鏈接) @%ORA_HOME%\ odp.net \樣品\ 2.x的\ ArrayBind

+0

確定人第ANKS我解決了它.....但現在我有另一個問題...我引入一個OUT參數作爲數組,它的工作原理就像一個數據庫,但只有當PLSQL過程成功。如果在數組循環過程中出現問題,所有OUT數組參數都將被重置 – user756037

+0

@ user756037您是否在執行正在執行的pl/sql塊中執行任何異常處理?你應該能夠捕捉和處理(或至少不中斷陣列中的其他項目),通過不允許異常冒泡。 – Harrison

+0

我只調用cmd.ExecuteNonQuery();在try {} catch {}語句中,並且在{}中檢查參數 – user756037

相關問題