必须用DynamicParameters显式声明OracleDbType.RefCursor输出参数,参数名大小写须与PL/SQL完全一致,且commandType必须为StoredProcedure;否则Dapper无法解析游标,导致空结果或ORA-06550错误。

直接用 Query<T>() 调 Oracle 存储过程返回的 SYS_REFCURSOR 会拿不到数据或抛 ORA-06550,这不是配置问题,是 Dapper 根本没注册对游标类型的解析器。
必须用 DynamicParameters 显式声明 RefCursor 参数
Dapper 不识别裸参数对象(比如 new { result_cursor = default })里的游标意图,必须让 Oracle 驱动知道“这个参数是个游标,要输出”。
-
DynamicParameters是唯一可靠入口,OracleParameter数组也行但更啰嗦 -
Add()时必须指定dbType: OracleDbType.RefCursor和direction: ParameterDirection.Output - 参数名(如
"result_cursor")必须和 PL/SQL 中OUT SYS_REFCURSOR的变量名**大小写完全一致**,Oracle 默认区分大小写 - 漏掉
commandType: CommandType.StoredProcedure会导致 Dapper 当成普通 SQL 解析,游标绑定失效
Query<T>() 必须带泛型且字段名严格匹配
游标结果集映射失败,90% 是因为列名不一致——Oracle 默认把字段转成大写,而 C# 属性是 PascalCase。
- SQL 中显式用别名统一命名,比如
SELECT user_id AS "UserId", user_name AS "UserName" FROM users - 或者在查询里加双引号强制大小写:
SELECT "USER_ID", "USER_NAME" FROM users - 实体类属性名必须和别名/双引号内字符串**逐字符一致**,
UserId≠userid≠USERID - 不能用
dynamic绕过映射——Dapper 对游标结果仍走强类型解析路径,dynamic会静默失败
中文乱码和日期精度丢失不是 Dapper 问题,是连接层和 Oracle 类型选错
查出来字段为空、中文变问号、时间秒后全为 0,大概率不是映射代码错了,而是底层通道没对齐。
- 连接字符串必须含
Unicode=true,否则NVARCHAR2字段读出来就是乱码 - Oracle
DATE类型实际存秒级精度,但 .NETDateTime反序列化可能截断毫秒;若库表是TIMESTAMP(6),直接映射到DateTime会丢微秒 - 稳妥做法:SQL 层用
TO_CHAR(created_date, 'YYYY-MM-DD HH24:MI:SS')或CAST(created_date AS DATE)统一精度 - 真要保留毫秒+时区,实体属性改用
DateTimeOffset,且 Oracle.ManagedDataAccess 版本 ≥ 19.15
最容易被忽略的是:游标参数名大小写、连接字符串的 Unicode=true、以及 commandType 的强制指定——这三处任一出错,都会让整个调用静默失败或返回空集合,而不是报明确异常。


















