【问题标题】:Undefined Function: MONTHNAME - OLEDB未定义函数:MONTHNAME - OLEDB
【发布时间】:2018-03-10 21:28:39
【问题描述】:

我在 RDLC 报告中有此功能。我在 Ms Access 中构建了字符串(因为我不擅长直接写出来)。它适用于 MS Access,它适用于我 PC 上的 vis studio。它在编译成 EXE 时也可以工作。

但是在一台笔记本电脑上它会出现

表达式中的未定义函数 MonthName

SELECT MonthName(Month(tblpack.cycledate)) AS MonthDate, Year(tblpack.cycledate) AS YearDate, Sum(tblpack.weeksinpack) AS SumOfweeksinpack, Month(tblpack.cycledate) AS MonthOrder
FROM tblpatient INNER JOIN tblpack ON tblpatient.patientid = tblpack.patientid
WHERE (((tblpack.iscommunity)=True) AND ((tblpatient.over5med)=True) AND ((tblpack.isrepat)=True) AND ((tblpack.cycledate) Between ? And ?) AND ((tblpack.packeduser) Is Not Null)) OR (((tblpack.iscommunity)=True) 
AND ((tblpatient.over5med)=True) AND ((tblpack.isconcession)=True) AND ((tblpack.cycledate) Between ? And ?) AND ((tblpack.packeduser) Is Not Null))
GROUP BY MonthName(Month(tblpack.cycledate)), Year(tblpack.cycledate), Month(tblpack.cycledate)
ORDER BY MonthName(Month(tblpack.cycledate)), Year(tblpack.cycledate)

当字符串相同且连接也相同时,我无法理解为什么它在一台计算机上工作而不是另一台计算机!

【问题讨论】:

    标签: c# sql ms-access rdlc


    【解决方案1】:

    您不能将 MonthName 函数与 ADO.NET 一起使用,因为沙盒函数仅可用于在 Access 应用程序会话中运行的查询。 This article 描述了与您的问题相关的访问行为:

    自定义用户编写的 VBA 函数以及许多内置 VBA 语言功能由 Microsoft Access 嵌入时执行 SQL 查询。不幸的是,Jet 数据库可用的功能 引擎受限(通过 ADO、ADO.NET 等执行时)

    作为一种解决方法,您可以使用带有MMMM 格式字符串的Format 函数来显示完整的月份名称:

    SELECT Format(tblpack.cycledate, 'MMMM') AS MonthDate,
           Year(tblpack.cycledate) AS YearDate, Sum(tblpack.weeksinpack) AS SumOfweeksinpack, 
           Month(tblpack.cycledate) AS MonthOrder
    FROM tblpatient 
    INNER JOIN tblpack ON tblpatient.patientid = tblpack.patientid
    WHERE (((tblpack.iscommunity)=True) 
          AND ((tblpatient.over5med)=True) 
          AND ((tblpack.isrepat)=True) 
          AND ((tblpack.cycledate) Between ? And ?) 
          AND ((tblpack.packeduser) Is Not Null)) 
          OR (((tblpack.iscommunity)=True) 
          AND ((tblpatient.over5med)=True) 
          AND ((tblpack.isconcession)=True) 
          AND ((tblpack.cycledate) Between ? And ?) 
          AND ((tblpack.packeduser) Is Not Null))
    GROUP BY Format(tblpack.cycledate, 'MMMM'), Year(tblpack.cycledate), Month(tblpack.cycledate)
    ORDER BY Format(tblpack.cycledate, 'MMMM'), Year(tblpack.cycledate)
    

    参考资料:

    How to configure Jet 4.0 to prevent unsafe functions from running in Access 2003

    month name from date field in c#.net from access database

    【讨论】:

    • 感谢 Tetsuya,我唯一的问题是:为什么我的查询可以在两台计算机上运行,​​但不能在第三台计算机上运行?
    • 这些 PC 是否具有完全相同的 Access 配置和版本?这个问题在使用MSJet引擎时经常出现(不知道ACE引擎有没有类似的问题),不同的配置设置可能会有不同的结果。
    • 好的,谢谢,这就解释了。也许是访问版本。我已更改为您的查询,感谢您的帮助! :)
    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2018-12-20
    相关资源
    最近更新 更多