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