1

我正在开发一个遗留产品,我有一些 SQL 正在通过 ADO 执行到一个带有与 SQL Server 的链接表的 Access 数据库。当我执行 SQL 时,我收到错误“未定义的函数 'Round”,但如果我接受查询并直接在 Access 中运行,它工作正常。我知道一切都是正确的,这是一个特定于机器的问题,因为这是生产代码,它可以在其他机器上运行,并且已经为许多客户成功部署。

我什至不知道从哪里开始说实话。我正在运行正确(最新)版本的 Jet/ADO/MDAC。

任何帮助,将不胜感激。

提前致谢。

编辑:显然,SQL 包含聚合函数“Round”。我知道 Jet 和 SQL 实现之间的差异。这个问题是由于我机器上的某个组件而不是代码的问题。当通过 MS Access 2007 而不是通过 ADO 完成时,SQL 可以正确执行。

4

3 回答 3

2

EDIT2:评论中的正确解决方案:

shahkalpesh:如果它通过 Access 执行良好,则可能是 Access 具有可用的 DLL,它具有 Round 功能。您正在使用什么连接字符串?

Stimul8d:我不确定连接字符串是怎么回事。此代码适用于所有其他机器,无需更改;只是不在我的身上。

Andomar:嗯,这就是你的问题所在,你的机器坏了。您仍然可以安装vb6 sp6

Stimul8d:嗯,SP6 修复了它。干杯 Anndomar,不知道为什么 SP6 修复了它,但它确实修复了!

编辑:根据您的评论,这个新闻组帖子可能是答案:

不幸的是,当您从 Access 外部运行查询时(就像您在 VB 中一样),您与数据库的唯一连接是通过 Jet 引擎,它对大多数 VBA 函数一无所知。除了将数据返回到您的 VB 应用程序并在那里对数据使用函数之外,没有其他办法。

之后发了两篇文章:

我解决了这个问题。用 Service Pack 6 更新了我的 VB……它解决了这些问题。

这里的旧答案:

尝试 FLOOR() 而不是 ROUND()。

要将某些内容四舍五入到最接近的整数,您可以:

declare @floatmyboat float
set @floatmyboat = 1.51
select floor(@floatmyboat+0.5)

PS也许发布你得到的确切错误。如果它是“圆形函数需要 2 到 3 个参数。”,这意味着 Sql Server 正在 ROUND() 上运行。

于 2009-05-11T14:45:08.307 回答
1

round() 函数也存在于 SQL Server 中。
唯一的区别是:在 Access 中,精度是一个可选参数,但在 SQL Server 中,您必须指定它。

所以这仅适用于 Access,但不适用于 SQL Server:

select round(Column) from Table

这将适用于 AccessSQL Server:

select round(Column,1) from Table
于 2009-05-11T14:57:24.600 回答
1

可能是 Access 有可用的 DLL,它具有 Round 函数

ACE/Jet 将共享表达式服务与 VBA 一起使用。概括地说,ACE/Jet 支持作为表达式的所有 VBA5 函数(与方法不同),其参数和返回值都是标量类型(例如,没有数组,没有对象)。该Round()表达式属于此定义,并且确实可用于 ACE/Jet,其语义与其等效的 VBA 函数相同。任何熟悉 ACE/Jet 引擎的人都应该知道,语义可能与 VBA 等效项不同,例如 ACE/Jet ANSI-92 查询模式 SQL

SELECT TYPENAME(ROUND(5, 1))

返回“长”,而 VBA

?Typename(Round(5, 1))

返回“整数”。

换句话说,Round()这不会是这里的问题。

于 2009-05-12T10:33:49.480 回答