使用OleDb和Access处理dd / mm / yyyy日期格式

时间:2014-11-10 16:29:18

标签: vb.net ms-access

我在查询/ 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

1 个答案:

答案 0 :(得分:2)

  

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

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


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

#mm/dd/yyyy#

该代码产生

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 已写入Access数据库为“2010年2月11日”,而不是“2010年11月2日”。

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