背景:
- 在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。但其他的错误肯定是不同的。
2条答案
按热度按时间r1zk6ea11#
Oracle发布了包含错误修复程序的新版本:5.3.8
这个错误似乎是5.1.11版本中引入的一个错误。
在高级选项中,现在有一个日期溢出复选框,当出现错误时,必须勾选该复选框,代码才能继续。
Oracle回复修复:“根据您的信息,修复方法是在C或C++中,可以使用SQL_TIMESTAMP_STRUCT读取或写入DATE类型。此结构可以同时保存日期和时间。错误(日期溢出)当使用本应为DATE的操作时,仅此结构的时间值为非零时生成。这是ODBC API所要求的规范方法,但是,有时会造成不便,例如,应用程序没有费心用0值初始化整个结构,因为它知道它只需要DATE部分,但TIME分数的随机值可能会导致错误,尽管会被截断。引入了一个新选项来继续执行查询,而不是返回错误。服务器将忽略TIME部分,结果与零相同。”
omvjsjqw2#
这似乎是MySQL Connector/OODBC 5.2及更高版本的问题。网络搜索导致另一个站点上出现this thread,这反过来又导致了this unresolved bug report。请注意,这是一个更广泛的MySQL Connector/OODBC问题;它不是特定于Access应用程序的。
MySQLConnector/ODB5.1.13仍然可供下载,因此您最方便的解决方案可能是简单地使用该版本,直到问题代码停止使用。您的其他选择可能包括:
Now()
函数以外的其他函数(可以理解的是,您希望避免使用该函数)。