Оператор обновления «Время выполнения 3129» - PullRequest
0 голосов
/ 11 октября 2019

Я пишу в VBA / MS Access и у меня возникают проблемы с этой ошибкой. Я думаю, что это дата. Я использую функцию:

DOB = Format(DOB,"\#mm\/dd\/yyyy\#")

Теперь это работает для INSERT SQL также работает в моем коде. Это выглядит так, когда я Debug.Print

,#01/01/1900#,

Моя проблема связана с моим оператором UPDATE sql.

"UPDATE table SET " & "DOB=" & DOB & "," & "Last_Maintain_Date=" & LastMaintainDate & _
"," & LastmaintainUser & " WHERE ID=" & ID

Debug.Print

UPDATE table SET DOB=#03/01/1983#,Last_Maintain_Date="10/11/2019 2:59:47 PM",Last_Maintain_User="User Name" WHERE ID=11111111

DOB isполе даты. ID является числовым полем, а два других являются строками. Я хотел бы, чтобы ошибки во время выполнения помогли вам немного больше, чем просто «ваш код неправильный».

Ответы [ 3 ]

1 голос
/ 11 октября 2019

Рассмотрим параметризацию, которая поддерживается в MS Access с использованием QueryDefs и помогает избежать необходимости в пунктуации или конкатенации:

Dim strSQL As String
Dim qdef As QueryDef

' PREPARED SQL STATEMENT WITH PARAMETERS CLAUSE (NO DATA)
strSQL  = "PARAMETERS [prmDOB] Date, [prmLastMaintainDate] Date, "_
            & "       [prmLastmaintainUser] Text, [prmID] Long;"
            & " UPDATE mytable " _
            & " SET DOB = [prmDOB], " _
            & "     Last_Maintain_Date = [prmLastMaintainDate], " _
            & "     LastmaintainUser = [prmLastmaintainUser] " _
            & " WHERE ID = [prmID]"

Set qdef = CurrentDb.QueryDefs("", strSQL)

' BIND PARAMS (NO QUOTES OR HASHTAGS)
qdef![prmDOB] = DOB                            ' ASSUMED TO BE A DATE TYPE
qdef![prmLastMaintainDate] = LastMaintainDate  ' ASSUMED TO BE A DATE TYPE 
qdef![prmLastmaintainUser] = LastmaintainUser  ' ASSUMED TO BE A STRING TYPE
qdef![prmID] = ID                              ' ASSUMED TO BE AN INT/LONG TYPE

' RUN ACTION
qdef.Execute dbFailOnError

Set qdef = Nothing

Вы даже можете сохранить вышеуказанный оператор обновления как сохраненный MS Accessзапрос и ссылка на него ниже, полностью отделяя SQL от VBA:

Set qdef = CurrentDb.QueryDefs("mySavedUpdateQuery")

' BIND PARAMS
qdef![prmDOB] = DOB
qdef![prmLastMaintainDate] = LastMaintainDate
qdef![prmLastmaintainUser] = LastmaintainUser
qdef![prmID] = ID

' RUN ACTION    
qdef.Execute dbFailOnError

Set qdef = Nothing

Обратите внимание, что параметризация SQL - это лучшая отраслевая практика программирования, которая распространяется за пределы VBA до любого прикладного уровня, который запускает SQL какнизкоуровневый язык, включая языки общего назначения, такие как Java, Python, C #, PHP и другие. Хотя реализация отличается, концепция одинакова для отделения SQL от кода приложения. См. Соучредитель StackOverflow Джефф Этвуд Дайте мне параметризованный SQL или дайте мне смерть .

0 голосов
/ 14 октября 2019

Вы забыли процитировать текстовые значения и переменную:

"UPDATE table SET DOB=" & DOB & "," & "Last_Maintain_Date='" & LastMaintainDate & "'," & _
"Last_Maintain_User = '" LastmaintainUser & "' WHERE ID=" & ID & ""
0 голосов
/ 11 октября 2019

Если тип данных Last_Maintain_Date равен дате, его необходимо отформатировать так же, как в DOB:

Обновить таблицу SET ... Last_Maintain_Date = # 10/11/2019 14: 59: 47 #. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...