【问题标题】:Oracle.DataAccess (ODP.NET) Array Binding "Value does not fall within the expected range"Oracle.DataAccess (ODP.NET) 数组绑定“值不在预期范围内”
【发布时间】:2011-06-20 13:22:51
【问题描述】:

我的场景

我正在使用带有 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

另一个没有参数的问题

像这样插入一个输出参数

            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 得到了增强

谢谢

【问题讨论】:

    标签: c# arrays oracle binding odp.net


    【解决方案1】:

    我认为您正在尝试合并 Array Bind {只需将数组绑定到参数以使其执行多次 - 这就是您提供的链接中的示例如何做到的} 关联数组 {re: PLSQLAssociativeArray with an INPUT param of TABLE OF}。

    由于你没有发布你正在运行的包/过程,我假设你正在做这样的事情(只是把它放下来验证假设)

    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\samples\2.x\AssocArray 时提供的示例

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

    【讨论】:

    • 好的,谢谢我修复了它.....但现在我有另一个问题......我引入了一个 OUT 参数作为数组,它的工作原理就像一个 sharm 但只有当 PLSQL 过程成功时。如果在数组循环过程中出现问题,则所有 OUT 数组参数都会重置
    • @user756037 您是否在正在执行的 pl/sql 块中进行任何异常处理?您应该能够通过不允许异常冒泡来捕获和处理(或至少不中断数组中的其他项目)。
    • 我只调用 cmd.ExecuteNonQuery();在 try{}catch{} 语句中,并在 finally{} 中检查参数
    • @user756037 如果你不能改变封装错误的过程,你可以通过匿名来做同样的事情。在您的 C# 中使用异常处理阻塞。例如'开始 myProc(:myParam); **** 结束时出现异常;'
    • 我已经在我的 c# 函数中实现了异常处理。我尝试 {} catch {} ExecuteNonQuery() 代码。它按预期捕获(违反我对第 2 行的测试唯一键约束),但随后 OUT 参数全部被漂白
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2014-08-06
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多