【问题标题】:Dealing with dd/mm/yyyy date formats using OleDb and Access使用 OleDb 和 Access 处理 dd/mm/yyyy 日期格式
【发布时间】:2014-11-10 16:29:17
【问题描述】:

我在处理查询/SQL 代码中的日期时遇到问题。我的区域设置格式为#dd/mm/yyyy#,因此在插入日期以访问数据库时,它看起来像#dd/mm/yyyy#,但通过选择查询我得到#mm/dd/yyyy#

Query = "Select EmpEndDate From Employees_Details Where EmpCode = '" & EmpCode & "';"
Objcmd = New OleDbCommand(Query, ObjConnection)
ObjSelect = Objcmd.ExecuteReader
ObjSelect.Read()
Dim EndDate As DateTime
If Convert.ToString(ObjSelect.GetValue(0)) = vbNullString Then
EndDate = DateTime.Now
Else
EndDate = ObjSelect.GetValue(0)
End If

【问题讨论】:

  • 我希望您将 EmpEndDate 列为 DateTime 而不是字符串。
  • #mm/dd/yyyy# 是 VS 中显示的表单日期 - 它是明确的,不依赖于文化(这不是错误或问题)。它也是从文字创建日期时使用的顺序/形式。
  • 日期/时间@Steve
  • 这不是错误或问题。日期在数据库中没有改变,只是它的显示方式。 Access 有自己的 DateTime 列的 Format 属性,这也可能会改变它向您显示的方式,但它不会更改日期值。获取日期并使用.ToString 将其显示到控件或调试窗口中,您将看到它没有更改
  • @Plutonix 你是 100% 正确的,当我使用调试模式时,我只会得到不同的日期格式。当我将鼠标悬停在 EndDate 上时。

标签: vb.net ms-access


【解决方案1】:

我的区域设置格式为#dd/mm/yyyy#,因此在插入访问数据库的日期时,它看起来像#dd/mm/yyyy#

编辑:感谢 Plutonix 的以下评论,我意识到您的问题不清楚您是指 VB.NET #date_literal# 还是 Access SQL #date_literal#。我的回答是关于 Access SQL 中的日期文字:


重要的是要认识到 Access 数据库引擎会忽略 Windows 中的区域设置,并且总是将 Access SQL 语句中的模棱两可的 #xx/yy/zzzz# 日期文字解释为 #mm/dd/yyyy#。这可以通过在 Windows 中使用默认“英语(英国)”设置的机器上的以下 VB.NET 代码来说明:

Imports System.Data.OleDb
Imports System.Globalization

Module Module1

    Sub Main()
        Console.WriteLine("Culture name:")
        Console.WriteLine("    {0}", CultureInfo.CurrentCulture.Name)
        Console.WriteLine("Short date pattern:")
        Console.WriteLine("    {0}", CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern)
        Using con As New OleDbConnection
            con.ConnectionString =
                    "Provider=Microsoft.Jet.OLEDB.4.0;" &
                    "Data Source=C:\Users\Public\mdbTest.mdb;"
            con.Open()
            Using cmd As New OleDbCommand
                cmd.Connection = con
                ' try updating to November 2, 2010 as #dd/mm/yyyy#
                cmd.CommandText =
                        "UPDATE Employees_Details " &
                        "SET EmpEndDate=#02/11/2010# " &
                        "WHERE EmpCode=1"
                Console.WriteLine("UPDATE command:")
                Console.WriteLine("    {0}", cmd.CommandText)
                cmd.ExecuteNonQuery()
                ' read value back and display
                cmd.CommandText =
                        "SELECT EmpEndDate " &
                        "FROM Employees_Details " &
                        "WHERE EmpCode=1"
                Dim EndDate As DateTime = Convert.ToDateTime(cmd.ExecuteScalar)
                Console.WriteLine("Retrieved date:")
                Console.WriteLine("    {0}", EndDate.ToLongDateString)
            End Using
            con.Close()
        End Using
    End Sub

End Module

该代码产生

Culture name:
    en-GB
Short date pattern:
    dd/MM/yyyy
UPDATE command:
    UPDATE Employees_Details SET EmpEndDate=#02/11/2010# WHERE EmpCode=1
Retrieved date:
    11 February 2010

显示#02/11/2010# 以“2010 年 2 月 11 日”而不是“2010 年 11 月 2 日”的形式写入 Access 数据库。

更好的方法是使用parameterized queries 来避免Access SQL 语句中的日期文字。如果在 Access SQL 语句中必须使用日期文字,请始终选择明确的 #yyyy/mm/dd# 格式。

【讨论】:

  • 如果您使用构造函数创建 Date var,那么 yyyy,m,d 是正确的顺序。使用文字,VB 识别的唯一顺序是 #m/d/yyyy#InvariantCulture 格式相同(这就是 I 的含义)请参阅 Format Requirements for Date Data Type .与 确实 使用本地文化来显示 VS var 值的 C# 不同,VB 不会显示 always #m/d/yyyy# 用于显示并将文字分配给日期 var。
  • @Plutonix 非常感谢您的评论。我已经更新了我的答案,以澄清我正在谈论 Access SQL 中的日期文字。
  • 非常好 - 我以为你在建议 Dim myDt = #2014/2/11# 之类的东西,这是无效的。我不知道 Access SQL 会接受它们为#yyyy/mm/dd#。我认为 that 格式而不是 InvariantCulture 对于代码文字更有意义。
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多