2012-02-27 40 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))