繁体   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