Недопустимая ошибка аргумента: MSAccess и SQL - PullRequest
0 голосов
/ 01 июля 2010

Я пытаюсь получить доступ к определенным строкам из моей базы данных SQL из MSAccess, и в этой строке постоянно появляется ошибка неверного аргумента:

Set rs = CurrentDb.OpenRecordset("SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = prodSelect AND EndTime is NULL AND StartTime < dateAdd('h', 3, NOW())", [dbSeeChanges])

Что-то не так в этом?

Private Sub cmdClockEnd_Click()

'Check if a group has been selected.
If frmChoice.value = 0 Then

    MsgBox "Please select a production line."

    End

End If

'Setup form for user input.
lblEnd.Visible = True

'Save end of lunch value.
lblEnd.Caption = Format(Now, "MMM/DD/YY hh:mm:ss AMPM")

'Declare database variables.
Dim dbName As DAO.Database
Dim strValuesQuery As String
Dim rs As DAO.Recordset
Dim prodSelect As String
Dim sSQL As String
Dim timeValue As String
Set dbName = CurrentDb

'Get values of Production Line.
If frmChoice.value = 1 Then

prodSelect = "L2"

ElseIf frmChoice.value = 2 Then

prodSelect = "L3"

End If

'Get the last TimeID with the following parameters.
sSQL = "SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = prodSelect AND EndTime is NULL AND StartTime < #" & DateAdd("h", 3, Now()) & "#"

Set rs = dbName.OpenRecordset(sSQL, dbSeeChanges)

strValuesQuery = _
                    "UPDATE tblLunchTime " & _
                    "SET EndTime = '" & Now & "'" & _
                    "WHERE TimeID = " & rs![TimeID] & " "

'Turn warning messages off.
DoCmd.SetWarnings False

'Execute Query.
DoCmd.RunSQL strValuesQuery

'Turn warning messages back on.
DoCmd.SetWarnings True

End Sub

Ответы [ 3 ]

5 голосов
/ 01 июля 2010

Вам нужно поставить prodSelect вне кавычек:

"WHERE ProductionID = " & prodSelect & " AND ...

Почти всегда лучше сказать:

sSQL="SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = " & prodSelect & _
    " AND EndTime is NULL AND StartTime < dateAdd('h', 3, NOW())"
''Debug.print sSQL
Set rs = CurrentDb.OpenRecordset(sSQL)

Вы можете увидеть преимущество в использовании Debug.Print.

AHA prodSelect - это текст! Вам нужны цитаты!

sSQL="SELECT TimeID " & _
    "FROM tblLunchTime " & _
    "WHERE ProductionID = '" & prodSelect & _
    "' AND EndTime is NULL AND StartTime < dateAdd('h', 3, NOW())"
1 голос
/ 01 июля 2010

Кажется, что существует путаница с tblLunchTime ... будь то собственная таблица Jet / ACE или ссылка на таблицу в другой базе данных.Пожалуйста, покажите нам вывод этой команды:

Debug.Print CurrentDb.TableDefs("tblLunchTime").Connect

Вы можете вставить эту строку в окно немедленного действия и нажать клавишу ввода, чтобы отобразить ответ.(Вы можете открыть окно немедленного действия с помощью комбинации клавиш CTRL + g.)

На всякий случай, если ответ начинается с " ODBC ", предложите попробовать следующую строку в коде:

Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges)

Обновление : Теперь, когда вы преодолели это препятствие, предложите изменить свой подход с помощью инструкции UPDATE.Не выключайте предупреждения;попробуйте что-то вроде этого:

'Execute Query. '
CurrentDb.Execute strValuesQuery, dbFailOnError

И добавьте обработчик ошибок, чтобы справиться с любыми ошибками, зафиксированными dbFailOnError.

1 голос
/ 01 июля 2010

Я думаю, что я бы тоже применил объединение критериев даты на стороне клиента, так как это может привести к ошибкам:

  "...StartTime < #" & DateAdd("h", 3, Now()) & "#"

Я не знаю, что в SQL Server нет DateAdd() и Now (), а также то, что они не ведут себя точно так же, как в Access, но я бы не рискнул - я бы сделал этот расчет на клиенте, а не передавал его на сервер.

...