来自外部应用程序的 Access 数据库中日期字段的月份名称(C#)

Posted

技术标签:

【中文标题】来自外部应用程序的 Access 数据库中日期字段的月份名称(C#)【英文标题】:Month name of date field in Access database from external application (C#) 【发布时间】:2011-01-18 05:31:25 【问题描述】:

我想在 C# 运行时填充一个下拉列表。我在 Access 2003 数据库中有一个日期/时间字段(例如 01/05/2000)。我想在运行时在下拉列表中显示月份名称(即一月、二月、...)。

SELECT DISTINCT MonthName(Month(DATE_OF_BOOKING)) AS MNTH 
    FROM TRAVEL_DETAILS WHERE YEAR(DATE_OF_BOOKING)='2008' 

当我直接从 Access 运行时,上面的查询工作正常, 但是当我试图从 C# 中的 OledbCommand 对象运行它时,它会说

表达式中未定义函数“MonthName”。

【问题讨论】:

如果它在访问中工作,你为什么不做一个查询的存储过程......(只是一个想法) 出于性能原因,我建议您的 WHERE 子句应为 WHERE DATE_OF_BOOKING BETWEEN #1/1/2008# AND #12/31/2008#。我不知道您的 OLEDB 接口是否需要使用 Jet/ACE 日期分隔符,或者您是否可以使用单引号并将其转换。关键是使用 Year() 函数将无法在该字段上使用索引(假设有一个)。 【参考方案1】:

来自社交msdnthread的文字:

自定义用户编写的 VBA 函数作为 以及许多内置的 VBA 语言 功能由微软执行 嵌入在 SQL 查询中时的访问。 不幸的是可用的功能 Jet 数据库引擎是有限的 (当通过 ADO、ADO.NET 执行时, ETC。)。您可以找到这些列表 在以下 MS KB 中可用 文章:

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

编辑:使用 Format() 方法。

SELECT DISTINCT  format(DATE_OF_BOOKING,'MMMM') 
   AS MNTH FROM TRAVEL_DETAILS WHERE YEAR(DATE_OF_BOOKING)='2008'

【讨论】:

格式还允许您根据您使用的 Ms 数量选择数字、短月或全月名称。【参考方案2】:

MonthName 是原始“Jet”数据库引擎的 ODBC 和 OLEDB 驱动程序不支持的众多 Access 功能之一,即

Driver=Microsoft Access Driver (*.mdb) 用于 ODBC,或Provider=Microsoft.Jet.OLEDB.4.0 用于 OLEDB

但它受到较新“ACE”数据库引擎的驱动程序的支持

Driver=Microsoft Access Driver (*.mdb, *.accdb) 用于 ODBC,或Provider=Microsoft.ACE.OLEDB.12.0 用于 OLEDB

Microsoft Access Database Engine 2016 RedistributableMicrosoft Access Database Engine 2010 Redistributable

【讨论】:

以上是关于来自外部应用程序的 Access 数据库中日期字段的月份名称(C#)的主要内容,如果未能解决你的问题,请参考以下文章

access 2010,语文

如何在 ReactJS 中循环来自外部文件的 JSON 数据?

查询未在MS-Access中使用日期条件

从 AWS Glue 表到 RedShift Spectrum 外部表的日期字段转换

Microsoft Access 2010 Web 数据库将日期转换为字符串

access里6位数的数字型字段转化为日期型用啥函数