Несоответствие типов доступа в поле даты с экспресс-сервером SQL Server - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть простая форма доступа с несвязанным текстовым полем, которое используется для поиска записей с соответствующей датой, а результаты отображаются в подчиненной форме.Бэкэнд-база данных хранится в экземпляре SQL Express 2008, доступ к которому осуществляется через соединение ODBC (собственный клиент SQL Server 10.0).Клиент Access 2007, работающий на 64-битной Windows 7. professional.

Когда пользователь нажимает кнопку поиска в форме, для обновления подчиненной формы выполняется следующий код 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

Тип данных в поле [Date] серверного конца SQL Server - DateTime, и приведенный выше код завершается ошибкой в ​​выделенной строке выше с ошибкой Data type mismatch in criteria expression.

Я попытался изменить свойство format дляtxtDate от короткой даты до общей даты, и я также изменил формат даты в строке выше, которая форматирует txtDate.Value.

Запрос SQL, содержащийся в переменной query в приведенном выше фрагменте кода (значениепоказано ниже), отлично работает при копировании и вставке в SQL Express Management Studio.

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

Что я делаю не так?

1 Ответ

2 голосов
/ 22 ноября 2011

Проблема в том, что значения даты внутри собственных запросов доступа должны быть заключены в знаки фунта / хеша вместо кавычек.По сути, как и любая база данных 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.

...