2009-11-23 2 views
3

Мне нужно вставить данные формы из моего приложения VB.NET в базу данных Microsoft Access.MS Access INSERT INTO statement

Я получаю сообщение об ошибке при использовании "Syntax error in INSERT INTO statement" следующего синтаксиса:

INSERT INTO bs1 (teacher, subject, date, period) 
VALUES ('test', 'test', 'test', 'test') 

Я признаю, что я привык к синтаксису типа MySQL, любая помощь по этому вопросу была бы весьма признателен, спасибо.

+1

В чем проблема?Какую ошибку вы получаете? –

+2

Или просто «Что такое квестон?» –

+0

Синтаксис дает ошибку SQL, если я пытаюсь запустить его непосредственно в MS Access, появляется сообщение с сообщением «Синтаксическая ошибка в инструкции INSERT INTO». – James

ответ

10

Я считаю, что date является зарезервированным словом. Вам нужно инкапсулировать зарезервированные имена полей в квадратных скобках:

INSERT INTO bs1 (teacher, subject, [date], period) VALUES ('test', 'test', 'test', 'test')

EDIT: Смотрите в следующей статье полный список зарезервированных слов в Access 2002 и более: http://support.microsoft.com/kb/286335

~ md5sum ~

+0

+1, отметив, что 'date' является зарезервированным ключевым словом. Пользователь должен также отметить важность использования # для инкапсуляции даты, как указано в Remou выше. –

4

Доступ к разделителю для литеральных значений, вставленных в поля даты, равен #, для текстовых полей «или» и числовых значений поля не имеет разделителя, что предполагает:

INSERT INTO BS1 (учитель, предмет, [дата], период) VALUES ('тест', 'тест', # 2009-12-31 #, 0)

+0

Отличное наблюдение при подборе поля [date] и использование # для его инкапсуляции. –

+0

@onedaywhen, я сознательно сказал поля, потому что только когда поле имеет тип даты, нужны разделители дат. – Fionnuala

+0

@Remou: ваша формулировка может быть улучшена: «разделитель для полей даты» - в Access Database Engine SQL вам не нужно разграничивать * поля *. Для литеральных значений требуются разделители. – onedaywhen

3

В Access код Database Engine SQL, когда вы необходимо указать, что буквальное значение имеет тип DATETIME, вы можете явно указать значение DATETIME или использовать # символов, чтобы разграничить значение.

Используя явное приведение с использованием CDATE() функции:

INSERT INTO bs1 (teacher, subject, [date], period) 
    VALUES ('test', 'test', CDATE('2009-12-31 00:00:00'), 0); 

Использования DATETIME буквального значения:

INSERT INTO bs1 (teacher, subject, [date], period) 
    VALUES ('test', 'test', #2009-12-31 00:00:00#), 0); 

When INSERT ИНГАМИ значения в столбец типа DATETIME, если вы не указали явное значение DATETIME, движок будет неявно пытаться принудить значение к DATETIME. Литеральное значение «test» не может быть принудительно введено в DATETIME, и это будет являться источником вашей синтаксической ошибки.

Примечание: Ни одно из вышесказанного не относится к значению NULL. В Access Database Engine SQL нет способа отбросить значение NULL на явный тип, например.

SELECT CDATE(NULL) 

генерирует сообщение об ошибке «Недопустимое использование NULL». Поэтому, чтобы указать литерал NULLDATETIME, просто используйте ключевое слово NULL.

Это платит, чтобы помнить, что база данных Access Engine имеет только один временный тип данных, будучи DATETIME (его синонимы DATE, TIME, DATETIME и TIMESTAMP). Даже если вы явно не укажете элемент времени, результирующее значение будет по-прежнему иметь элемент времени, хотя и неявный. Поэтому лучше всегда быть явным и всегда включать элемент времени при использовании DATETIME литеральных значений.

+0

Почему это проголосовало? –

+0

@mgroves: когда я вижу проголосовавший без комментариев, я склонен подозревать вопросы лично, а не программировать - вы всегда можете сами проголосовать за себя, чтобы исправить баланс;) – onedaywhen

+0

Это напоминание о нулевых значениях помогло мне – datatoo

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