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

fcg9iug3  于 2022-10-22  发布在  Mysql
关注(0)|答案(2)|浏览(115)

背景:

  • 在MS Access 2003中运行的旧代码。
  • 由Access中的CurrentDB运行的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]日期溢出”。
  • 随机发生,当它发生并且Access停止时,通常可以选择继续,然后sql就会工作。它失败的次数不到运行次数的1%(数千次)。
  • sql中唯一的日期在where子句中:“and fieldA>now()”,其中fieldA是datetime列。这是一个获取记录集sql。插入过程中的另一个错误是相同的,但在与日期时间比较之前,从now()中减去了一个整数。

我不明白为什么它说日期溢出,而似乎没有理由删除日期时间或“现在”的时间?由于datetime字段已经在数据库中,now()将获取当前日期和时间,因此不应该有任何无效的日期?
如果您有任何问题或如何调试/记录任何可能有帮助的信息,我们将不胜感激。
在ODBC驱动程序中打开跟踪不是一个选项,因为它是随机发生的,有太多的流量,因此这会减慢一切,从而不会发生任何事情。
注意,我还遇到了一个sql,其中日期溢出错误消息是正确的。似乎在5.3之前,当将日期时间插入日期字段时,它会自动截断,因为成功3000次的sql开始失败。因此,通过首先从字段中提取日期来修复此sql。但其他的错误肯定是不同的。

r1zk6ea1

r1zk6ea11#

Oracle发布了包含错误修复程序的新版本:5.3.8
这个错误似乎是5.1.11版本中引入的一个错误。
在高级选项中,现在有一个日期溢出复选框,当出现错误时,必须勾选该复选框,代码才能继续。
Oracle回复修复:“根据您的信息,修复方法是在C或C++中,可以使用SQL_TIMESTAMP_STRUCT读取或写入DATE类型。此结构可以同时保存日期和时间。错误(日期溢出)当使用本应为DATE的操作时,仅此结构的时间值为非零时生成。这是ODBC API所要求的规范方法,但是,有时会造成不便,例如,应用程序没有费心用0值初始化整个结构,因为它知道它只需要DATE部分,但TIME分数的随机值可能会导致错误,尽管会被截断。引入了一个新选项来继续执行查询,而不是返回错误。服务器将忽略TIME部分,结果与零相同。”

omvjsjqw

omvjsjqw2#

这似乎是MySQL Connector/OODBC 5.2及更高版本的问题。网络搜索导致另一个站点上出现this thread,这反过来又导致了this unresolved bug report。请注意,这是一个更广泛的MySQL Connector/OODBC问题;它不是特定于Access应用程序的。
MySQLConnector/ODB5.1.13仍然可供下载,因此您最方便的解决方案可能是简单地使用该版本,直到问题代码停止使用。您的其他选择可能包括:

  • 使用更新版本的MySQL Server(与〔更好?〕支持分数秒),或
  • 调整Access SQL查询以使用Now()函数以外的其他函数(可以理解的是,您希望避免使用该函数)。

相关问题