![](/img/trans.png)
[英]Replacing System.Data.OracleClient to Oracle.DataAccess (ODP.NET)
[英]Oracle.DataAccess (ODP.NET) Array Binding “Value does not fall within the expected range”
我的情景
我正在使用帶有c#3.5的ODP.NET oracle提供程序,我正在嘗試傳遞一個數組作為一個過程的參數...像這樣:
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 = new string [2] {“name1”,“name1”}; 它抓住了這個錯誤
“價值不在預期范圍內”
任何人都可以解決它?
附加信息
指定OracleDbType錯誤是固定的,但執行會給我一些錯誤
paramNames.OracleDbType = OracleDbType.Varchar2;
“無法將'System.String []'類型的對象強制轉換為'System.IConvertible'。”
我的目標是做這樣的事情
http://aspalliance.com/621_Using_ODPNET_to_Insert_Multiple_Rows_within_a_Single_Round_Trip.3
另外一個沒有參數的問題
像這樣插入一個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。
但是我出了點問題,例如在第二行有效,整個OUT參數(數組)總是設置為0.我預計至少params [0] .value被增強了
謝謝
我想你正在嘗試合並一個數組綁定 {簡單地將一個數組綁定到一個param以使它執行多次 - 這就是你提供的鏈接中的示例如何做到}}和一個關聯數組 {re:PLSQLAssociativeArray with INPUT表格的參數。
既然你沒有發布你正在運行的包/ proc,我假設你正在做這樣的事情(只是把它放下來驗證假設)
procedure insertdata(P_JOB_TITLE IN VARCHAR2) as
begin
insert into myTable(x) value (P_JOB_TITLE);
end insertdata;
要像文章作者那樣執行此操作,您需要使用ArrayBindCount(查看此鏈接,它也有一個示例) 。 這也表明,如果你有多個參數,它會期望每個參數的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 \\ samples \\ 2.x \\ AssocArray
和數組綁定示例(來自您提供的鏈接)@%ORA_HOME%\\ odp.net \\ samples \\ 2.x \\ ArrayBind
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.