簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM