2012-02-27 50 views
1

在Visual Basic的Windows窗体中,我有一个DateTime Picker供用户从中选择时间和日期。从导致错误的DateTime Picker插入值

我通过参数化查询将此值插入Access数据库。但是,当我运行表单时,我总是收到错误Data type mismatch in criteria expression

如果我从插入命令删除参数,该字段输入正确。但是当我把它放回去时,它不起作用。

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 
+0

什么TrnDate变量的数据类型? – 2012-02-27 15:17:40

+0

TrnDate是来自日期选取器的表单控件。它的值是用户选择的结果。 – 2012-02-27 15:28:21

回答

1

尝试转换DateTime值并插入数据库。

cmd.Parameters.AddWithValue("?", Convert.ToDateTime(TrnDate.Value.ToString)) 
+0

与以前一样的错误:/ – 2012-02-27 04:59:21

+0

请检查数据库中的所有数据类型是否与您插入的值正确匹配。 – 2012-02-27 05:04:12

+0

他们确实是对的。 TournamentDate的列设置为日期/时间。 – 2012-02-27 05:06:56

1

尝试前,在请求

要想清楚请张贴的请求例如日期值后加入#,使用此命令

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 & ")" 
1

当你传递这个错误造成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))