未定义函数:MONTHNAME - OLEDB

Undefined Function: MONTHNAME - OLEDB

我在 RDLC 报告中有这个功能。我在 Ms Access 中构建了字符串(因为我很不擅长直接写出来)。它可以在 MS Access 中运行,也可以在我的 PC 上的 vis studio 中运行。它在编译成 EXE 时也有效。

然而在一台笔记本电脑上却出现了

Undefined Function MonthName in expression

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)

我不明白为什么当字符串相同且连接也相同时,它在一台计算机上运行,​​而在另一台计算机上运行却不行!

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

Custom user-written VBA functions as well as many built-in VBA language functions are executed by Microsoft Access when embedded in a SQL query. Unfortunately the functions available to the Jet database engine are limited (when executed via ADO, ADO.NET, etc.)

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

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