首页 文章

SQL通过经典ADO - 未定义函数'Round'?

提问于
浏览
1

我'm working on a legacy product and i have some SQL being executed through ADO, to an Access database with linked tables to SQL Server. I' m得到错误'Undefined function ' Round'当我执行SQL而 if i take the query and run directly in Access it works fine 时 . 我知道一切都是正确的,这是一个特定于机器的问题,因为这是 生产环境 代码,它适用于其他机器,并已成功部署到许多客户端 .

我甚至不确定从哪里开始说实话 . 我正在运行Jet / ADO / MDAC的正确(最新)版本 .

任何帮助,将不胜感激 .

提前致谢 .

EDIT: Obviously, the SQL includes the aggregate function 'Round'. I'm aware of the differences between Jet and SQL implementations. This problem is due to some problem with a component on my machine and NOT with the code. The SQL executes properly when done through MS Access 2007 but NOT through ADO.

3 回答

  • 1

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

    shahkalpesh:如果它通过Access执行得很好,那么可能是Access有可用的DLL,它具有Round功能 . 你正在使用什么连接字符串?

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

    Andomar:嗯,那就是你的问题,你的机器已经陷入困境 . 您仍然可以安装vb6 sp6 .

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

    编辑:基于您的评论this newsgroup帖子可能是答案:

    不幸的是,当您从Access外部运行查询时(因为您来自VB),您与数据库的唯一连接是通过Jet引擎,它对大多数VBA函数一无所知 . 除了将数据返回到VB应用程序并使用数据上的函数之外,没有办法解决这个问题 .

    之后有两个帖子:

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

    老答案在这里:

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

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

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

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

  • 2

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

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

    select round(Column) from Table
    

    这将在Access和SQL Server中工作:

    select round(Column,1) from Table
    
  • 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))
    

    返回'Long',而VBA

    ?Typename(Round(5, 1))
    

    返回'整数' .

    换句话说, Round() 不会成为问题 .

相关问题