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

Oracle SQL/Dapper无法识别部分JDE儒略日期数值的问题排查

ORA-01722错误排查:Dapper+Oracle处理JDE儒略日期参数

问题场景

在.NET环境中使用Dapper查询Oracle数据库时,针对JD Edwards(JDE)中NUMBER(6,0)类型的儒略日期字段WR.WLDRQJ,当传入2024年2月16日对应的儒略日期124047及之后的值时,触发ORA-01722: invalid number错误;但传入2024年2月15日的124046可正常查询。已验证日期转换结果正确,且相同查询在SQL Developer中可正常执行,怀疑是Dapper动态参数绑定问题。

核心解决方案

1. 显式指定参数DbType

Dapper默认会自动推断参数类型,但在Oracle环境下,部分int值可能被错误推断为其他数值类型(如Int64),导致与NUMBER(6,0)字段类型不匹配。添加参数时显式指定DbType.Int32,强制以正确类型绑定:

parameters.Add("DateStart", dateStart, DbType.Int32);
parameters.Add("DateEnd", dateEnd, DbType.Int32);

2. 统一参数命名格式

Oracle的ODP.NET驱动不需要参数名带冒号前缀,Dapper会自动适配。修改所有参数的添加逻辑,去掉参数名中的冒号,避免解析冲突:

parameters = new Dapper.DynamicParameters();
parameters.Add("OpStatus", OpStatus);
parameters.Add("WoStatus", WOStatus);
parameters.Add("Plants", plants);
parameters.Add("Depts", departments);
parameters.Add("WorkCenters", workcenters);
parameters.Add("DateStart", dateStart, DbType.Int32);
parameters.Add("DateEnd", dateEnd, DbType.Int32);
parameters.Add("OpCodes", queryParams.OpCodes);
// 其他参数同理去掉冒号前缀

3. 兜底检查其他参数

虽然问题定位在DateEnd,但可额外验证所有IN子句的参数集合(如OpStatus、WoStatus),确保集合内元素均为数值类型,避免隐式转换引发的连锁错误。

原因说明

Oracle对参数类型匹配的严格性高于SQL Developer,当Dapper自动推断的参数类型与NUMBER(6,0)字段类型不匹配时,会触发隐式转换失败,抛出ORA-01722错误。显式指定DbType.Int32可确保参数以与字段完全匹配的数值类型传递,消除转换冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:07:11