2

我有一個簡單的訪問表單與未綁定的文本框,用於搜索具有匹配日期的記錄,結果顯示在子窗體中。後端數據庫存儲在通過ODBC連接(SQL Server Native Client 10.0)訪問的SQL Express 2008實例中。客戶端是Access 2007,在64位Windows 7專業版上運行。訪問類型與SQL Server後臺日期字段不匹配

當用戶單擊窗體上的搜索按鈕時,將執行以下VBA代碼以更新子窗體。

Private Sub UpdateSfmQuery() 
    Dim query As String 

    If IsDate(txtDate.Value) And IsNumeric(cboStaff.Value) Then 
     query = "SELECT * FROM TimesheetEntries " & _ 
       "WHERE StaffId = " & cboStaff.Value & " " & _ 
       "AND [Date] = '" & _ 
       Format(txtDate.Value, "YYYY/MM/DD HH:MM:SS") & "' " 
    Else 
     query = "SELECT * FROM TimesheetEntries WHERE 0 = 1;" 
    End If 

    frmTimesheetUpdateSfm.Form.RecordSource = query '<--- Fails here 
End Sub 

在SQL Server後端中的數據類型[日期]字段是日期時間,和上述代碼失敗上突出顯示的行以上的錯誤,Data type mismatch in criteria expression

我試着將txtDate的格式屬性從短日期更改爲一般日期,並且我還修改了格式爲txtDate.Value的上面一行中的日期格式。

包含在上述代碼摘錄(下面顯示的值)中的變量query中的SQL查詢在複製並粘貼到SQL Express Management Studio時可以完美執行。

SELECT * FROM TimesheetEntries WHERE StaffId = 14 AND [Date] = '2011/11/22 00:00:00' 

我在做什麼錯?

回答

2

問題是本機Access查詢中的日期值需要用磅/散列符號而不是引號包圍。基本上,就像任何SQL數據庫一樣,Access有它自己的SQL方言,它與SQL Server略有不同。

Private Sub UpdateSfmQuery() 
    Dim query As String 

    If IsDate(txtDate.Value) And IsNumeric(cboStaff.Value) Then 
     query = "SELECT * FROM TimesheetEntries " & _ 
       "WHERE StaffId = " & cboStaff.Value & " " & _ 
       "AND [Date] = #" & _ 
       Format(txtDate.Value, "YYYY/MM/DD HH:MM:SS") & "# " 
    Else 
     query = "SELECT * FROM TimesheetEntries WHERE 0 = 1;" 
    End If 

    frmTimesheetUpdateSfm.Form.RecordSource = query '<--- Used to fail here 
End Sub 

記住,你可以隨時把你查詢的樣機和使用Access的查詢編輯器,試圖使查詢工作。作爲一個便箋,我建議你使用ms-access標籤來標記這樣的問題,除非你的問題是特定於Access的某個版本的。

+0

只是剛剛開始測試這個,但是完美的工作。非常感謝。我是新來的訪問,但用SQL開發了多年,我發現訪問似乎有很多像這樣的小怪癖。 – Bryan