2017-02-14 5 views
0

Этот код вставляет запись в базовую без предупреждения.Когда я запускаю запрос sql, нет предупреждения

CurrentDb.Execute _ 
"INSERT INTO basetable(clName,clId,clGender) VALUES('test','123','');" 

Я ожидал, что этот код должен появиться, потому что поле clGender установлено как обязательное, но без предупреждения. Не могли бы вы рассказать мне, где я был неправ.

+1

Как вы подтвердили, что это поле обязательно для заполнения? Когда вы выполняете это утверждение и «нет оповещения», что * does * происходит? Включена ли запись? Какая ценность присутствует в поле 'clGender' в этой записи? – David

+0

Дэвид, я думаю, что установка «требуется» в свойстве да означает, что она не может быть нулевой. запись не была вставлена, что означает, что ничего не происходит. Также нет предупреждения. –

ответ

0

Вы можете использовать:

DoCmd.RunSQL " Insert ... " 

, хотя это может быть слишком много.

0

Причина, по которой вы не получили предупреждение, состоит в том, что вы предоставили значение для clGender. В представлении табличного дизайна имеются два соответствующих свойства: Required и Allow zero length. Поле clGender имеет оба значения: true. Параметр Required означает, что вы не можете сохранить запись с этим полем как Null, но в вашем заявлении insert вы не указали Null, вы указали пустую строку, которая разрешена установкой Allow zero length.

[EDIT]

К сожалению, только сейчас понял, что происходит. Метод Execute не дает вам обратной связи напрямую. Однако вы можете использовать свойство RecordsAffected, чтобы узнать, выполнило ли оно то, что вы ожидали.

Dim db As DAO.Database 
Set db = CurrentDb() 
db.Execute "INSERT INTO basetable(clName,clId,clGender) VALUES('test','123','')" 
If db.RecordsAffected = 0 Then 
    MsgBox "Insert failed" 
End If 
Set db = Nothing 
+0

Я не уверен, понимаю ли я, что вы сказали, но я указал «Обязательный» как истинный и «Разрешить нулевую длину» как false. Также я попробовалCurrentDb.Execute _ '' INSERT INTO basetable (clName, clId, clGender) VALUES (NULL, NULL, NULL); ", но эти коды также не отображали предупреждения. –

+0

'RecordsAffected' всегда возвращает 0, даже если этого не должно быть. Я искал эту проблему, но я не мог найти причину. Программисты сказали, что создание db-экземпляра CurrentDb сделает работу 'RecordsAffected' корректной. Поэтому я ожидал, что коды будут работать должным образом, потому что экземпляр db был создан. Но я всегда возвращался 0. –

+0

Просто протестировал это локально (хотя и с Access 2013), и он работал, как ожидалось. Вы говорите, что всегда возвращает 0 для 'RecordsAffected' - можете ли вы подтвердить, что строка определенно вставлена? – Skippy

Смежные вопросы