Access 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy
Posted
技术标签:
【中文标题】Access 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy【英文标题】:.NET query of Access database misinterprets dd/mm/yyyy date literal as mm/dd/yyyy 【发布时间】:2015-10-13 19:59:30 【问题描述】:请帮助我了解发生了什么
我有一个 Visual Basic 应用程序,它从访问数据库返回数据 我想用这种格式“01/12/2015”(12 月 1 日)查询带有日期的 db 字段 为此,我有一个 datetimepicker
我的数据库中有这条记录 - 01/12/2015
当我更新我的代码以将它的 datetimepicker 值包含到查询中时,它不会返回任何内容,如果我输入 2015 年 12 月 1 日,它会找到 2015 年 1 月 12 日的记录
我的查询如下所示:
dim dd as date
dd = datetimepicker.value
qrytxt = "select * from table where [Date] = #" + dd + "#"
如果我放一个 msgbox 来返回 qrytxt 它会返回
select * from table where [Date] = #01/12/2015#
但它仍然会根据数据库检查错误的日期...
我也有这个 Imports System.Globalization,我读过一些关于 CultureInfo 的内容,但我无法在我的查询中使用它。
还有什么我需要包括或做的吗?
【问题讨论】:
“我有一个 Visual Basic 应用程序...” - 你的意思是 VB.NET 应用程序吗? Access db 引擎会将where [Date] = #01/12/2015#
解释为 1 月 12 日。也许您打算 01/12/2015 表示 12 月 1 日。但这令人困惑,因为您的问题说 2015 年 1 月 12 日代表 1 月 1 日,这是不合理的。
我相信在您的 VBA 中,因为您将 dd
声明为日期,它已默认为您的语言环境首选日期格式 dd/mm/yyyy
,但我猜是 Access,至少是这样您正在连接它,并不关心您的语言环境,而是只想接收mm/dd/yyyy
格式。这是典型的数据库具有它喜欢的默认日期格式并且您必须遵守它。无论好坏。
对查询中的文字日期值使用 yyyy-m-d 格式。例如,如果您想定位 2015 年 1 月 12 日 ...WHERE [Date] = #2015-1-12#
格式仅供展示。它不会影响基于 Double 数值的值本身。
【参考方案1】:
为什么会这样?
发生这种情况是因为日期文字不明确,并且与 Access 数据库引擎假定不明确的日期文字的格式不匹配。
在动态 SQL 中使用日期文字无论如何都是错误的方法。 DateTimePicker 返回一个真正的System.DateTime
值(始终是明确的),因此您应该将其用作参数化查询的一部分:
Using cmd As New OdbcCommand("SELECT COUNT(*) AS n FROM Clients WHERE DOB = ?", conn)
cmd.Parameters.Add("?", OdbcType.DateTime).Value = DateTimePicker1.Value.Date
MessageBox.Show(cmd.ExecuteScalar)
End Using
【讨论】:
【参考方案2】:只需对您的日期值强制使用格式来为日期创建字符串表达式:
Dim dd As Date
dd = datetimepicker.value
qrytxt = "select * from table where [Date] = #" + dd.ToString("yyyy'/'MM'/'dd") + "#"
【讨论】:
可能不是戈德所说的最正确的方法,但它对我有用。谢谢以上是关于Access 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy的主要内容,如果未能解决你的问题,请参考以下文章
从 VB.NET 查询 Access 数据库中的 Yes/No 字段
如何将 MS-Access 选择查询的结果保存在 C#.net 中的变量中?
VB.Net 使用创建表查询将 MS Access 表中的 AllowZeroLength 属性设置为否
如何通过 ASP.net 网站将新条目插入 Access db 表?
ASP.NET把数据查询出来保存在了一个datatable里面了,之后我想把这个datatable的数据导入到access数据库