Oracle PLSQL存储过程独立运行正常 C#调用报参数数量或类型错误求助
问题根因排查
- 核心原因1:Oracle .NET驱动默认按位置绑定参数,而非按参数名绑定。你C#代码中添加参数的顺序和存储过程定义的参数顺序完全不匹配:
存储过程参数顺序:
P_INDEX_PAGE→p_pageSize→P_DATE→P_MAIN_ENTITY_ID→ 其余参数
C#代码参数顺序:P_DATE→P_MAIN_ENTITY_ID→P_INDEX_PAGE→p_pageSize→ 其余参数
加入分页参数后参数位置整体错位,类型匹配失败就会报错。你注释掉分页参数时参数数量减少,碰巧类型对应上所以能正常运行。 - 其他可能原因:
- 分页参数传入值类型不匹配,比如传入了非整型值、空值未显式处理
AddOpLogParamVarChar方法添加的P_OP_LOG参数长度/方向配置错误
解决方案
方案1(推荐):开启按名称绑定
在初始化Command后添加一行配置即可,后续不用关心参数添加顺序:
Command.BindByName = true;
方案2:对齐参数添加顺序
严格按照存储过程定义的顺序添加参数:
Command.CommandText = "ABC"; // 注意存储过程名要替换为实际名称,不要用占位符 Command.CommandType = CommandType.StoredProcedure; // 严格对齐存储过程参数顺序 Command.Parameters.Add(new OracleParameter("P_INDEX_PAGE", OracleDbType.Int32, frmRow, ParameterDirection.Input)); Command.Parameters.Add(new OracleParameter("p_pageSize", OracleDbType.Int32, model.toRow, ParameterDirection.Input)); Command.Parameters.Add(new OracleParameter("P_DATE", OracleDbType.Date, model.END_DATE, ParameterDirection.Input)); Command.Parameters.Add(new OracleParameter("P_MAIN_ENTITY_ID", OracleDbType.Int64, model.MainEntityID, ParameterDirection.Input)); Command.Parameters.Add(new OracleParameter("P_ENTITY_ID", OracleDbType.Int32, model.EntityID, ParameterDirection.Input)); Command.Parameters.Add(new OracleParameter("P_PARAMETERS_JSON", OracleDbType.Varchar2, getJsonString(Command), ParameterDirection.Input)); Command.Parameters.AddOpLogParamVarChar(opLog.ToString()); // 确认该方法添加的参数名是P_OP_LOG、方向为IN OUT、长度足够 Command.Parameters.Add(new OracleParameter("P_TRANS_LIST_C", OracleDbType.RefCursor, ParameterDirection.Output));
额外检查项
- 确认
frmRow、model.toRow为合法Int32类型,若为可空类型,空值要传DBNull.Value而非null - 确认
ENTITY.ENTITY_ID字段类型,如果是NUMBER(10)及以上,P_ENTITY_ID的类型要统一改为OracleDbType.Int64避免溢出 - 确认
P_OP_LOG参数指定了足够的长度,IN OUT类型的VARCHAR2参数如果不指定长度会触发截断报错
内容的提问来源于stack exchange,提问作者user3756214
相关产品推荐
相关产品推荐

