Oracle.DataAccess(ODP.NET)数组绑定”;值不在预期范围内”;

本文关键字:范围内 绑定 DataAccess ODP NET 数组 Oracle | 更新日期: 2023-09-27 17:59:31

我的场景

我使用的是带有c#3.5的ODP.NEToracle提供程序,我正试图将一个数组作为过程的参数传递。。。像这样:

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[]"类型的对象强制转换为"System.IConvertable"类型。"

我的目标是做一些类似的事情

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

另一个没有参数的问题

插入类似的输出参数

            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次插入,我返回每个数组记录的行id。

但如果出现问题,例如在第二行,整个OUT参数(数组)总是设置为0。我希望至少有params[0]。值得到了增强

感谢

Oracle.DataAccess(ODP.NET)数组绑定”;值不在预期范围内”;

我认为您正在尝试将数组绑定{简单地将数组绑定到一个参数以使其多次执行——您提供的链接中的示例就是这样做的}与关联数组{re:PLSQLAssociationArray,INPUT参数为TABLE of}合并。

由于你没有发布你正在运行的包/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);

对于plSQLAssociationArray示例,请查看安装ODP@%ORA_HOME%''ODP.net''samples''2.x''AssocArray 时提供的示例

对于数组绑定示例(来自您提供的链接)@%ORA_HOME%''odp.net''samples''2.x''ArrayBind