2010-08-20 4 views
8

У меня есть база данных MS Access (невыносимо) и общаюсь с ней через PHP (ODBC).MS Access: Как вставить NULL в поле DateTime

Существует поле DateTime, которое я должен включить в оператор INSERT. Это поле НЕ определено как «Обязательно» в Access, что означает, что он действительно имеет NULL, и на самом деле некоторые из строк в базе данных Access уже имеют значение NULL.

Проблема, с которой я сталкиваюсь, проста: как вставить NULL через SQL? Все результаты, которые я нашел в Интернете, обратились к нему с чего-то вроде Visual Basic или C#, тогда как я использую SQL через ODBC в PHP.

Я уже пробовал следующее:

INSERT INTO table_name (datetime_field) VALUES (NULL) 
INSERT INTO table_name (datetime_field) VALUES (#NULL#) 
INSERT INTO table_name (datetime_field) VALUES ('NULL') 
INSERT INTO table_name (datetime_field) VALUES ('#NULL#') 
INSERT INTO table_name (datetime_field) VALUES ('') 

(. Там же около 30 других столбцов в моем запросе)

Точная ошибка, я получаю «несоответствие типов данных в выражении критериев», когда я пытаюсь 'или NULL. Другие возвращают ошибку синтаксического анализа (понятно).

Обратите внимание, что я должен включить поле в оператор INSERT. Поле имеет значение по умолчанию, но во многих случаях исходные данные, которые я перевожу, имеют NULL, который также должен быть NULL в целевой базе данных.

Заранее благодарен!

+0

все другие поля в таблице вы вставляете в Автоинкрементных или имеют значение по умолчанию назначены? Поскольку это единственный способ вставить один столбец данных и создать новую строку. –

+1

Есть около 30 столбцов, ни одно из них не является автоматическим приращением, некоторые из них имеют значения по умолчанию, но все они находятся в самом запросе. – Teekin

+2

ah ok, так что вы просто сравнили пример с одним столбцом? Вы пытались обновить строку и установить поле NULL, чтобы увидеть? –

ответ

0

Постарайся просто оставить его пустым

(values fld1,,fld2) 
+0

Я не верю, что это сработает, оно вызывает синтаксическую ошибку как в ADO, так и в окне дизайна запроса. – Fionnuala

+1

Вы также можете попробовать оставить ссылку на поле целиком - вставить (fld1, fld3) значения (val1, val3) – Beth

+0

Да, вы правы, забыли об этом. Поскольку это поле даты, попробуйте ноль. – Beth

1

Попробуйте следующее. Это работает для меня:

INSERT INTO sometable (somedate, somethingelse) 
SELECT Null AS Expr1, "foo" AS Expr2; 

В принципе, вы оборачивать нуль в запросе на выборку и позволяя SQL понять, как представить его к вставке.


- EDIT -

Это также должно работать:

INSERT INTO sometable (somedate, somethingelse) 
values (Null , "foo"); 

Но по каким-то причинам он не с моей установки по умолчанию.

На мой взгляд, я переключил свою БД с ANSI-89 на ANSI-92 и начал работать метод VALUES. Я переключил его обратно на ANSI-89, и он все еще работает. Не только это, в ЛЮБОЙ новой базе данных я создаю, теперь она также работает. Странно ... что-то в установке должно быть изменено (и придерживаться) путем переключения туда и обратно, это не просто ANSI-89/92. Похоже, что мы получили разные результаты.

Вы можете переключиться на базу данных, перейдя в «Офисный логотип» - «Параметры доступа» -> «ПРОЕКТИРОВАНИЕ ОБЪЕКТОВ» -> «ПРОСМОТР QUERY». Изменить синтаксис SQL Server Compatible (ANSI 92) - и проверить «Эта база данных».

Хорошо, очень странно.

+0

У вас должен быть стол с Access, который не будет работать. – Fionnuala

+0

Замените SELECT ... с помощью VALUES (Null, "foo") –

+0

@Remou - Я пробовал это изначально в MS Access 2007 - и он работает. Это была прямая копия и вставка – BIBD

0

Какие библиотеки вы используете для общения с ODBC?
Может быть проблема с синтаксисом для нулевых значений, как интерпретирует его библиотека?

См., Если this страница помогает.
Примечание: я не работал с PHP.

+0

Я использую компоненты ODBC в PHP. Это не имеет значения, так как я просто передаю SQL в драйвер ODBC. – Teekin

+1

Я часто не работаю на PHP, но возможно ли, возможно, магическое значение PHP null или что-то еще? То есть вы передаете слово «Null» как строку в выражении SQL? Это длинный выстрел ... –

1

Я знаю, что ты уже понял это, но есть также dbNull

1

INSERT INTO table_name (datetime_field) VALUES (DbNull.Value)

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