尝试从SQL数据库执行SQL和Access数据库时,我收到了日期转换错误。我们的机器都在运行带有Office 2010的Windows 7。前端是一个accde。
数据库中有一个搜索表单,除了两个日期字段外,所有字段都可以正常工作。
查询是where子句在前端VB代码
中看起来像这样"WHERE DrawnDate BETWEEN #" & Format(FromDate, "yyyy-mm-dd") & "# AND #" & _
Format(ToDate, "yyyy-mm-dd") & "#"
根据一些研究,我还尝试了dd-mon-yyyy
和dd-mm-yyyy
的日期格式,结果没有变化。
作为事件属性设置输入的单击On Click会产生以下错误:ODBC - 调用失败。
收到的错误是:
[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]从字符串转换日期和/或时间时转换失败。 (#241)
另一个问题是,到目前为止,这只发生在一台PC上,而不是我的或我测试过的其他PC上。
答案 0 :(得分:4)
我们在一台机器上有这个完全相同的错误并通过删除然后重新添加我们对DAO360.DLL的引用(在Visual Basic Tools-> References下)来解决它。它从未显示为MISSING。
这绝对不是传递(即使用链接表),因为#date文字终止字符绝对是Access / Jet的东西。 ODBC跟踪显示在"重新引用"之后发送到SQL Server的实际SQL的生成发生了变化。
答案 1 :(得分:3)
问题是,您的查询是否是Pass-Through-Query(表链接的事实无关紧要)。如果查询是Pass-Through,则必须以SQL-Server方言编写,否则使用Access方言编写。 Pass-Through是查询的属性,而不是表的属性。
另一点是日期是否在SQL-Server的有效日期范围内。 Access和SQL-Server的这些范围不同:
<强> SQL-服务器强>
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日)使用强>
日期/时间(公元100年1月1日 - 公元9999年12月31日)
日期值0(默认值)表示Access中的1899年12月30日,这位于SQL客户端的smalldatetime
范围之外。
如果传递给它的值是Format
,则String
函数不起作用。确保在VBA中将FromDate
和ToDate
变量声明为As Date
,或者它们是包含日期的变体。在后一种情况下,VarType(FromDate)
应该返回7
(= vbDate
)。如果它们是变体,则它们也不应是Null
。
答案 2 :(得分:1)
Kevin Moore的帖子为我解决了这个问题。几乎所有在Access 2016下运行我的数据库的PC都没有问题,但是到目前为止,有两台抛出了原始海报遇到的确切错误。由于这是几年以后的事,后来又是两个Office版本的事,我认为值得一提的是这个问题仍然存在。
一个简单的DLOOKUP可以从通过SQL Server 2012 Native Client连接的SQL Server上的表中读取日期,然后抛出该错误,然后删除并重新添加该特定引用以解决该错误(尝试进行编译会引发错误)删除和重新添加之间缺少的参考)。
顺便说一句,在您的“引用”窗口中,该DLL名为“ Microsoft Office XX.X Access数据库引擎对象库”,其中“ XX.X”是您的Office版本(在我的情况下为Office 2016,为16.0), DLL的实际名称将不可见,这是因为Microsoft没有足够大或相当大的“引用”形式,并且没有为“位置”换行。在这里选择它:
答案 3 :(得分:0)
这是Microsoft Office错误。
当您在宏/ VBA中有任何“引用问题”时,主要会出现此问题。
按照以下步骤
答案 4 :(得分:0)
我同时对Access和存储过程进行了更改,然后收到此错误。我以为这与Access有关,并且在测试存储的proc本身之前花了很长时间来处理此类帖子。只是发现proc正在返回此确切消息。修复了proc,当然,一切都很好。