Vb.net 从日期时间选择器插入值导致错误

Vb.net 从日期时间选择器插入值导致错误,vb.net,ms-access,Vb.net,Ms Access,在VisualBasic上的Windows窗体中,我有一个日期时间选择器,用户可以从中选择时间和日期 我通过参数化查询将此值插入Access数据库。然而,当我运行表单时,我不断得到条件表达式中的错误数据类型不匹配 如果从Insert命令中删除该参数,则该字段将进入精细状态。但是当我把它放回去的时候,它就不起作用了 Private Sub AcceptBtn_Click(sender As System.Object, e As System.EventArgs) Handles AcceptBt

在VisualBasic上的Windows窗体中,我有一个日期时间选择器,用户可以从中选择时间和日期

我通过参数化查询将此值插入Access数据库。然而,当我运行表单时,我不断得到条件表达式中的错误数据类型不匹配

如果从Insert命令中删除该参数,则该字段将进入精细状态。但是当我把它放回去的时候,它就不起作用了

Private Sub AcceptBtn_Click(sender As System.Object, e As System.EventArgs) Handles AcceptBtn.Click

            Dim InsertTournamentQuery As String = "INSERT INTO Tournaments (SanctioningID, TournamentName, TournamentVenue, Game, Format, OrganizerID, PairingSystem, TournamentDateTime) VALUES (?,?,?,?,?,?,?,?)"
            Dim LastRowSelect As String = "SELECT @@IDENTITY"
            Dim LastRowID As Integer
            Dim DBconnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Master.mdb"

            Using connection As New OleDb.OleDbConnection(DBconnection)
                Using cmd As New OleDb.OleDbCommand(InsertTournamentQuery, connection)
                    cmd.Parameters.AddWithValue("?", SanctionID)
                    cmd.Parameters.AddWithValue("?", Trim(TrnNameTxt.Text))
                    cmd.Parameters.AddWithValue("?", Int(TrnVenueLst.SelectedValue))
                    cmd.Parameters.AddWithValue("?", GameLst.SelectedValue)
                    cmd.Parameters.AddWithValue("?", Convert.ToInt32(FormatLst.SelectedValue))
                    cmd.Parameters.AddWithValue("?", OrganizerID)
                    cmd.Parameters.AddWithValue("?", Convert.ToInt32(PairingLst.SelectedValue))
                    cmd.Parameters.AddWithValue("?", TrnDate.Value)

                    connection.Open()
                    cmd.ExecuteNonQuery()
                    cmd.CommandText = LastRowSelect
                    LastRowID = cmd.ExecuteScalar()
                    connection.Close()
                End Using
End Sub

尝试转换日期时间值并插入到数据库中

cmd.Parameters.AddWithValue("?", Convert.ToDateTime(TrnDate.Value.ToString))
尝试在请求中添加日期前后值

为了清楚起见,请发布一个请求示例,使用以下命令

Debug.Print "INSERT INTO Tournaments (SanctioningID, TournamentName, TournamentVenue, Game, Format, OrganizerID, PairingSystem, TournamentDateTime) VALUES (" _
        & SanctionID & ",'" & Trim(TrnNameTxt.Text) & "'," & Int(TrnVenueLst.SelectedValue) & ",'" & GameLst.SelectedValue & "'," & Convert.ToInt32(FormatLst.SelectedValue) _
        & "," & OrganizerID & "," & Convert.ToInt32(PairingLst.SelectedValue) & "," & TrnDate.Value & ")"

当您将包含毫秒的DateTime值作为参数传递时,会导致此错误。如果从时间值中去掉毫秒,MS Access将毫无问题地接受参数值。据我所知,去除毫秒的最简单方法是创建如下方法:

Public Function fixDateTimeForMsAccess(value As Date) As Date
    Return New Date(value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second)
End Function
cmd.Parameters.AddWithValue("?", fixDateTimeForMsAccess(TrnDate.Value))
然后你可以这样使用它:

Public Function fixDateTimeForMsAccess(value As Date) As Date
    Return New Date(value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second)
End Function
cmd.Parameters.AddWithValue("?", fixDateTimeForMsAccess(TrnDate.Value))

请检查数据库中的所有数据类型是否与插入的值正确匹配。它们确实正确。TournamentDate的列设置为日期/时间。它怎么可能是日期或时间?实际的数据类型是什么?Access数据库中TournamentDateTime列的数据类型是Date/Time。为什么要获取datetime,将其转换为字符串,然后将其转换回datetime?TrnDate变量的数据类型是什么?TrnDate是来自日期选择器的表单控件。它的.Value是用户选择的结果。