Я пытаюсь вставить 2 значения из переменных в таблицу через SQL, код завершается без ошибок, но записи не отображаются в таблице.
Я попытался выполнить код в окне immidate, но это дало мне ошибку о моих скобках (на самом деле я не знаю, как правильно ввести приглашение), поэтому я изменил свой запрос с переменных на установленные значения для вставки, но это все равно не работает и ошибки не выдает.
Я убедился, что в моем коде нет «Ошибки», и попытался создать ошибку вручную. Синтаксические ошибки отображаются как обычно, поэтому я предполагаю, что с сообщениями об ошибках все в порядке.
'Table Columns: ID, ProjectID, Versionnumber
SQL = "INSERT INTO tblVersion " & _
"(ProjectID, Versionnumber) " & _
"VALUES (1, 'v3.0');"
Currentdb.Execute SQL
Я ожидаю, что значение будет отображаться, когда я открываю таблицу. Вместо этого вообще ничего не произошло.
Если вы хотите ошибок, вам нужно использовать Currentdb.Execute SQL, dbFailOnError
. В противном случае любая ошибка вызовет тихий сбой.
Пробовал, но результат не меняется. Поправлю в сегменте кода
Теперь он показывает ошибки, и я могу решить проблему. Спасибо @ErikA
CurrentDb.Execute
по умолчанию не вызывает все ошибки. Он просто молча выйдет из строя, не сообщая вам, что запрос был неудачным, независимо от каких-либо утверждений On Error
.
Насколько я знаю, все ошибки, которые могут быть сгенерированы во время компиляции (синтаксические ошибки, недопустимые имена таблиц или имена полей), возникают, а ошибки времени выполнения (нарушение ограничений, повторяющиеся первичные ключи и т. д.) не возникают. поднятый.
Чтобы получить все ошибки, используйте dbFailOnError
. Это также приведет к сбою всего запроса, если в одной операции возникнет ошибка (например, одна строка нарушает ограничение), в то время как без этого не будет выполнена только неудачная операция.
Итак, в общем, используйте это:
Currentdb.Execute SQL, dbFailOnError
dbFailonError не решает эту проблему для меня. Одно поле в моей таблице настроено со списком со списком, и оно ограничено списком. Однако, когда я запускаю код CurrentDb.Execute со значением, которого нет в списке, в таблицу ничего не добавляется, и в мой код On Error не возвращается ошибка. Я использую Access 2016. Он отлично работает с неправильным заголовком поля, но не с неправильным значением.
@BenW Это другой вопрос. Ограничить список — это ограничение пользовательского интерфейса, а не ограничение базы данных, поэтому не вызывает dbFailOnError. Если вы спросите об этом здесь и предоставите минимальный воспроизводимый пример, я, вероятно, смогу предоставить решение.
Код точно такой же, как код, которым поделился P.Weg, за исключением того, что поле ProjectID является текстовым полем и ограничено списком (список предоставляется связанной таблицей). Я не понимаю, почему это не ограничение базы данных, если оно приводит к сбою моего оператора вставки SQL. Но главный вопрос в том, почему он не вызывает никаких ошибок.
@BenW Я не понимаю, почему это не ограничение базы данных, если оно приводит к сбою моего оператора вставки SQL. В том-то и дело. Обычно это не приводит к сбою вставки, если только в миксе нет чего-то еще, например отношения между таблицами с ссылочной целостностью. Вот почему я хочу минимальный воспроизводимый пример и не буду отвечать здесь.
Эрик, вы были правы в том, что это вызвано отношением таблицы со ссылочной целостностью (а не списком связанных полей), но я до сих пор не понимаю, почему это не выдает ошибку. Я создал здесь отдельный вопрос со ссылкой на мою минимальную базу данных. stackoverflow.com/questions/64216792/…
Попробуйте добавить пробел после номера версии)