【Oracle-无效的参数绑定】DateTimeOffset映射TIMESTAMP WITH LOCAL TIME ZONE踩坑记

背景

我在将Oracle的TimeStampLTZ类型映射到DateTimeOffSet类型时,报了个"无效的参数绑定(Invalid parameter binding (Parameter 'ParameterName"))",堆栈信息如下:

出错原因分析

查阅资料,我知道TimeStampLTZ 和 TimeStampTZ 在技术上都可以映射到 C# 的 DateTimeOffset。经过测试 TimeStampTZ 映射没有问题,TimeStampLTZ映射却报错。

问了AI,怀疑是某些版本的 Oracle ManagedDataAccess 驱动在处理 DateTimeOffset 到 LTZ 的转换时存在 bug,而 TZ 类型不受影响。

两种 Oracle 时间戳类型的本质区别

TIMESTAMP WITH TIME ZONE(TimeStampTZ)

存储的是绝对时间点 + 原始时区信息(时区偏移或区域名)。当您传入一个 DateTimeOffset 时,驱动可以直接将其值(包含日期时间和偏移)存入数据库,读取时也原样返回,几乎不涉及时区转换。因此,绑定过程简单且稳定。

TIMESTAMP WITH LOCAL TIME ZONE(TimeStampLTZ)

存储时会将传入的时间转换为数据库服务器的时区,读取时再转换为当前会话的时区。因此,驱动在处理 DateTimeOffset 参数时,必须进行两步转换:

根据 DateTimeOffset 的偏移,将其转换为绝对时刻(UTC 时间)。

将该绝对时刻转换为数据库服务器的时区(由 DBTIMEZONE 或会话时区决定),然后存储。

如果在这一转换过程中出现任何问题(例如服务器时区设置无效、时区定义缺失、或 DateTimeOffset 的偏移与服务器时区转换规则冲突),就可能导致绑定失败。

解决

AI建议将Oracle ManagedDataAccess 驱动版本升级到最新稳定版(如23.5.0以上)。新版本通常会修复时区转换相关的问题。

经过测试,我将驱动版本升级到最新版本(23.26.100)后,果然成功了。另外测试了版本23.5.0也是成功的。

相关推荐
lierenvip2 小时前
SQL 建表语句详解
java·数据库·sql
未来龙皇小蓝2 小时前
【MySQL-索引调优】02:单列索引
数据库·mysql·性能优化
剑锋所指,所向披靡!2 小时前
MySQL数据的增删改查
java·数据库·mysql
Villiam_AY2 小时前
一次 DNS 端口引发的代理网络和公司内网冲突问题
java·服务器·数据库
韩立学长2 小时前
Springboot奶茶加盟信息管理系统m307m786(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
2401_844221323 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
zhangyueping83853 小时前
9、MYSQL-存储过程
数据库·mysql
Arya_aa3 小时前
Mysql数据库-管理和存储数据库(开源管理系统)与JDBC操作数据库步骤,JUnit以及如何将压缩包中exe程序添加上桌面图标
数据库·mysql·junit·开源
最懒的菜鸟4 小时前
redis缓存击穿
数据库·redis·缓存