日期转换错误 - MS Access 前端查询 SQL 后端

4
我在尝试从Access数据库执行SQL语句与SQL数据库通信时出现日期转换错误。我们的计算机都运行着Windows 7和Office 2010。前端是accde文件。
数据库中有一个搜索表单,所有字段都能正常工作,只有两个日期字段会出错。
查询语句的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)

另一个问题是,这只发生在一个电脑上,而不是我或其他我测试过的电脑上。


那个 SQL 查询语句是否直接传递到 SQL Server?如果是的话,我认为它可能不支持散列字符。如果是这种情况,可以尝试将散列字符更改为单引号。另外,您能确认 DrawnDate 是否为 DateTime 列吗? - Mr Moose
1
不,它并没有直接通过,因为这些表在Access中是链接表。这就是为什么必须要有引号的原因(这也是我的第一个想法 :) DrawnDate是SQL datetime类型。对我来说真正奇怪的事情是它在大多数机器上都能工作,但在一个机器上却不能工作...而且这个机器经常使用这个日期字段! - goneos
嗯,不太确定。抱歉啊。我的建议是检查从出现问题的计算机到正常工作的计算机之间的ODBC连接。仔细检查所有设置(包括语言设置),确保它们都相同。 - Mr Moose
有两件事情需要考虑- 一是所涉及的计算机可能正在使用'当地'货币和ODBC配置中的日期设置。另一个可能只是一个简单的问题,即在井号之间提供Access期望的内容-“mm / dd / yyyy”。 - craig.white
已检查了一个工作的电脑和一个不工作的电脑上的ODBC设置,它们是相同的。接下来将尝试日期格式。 - goneos
6个回答

7
我们在一台机器上遇到了完全相同的错误,并通过删除,然后重新添加对DAO360.DLL的引用(在Visual Basic工具->引用下)解决了它。它从未显示为MISSING。
这绝对不是一个“通过”(即使用链接表),因为#日期文字终止字符明确是Access/Jet的东西。ODBC跟踪显示在“重新引用”之后发送到SQL Server的实际SQL生成发生了变化。

2
这对我有用 +1 - Bug Maker
当我将.accde文件复制部署到没有安装其中一个组件的PC上时,大多数Access表单和报告都可以运行,但不是全部。抛出的错误是关于日期转换的。但问题是缺少引用。运行.accdb文件会显示不同的错误消息,关于缺少引用。 - Gordon Prince

3
问题是,你的查询是否为Pass-Through-Query(直通查询),这与表格链接无关。如果查询是Pass-Through,则必须使用SQL-Server方言编写它,否则使用Access方言。Pass-Through是查询的属性,不是表格的属性。
另一个问题是日期是否在SQL-Server的有效日期范围内。这些范围对于Access和SQL-Server是不同的:
SQL-Server datetime(1753年1月1日 - 9999年12月31日) datetime2(0001年1月1日至9999年12月31日) smalldatetime(1900年1月1日至2079年6月6日) date(0001年1月1日至9999年12月31日)
Access Date/Time(公元100年1月1日至公元9999年12月31日)
Access中值为0(默认值)的日期表示1899年12月30日,而这超出了SQL-Server的smalldatetime范围。
如果传递给Format函数的值为字符串,则该函数将无法正常工作。请确保VBA中的FromDate和ToDate变量声明为As Date或包含日期的变体。在后一种情况下,VarType(FromDate)应返回7(= vbDate)。如果它们是变量,则它们也不应为Null。

1
Kevin Moore的帖子为我解决了这个问题。几乎所有运行我的数据库的PC在Access 2016下都没有问题,但到目前为止有两个遇到了原始帖子中遇到的确切错误。由于这是多年后和两个Office版本之后,我认为值得提到这个问题仍然存在。
通过一个简单的DLOOKUP从连接到SQL Server 2012本机客户端的SQL Server上的表中读取日期时会出现错误,并且删除并重新添加该特定引用可以修复它(在删除和重新添加之间执行由于缺少引用而引发错误的编译尝试)。
顺便说一句,在您的引用窗口中,该DLL的名称为“Microsoft Office XX.X Access database engine Object Library”,其中“XX.X”是您的Office版本(在我的情况下是Office 2016的16.0),由于Microsoft没有将引用窗体设置足够大或可调整大小,并且不换行文本以显示DLL的实际名称。 这里它被选中: DAO360.DLL selected in References window

1
这是一个 Microsoft Office 的 bug。
主要出现在宏/VBA 中存在“引用问题”的情况下。
请按以下步骤操作:
  1. 进入 Visual Basic 编辑器或按 (Alt + F11)
  2. 点击菜单 Tools->References
  3. 取消勾选任何以“Missing:...”开头的库引用
  4. 现在尝试执行查询

0

我同时对Access和一个存储过程进行了更改,然后收到了这个错误。我认为这是Access相关的,并花了很长时间浏览了像这样的帖子,然后测试了存储过程本身。结果发现存储过程返回了这个确切的消息。修复了存储过程,当然一切都好了。


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

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - pringi
我觉得这回答了这个问题。我遇到了提问者描述的完全相同的错误信息。我反编译了我的应用程序,然后运行了一个紧凑和修复工具,并解决了这个错误。那不就是问题的答案吗? - John Osmond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接