日期转换错误——MS Access前端查询sql后端

Posted

技术标签:

【中文标题】日期转换错误——MS Access前端查询sql后端【英文标题】:Date conversion error - MS Access front end querying sql back end 【发布时间】:2013-12-09 00:44:38 【问题描述】:

尝试从 SQL 数据库和 Access 数据库对 SQL 数据库执行 SQL 时出现日期转换错误。我们的机器都是windows 7和office 2010。前端是acde。

数据库中有一个搜索表单,所有字段都可以正常工作,除了两个日期字段。

查询的 where 子句在前端 VB 代码中是这样的

"WHERE DrawnDate BETWEEN #" & Format(FromDate, "yyyy-mm-dd") & "# AND #" & _
    Format(ToDate, "yyyy-mm-dd") & "#"

根据一些研究,我还尝试了dd-mon-yyyydd-mm-yyyy 的日期格式,结果没有变化。

您作为事件属性设置输入的 On Click 表达式产生了以下错误:ODBC -- 调用失败。

收到的错误是:

[Microsoft][ODBC SQL Server Driver][SQL Server]从字符串转换日期和/或时间时转换失败。 (#241)

另一个问题是,到目前为止,这只发生在一台 PC 上,而不是我的或我测试过的其他 PC。

【问题讨论】:

该 SQL 是否会直接传递到 SQL Server?如果是这样,我认为它不会喜欢哈希字符。如果是这种情况,也许尝试将哈希字符更改为单引号。另外,你能确认 DrawnDate 是一个 DateTime 列吗? 不,它不会直接通过,因为表是访问中的链接表。这就是为什么必须有引号的原因(这也是我的第一个想法:) DrawnDate 是 SQL 日期时间类型。对我来说真正奇怪的是它在大多数机器上都可以工作但在其中一台机器上不起作用的脸......而且它是一直使用这个日期字段的人! 嗯。那时不确定。不好意思,朋友。我可能会建议从失败的机器检查您的 ODBC 连接到正在工作的机器。检查所有设置(语言和所有设置)并确保它们都相同。 我想到了两件事——一是有问题的机器可能在 ODBC 配置中使用“区域”货币和日期设置。另一个可能是一个简单的问题,即在哈希标记之间为 Access 提供它所期望的 - “mm/dd/yyyy” 检查了工作 PC 和非工作 PC 上的 ODBC 设置,它们是相同的。接下来将尝试日期格式。 【参考方案1】:

我们只在一台机器上遇到了同样的错误,并通过删除然后重新添加我们对 DAO360.DLL 的引用来解决它(在 Visual Basic 工具 -> 引用下)。它从未显示为 MISSING。

这绝对不是直通(即使用链接表),因为 # 日期文字终止字符绝对是 Access/Jet 的东西。 ODBC Trace 显示在“重新引用”之后发送到 SQL Server 的实际 SQL 的生成发生了变化。

【讨论】:

这是为我做的 +1 当我将 .accde 副本部署到未安装任何组件的 PC 时,大多数 Access 表单和报告都会运行,但不是全部运行。抛出的错误是关于转换日期。但问题是缺少参考。运行 .accdb 文件会显示另一条关于缺少参考的错误消息。【参考方案2】:

问题是,您的查询是否为 Pass-Through-Query(表已链接的事实无关紧要)。如果查询是 Pass-Through,那么您必须使用 SQL-Server 方言编写它,否则使用 Access 方言。 Pass-Through 是查询的属性,而不是表的属性。

另外一点是日期是否在 SQL-Server 的有效日期范围内。这些范围对于 Access 和 SQL-Server 是不同的:

SQL-Serverdatetime(1753 年 1 月 1 日 - 9999 年 12 月 31 日)datetime2(1 月 1 日, 0001 至 9999 年 12 月 31 日)smalldatetime(1900 年 1 月 1 日至 2079 年 6 月 6 日)日期(0001 年 1 月 1 日至 9999 年 12 月 31 日) )

访问日期/时间(公元 100 年 1 月 1 日 - 公元 9999 年 12 月 31 日)

日期值 0(默认值)在 Access 中表示 1899 年 12 月 30 日,这超出了 SQL-Server 的smalldatetime 范围。

如果传递给它的值是String,则Format 函数不起作用。确保FromDateToDate 变量在VBA 中声明为As Date,或者它们是包含日期的变量。在后一种情况下,VarType(FromDate) 应该返回 7 (=vbDate)。如果它们是变体,它们也不应该是Null

【讨论】:

【参考方案3】:

这是一个 Microsoft Office 错误。

此问题主要发生在您在宏/VBA 中有任何“参考问题”时。

按照以下步骤进行

    转到 Visual Basic 编辑器或按 (Alt + F11 ) 点击菜单工具->参考 取消选中任何以“Missing:...”开头的库引用 现在尝试执行查询

【讨论】:

【参考方案4】:

Kevin Moore 的帖子为我解决了这个问题。几乎所有在 Access 2016 下运行我的数据库的 PC 都没有问题,但到目前为止,有两个已经抛出了原始海报遇到的确切错误。由于这是多年以后和两个 Office 版本之后,我认为值得一提的是这个问题仍然存在。

从通过 SQL Server 2012 Native Client 连接的 SQL Server 上的表中读取日期的简单 DLOOKUP 引发了错误,并且删除并重新添加该特定引用修复了它(编译尝试引发错误由于删除和重新添加之间执行的缺失引用)。

顺便说一句,在您的“参考”窗口中,该 DLL 被命名为“Microsoft Office XX.X Access 数据库引擎对象库”,其中“XX.X”是您的 Office 版本(在我的情况下,Office 2016 为 16.0),并且 DLL 的实际名称将不可见,因为 Microsoft 没有足够大或相当大的引用表单,并且没有为位置包装文本。这里被选中:

【讨论】:

【参考方案5】:

我同时对 Access 和存储过程进行了更改,然后收到此错误。在我测试存储过程本身之前,我认为它与 Access 相关并且花了很长时间处理这样的帖子。只是发现 proc 正在返回这个确切的消息。修复了 proc,当然,一切都很好。

【讨论】:

【参考方案6】:

我能够通过简单地反编译我的应用程序然后压缩和修复来解决这个问题。

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review 我觉得它确实回答了这个问题。我收到了提问者描述的完全相同的错误消息。我反编译了我的应用程序,然后我运行了一个压缩程序并修复它并修复了错误。这怎么不是问题的答案?

以上是关于日期转换错误——MS Access前端查询sql后端的主要内容,如果未能解决你的问题,请参考以下文章

通过运行 SQL 查询在 MS Access 2012 上更改年份日期格式的错误

将 MS Access 查询转换为 MariaDB

MS Access 前端与 SQL Server 后端查询存储最佳实践 [关闭]

如何使用 Pass-through 查询从 MS Access 前端向 sql 表输入数据?

使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询

带有日期分隔符的 C# 和 MS Access SQL