【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也是成功的。

相关推荐
ai大模型-探索者22 分钟前
Milvus向量数据库(介绍与使用)
数据库·milvus
minglie128 分钟前
zynq联网配置
网络·数据库·php
小羊没烦恼!1 小时前
深入浅出SQL Server中的死锁
java·开发语言·前端·数据库·后端·spring·c#
我不会插花弄玉1 小时前
9. 表的内连和外连【由浅入深-MySQL】
android·数据库·mysql
Techblog of HaoWANG1 小时前
Ubuntu 下将 Ollama 服务配置为监听 0.0.0.0:11434 完整实践
linux·数据库·ubuntu·ollama
似水流年QC2 小时前
LangChain 入门与实战
服务器·数据库·langchain
周厉2 小时前
酒店PMS系统设计:房型房价管理与动态价格优先级实现(Java/MySQL)
java·数据库·pms酒店系统
howard20052 小时前
任务 2-3 图形化管理工具Navicat
数据库·mysql·navicat