You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用含游标Oracle存储过程时遇System.ArgumentException参数绑定无效问题

解决System.ArgumentException: 'Invalid parameter binding'异常(调用含游标的Oracle存储过程时)

错误根源分析

触发该异常的核心问题有三个:

  • 参数名不匹配:C#代码中输出游标参数的名称是"RecordSet "(末尾多了一个空格),但Oracle存储过程定义的参数是RecordSet,名称不一致导致绑定失败。
  • 输入参数未添加到命令集合:代码中创建了输入参数bnk_limit,但没有执行cmd.Parameters.Add(par)将其加入命令的参数列表。
  • 冗余属性设置:针对RefCursor类型的输出参数,设置Value = 0和Size = 200完全无效,这些属性会干扰参数绑定逻辑。

修复后的C#代码

OracleCommand cmd = new OracleCommand();
try
{
    using (var conn = new OracleConnection(_connectionString))
    {
        conn.Open();
        cmd.Connection = conn;
        cmd.CommandText = "SP_GETALL_BANK";
        cmd.CommandType = CommandType.StoredProcedure;

        // 添加输入参数
        OracleParameter par = new OracleParameter() 
        { 
            ParameterName = "bnk_limit", 
            Direction = ParameterDirection.Input, 
            OracleDbType = OracleDbType.Int32, 
            Value = 5 
        };
        cmd.Parameters.Add(par);

        // 添加输出游标参数(修正名称,移除无效属性)
        cmd.Parameters.Add(new OracleParameter 
        { 
            ParameterName = "RecordSet", 
            OracleDbType = OracleDbType.RefCursor, 
            Direction = ParameterDirection.Output 
        });

        using (var reader = cmd.ExecuteReader())
        {
            // 此处处理读取到的数据
            while (reader.Read())
            {
                // 示例:获取字段值
                var bankId = reader.GetInt32(0);
                // 其他字段处理逻辑
            }
        }
    }
}
catch (Exception ex)
{
    // 异常处理逻辑
}

补充说明

  • Oracle存储过程本身定义无问题,无需修改。
  • 使用using语句包裹连接和数据读取器,确保资源自动释放,避免内存泄漏。
  • 执行ExecuteReader()后,需通过reader.Read()遍历游标返回的数据。

内容的提问来源于stack exchange,提问作者tarig Alturabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:20:10