ODBC 调用失败 - 从 32 位 ODBC 5.1 移动到 64 位 5.3 后出现随机日期溢出错误

Posted

技术标签:

【中文标题】ODBC 调用失败 - 从 32 位 ODBC 5.1 移动到 64 位 5.3 后出现随机日期溢出错误【英文标题】:ODBC call failed - Random date overflow errors after moving from 32-bit ODBC 5.1 to 64-bit 5.3 【发布时间】:2016-07-11 12:41:58 【问题描述】:

背景:

在 MS Access 2003 中运行的旧代码。 由 CurrentDB 在 Access 中运行的 Sql。 目前在 Windows 7 32 位机器上运行。 通过 ODBC 5.1 驱动程序连接到 mysql Server 5.5。

问题:

正在尝试迁移到 Windows server 2012 64 位。 ODBC 5.3 Unicode 驱动程序(32 位)。 不想花时间重写所有东西,因为代码很多,而且在不远的将来会被删除。

问题:

在新服务器上运行时,多个 sql 语句失败。在旧服务器上工作。 所有失败的sql语句中都有now()。 错误描述说 ODBC 调用失败。虽然更详细的描述是日期溢出 - “[MySQL][ODBC 5.3(w) Driver][mysqlid-5.5.28-log]Date overflow”。 随机发生,当它发生并且 Access 停止时,通常只需选择继续,然后 sql 就会工作。它失败的次数不到它运行次数的 1%(数千次)。 sql 中唯一的日期位于 where 子句中:“and fieldA > now()”,其中 fieldA 是日期时间列。这是一个获取记录集的 sql。插入期间的另一个错误是相同的,但在与日期时间相比之前从 now() 中减去了一个整数。

我不明白为什么在似乎没有理由删除日期时间或“现在”的时间时它说日期溢出?而且由于 datetime 字段已经在数据库中,而 now() 将获取当前日期和时间,不应该有任何无效的日期吗?

任何有关问题可能是什么或如何调试/记录任何可能有帮助的帮助将不胜感激。

在 ODBC 驱动程序中打开跟踪不是一个选项,因为它发生得如此随机,流量如此之大,因此这会减慢一切,以至于什么都没有发生。

请注意,我也确实遇到了一个日期溢出错误消息正确的 sql。似乎在 5.3 之前将日期时间插入日期字段时它会自动截断,因为已经成功 3000 次的 sql 开始失败。因此,此 sql 已通过首先从字段中提取日期来修复。但其他错误一定是不同的。

【问题讨论】:

【参考方案1】:

Oracle 已发布包含错误修复的新版本:5.3.8

这个错误似乎是在 5.1.11 版本中引入的错误。

在高级选项中现在有一个日期溢出复选框,必须勾选该复选框才能在出现错误时继续执行代码。

来自 Oracle 的有关修复的回复: “供您参考,修复方法是在 C 或 C++ 中,可以使用 SQL_TIMESTAMP_STRUCT 读取或写入 DATE 类型。 这个结构可以同时保存日期和时间。 错误(日期溢出)是在使用应该是仅 DATE 的操作时生成的,此结构的时间值非零。 这是 ODBC API 要求的规范方法,但是,有时会导致不便,例如应用程序没有打扰 用 0 值初始化整个结构,因为它知道它只需要 DATE 部分,但 TIME 分数的随机值可能会导致错误,尽管被截断。 引入了一个新选项来继续执行查询而不是返回错误。 服务器将忽略 TIME 部分,结果与 0 相同。”

【讨论】:

【参考方案2】:

这似乎是 MySQL 连接器/ODBC 版本 5.2 及更高版本的问题。网络搜索导致另一个站点上的this thread,而这又导致this unresolved bug report。请注意,这是一个更广泛的 MySQL 连接器/ODBC 问题;它并不特定于 Access 应用程序。

MySQL 连接器/ODBC 5.1.13 仍可供下载,因此您最方便的解决方案可能是简单地使用该版本,直到相关代码停止服务。您的其他选择可能包括:

使用更新版本的 MySQL 服务器([更好?] 支持小数秒),或 调整 Access SQL 查询以使用 Now() 函数以外的其他内容(可以理解,您希望避免使用该函数)。

【讨论】:

以上是关于ODBC 调用失败 - 从 32 位 ODBC 5.1 移动到 64 位 5.3 后出现随机日期溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

通过ODBC将Excel连接到PostgreSQL

32位ODBC数据源,但是jdk是64位的,是否不兼容?

Qt从excel导入数据-ODBC

从链接表访问 ODBC 调用失败

win7-64位,vs32位,odbc 连接oracle问题总结

如何使用odbc连接数据库?