调用含游标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
相关产品推荐
相关产品推荐

