|
|
|
| пытаюсь внести запись в таблицу
for i=1 to n
DoCmd.RunSQL "insert into temp Values ('" & a(0, i - 1) & "','" & a(1, i - 1) & "','" & a(2, i - 1) & "','" & a(3, i - 1) & "')"
next i
все бы хорошо, но а(3, i-1) может буть пустым значение Null, а может содержатьь дату.
если содержит дату ,то никаких проблем и запись идет.
но когда a(3,i-1) принимает значение Null выдает ошибку (небыло добавленно записей и т.д и т.п.)
в таблице куда идет запись поле имеет формат Date.
как можно записать в поле формата date значение null?
если просто убираю а(3, i-1) , то ругается, что число полей не совпадает. | |
|
| |
|
|
|
| разрешите пустые значения в этом поле | |
|
| |
|
|
|
| разрешены
еще одно уточнение, когда принмает значение null ругается на преобразование типа данных | |
|
| |
|
|
|
|
| таже ошибка
значение Null присвоенно следующему количеству полей -1 (ошибка преобразования типа) | |
|
| |
|
|
|
| а в поле таблицы Null разрешен? | |
|
| |
|
|
|
| В вашем случае запрос пытается вставить пустую строку, а не Null.
Можно сделать так: NZ(a(3,i-1),'Null'), но мой вам совет - не используйте запрос INSERT...VALUES.
Это сплошной гемор с десятичным разделителем и форматом даты, борьба с Null (как у вас) и необходимость дублирования внутри текста обрамляющих символов (в вашем случае - апостроф).
Гораздо удобнее - открыть Recordset и добавить запись туда без этих хлопот. К тому же так можно легко получить значение ID-счетчика добавленной записи.
ЗЫ. А еще советую забыть, что есть такой метод DoCmd.RunSQL.и использовать Execute. | |
|
| |
|
|
|
| Спасибо за подсказку.
а можно пояснить почему Execute лучше чем Docmd.RunSQL? | |
|
| |
|
|
|
| Хотя бы потому, что с RunSQL нужно отключать/включать сообщения. При этом есть вероятность, что останется отключенным, и тогда даже при интерактивной работе в БД вы можете случайно удалить или не сохранить что-нибудь нужное - предупреждений не будет.
К тому же объект DoCmd есть только в Аксе, а DAO и ADO можно использовать в других приложениях. | |
|
| |