Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно писать дату в запросе? [D5]


.alex ©   (2003-07-05 18:24:00) 

База MS Access, подключаюсь с помощью АДО. Пишу запрос:

sSQLQuery := "INSERT INTO table (ID, Name, Date) VALUES(111, ""Name"", 01/01/1983,)";

После его выполнения вылетает исключение - "синтаксическая ошибка в запросе" - это из-за того что не правильный синтаксис у даты. Как нужно писать правильно?


.alex   (2003-07-06 12:16:00) [1]

Спасибо, всё теперь понятно...


sniknik   (2003-07-06 01:43:00) [2]

ошибка небось
"Ошибка синтаксиса в инструкции INSERT INTO"
или
"Неопределенная функция "CONVERT" в выражении"
? (желательно приводить, а то может лечиш не то ...)
потому как Date зарезервированое слово а CONVERT функция из MSSQL (для Access актуально когда подключение к MSSQL через файл *.adp (в справке поэтому есть, минимум правда, полная в BOL), для подключения из дельфей через Jet не актуально совсем)

(вобще забавно как люди находят именно неработающие решения, в jet автоматическое преобразование и проходит большинство вариантов, тем не менее выбирают именно единственный нерабочий, странно, это не наезд, сам первым делом часто натыкался именно на нерабочие)
рабочие варианты (только для даты, с остальными типами вроде проблем нет)

sSQLQuery :=
"INSERT INTO table ([Date]) VALUES ("01.01.1987")";
"INSERT INTO table ([Date]) VALUES ("01/01/1987")";
"INSERT INTO table ([Date]) VALUES ("01,01,1987")";
"INSERT INTO table ([Date]) VALUES ("01-01-1987")";
"INSERT INTO table ([Date]) VALUES ("Январь 1, 1987")"; //для английской версии естественно исправить
"INSERT INTO table ([Date]) VALUES (31778)";
"INSERT INTO table ([Date]) VALUES (#01/01/1987#)"; //рекомендуемый способ после параметра (см хелп почему)
"INSERT INTO table ([Date]) VALUES (DateValue("Январь 1, 1987"))";
"INSERT INTO table ([Date]) VALUES (DateValue("1 1, 1987"))";
"INSERT INTO table ([Date]) VALUES (DateValue("1,1,1987"));
... также ранее использованые без DateValue строки (т.к. это одно и тоже просто сначала будет автоконвертация)
+ DateValue можно заменить на CDate или CVDate
и +
"INSERT INTO table ([Date]) VALUES (DateSerial(1987, 1, 1));
(боюсь что варианты далеко не все...)

p.s. совет, смени имя поля Date на чтонибудь другое. и еще автоконвертация в условиях не работает т.е. в WHERE нужно указывать тип явно. в главное, параметр для дат (первый предложенный вариант, зря только ты тип поменял при передаче и строку вместо даты передаеш) использовать более правильно.


.alex   (2003-07-05 22:38:00) [3]

Тогда я не понимаю как пользовать функцию CONVERT. Пишу:
sSQLQuery := "INSERT INTO table (ID, Name, Date) VALUES(69, ""asasasa"", CONVERT(SQL_DATETIME, ""01.01.1987""))";
Всё равно вылетает ошибка...


Anatoly Podgoretsky   (2003-07-05 22:16:00) [4]

См. sniknik © (05.07.03 21:28) и также Win+F


.alex   (2003-07-05 22:09:00) [5]

Я же не писал, что мне что-то непонятно, я же сказал - я не нашёл... Где он?


Anatoly Podgoretsky   (2003-07-05 22:05:00) [6]

В справке очень понятный пример, что именно в нем тебе непонятно?


.alex   (2003-07-05 21:44:00) [7]

Что-то я никак не найду, можно примерчик...


sniknik   (2003-07-05 21:28:00) [8]

справка находится в JETSQL40.CHM (логичный следуюшим вопросом будет где именно в MS OFFICE)


Anatoly Podgoretsky   (2003-07-05 21:16:00) [9]

Синтаксис описан в справке по MS OFFICE


.alex   (2003-07-05 21:04:00) [10]

А какой синтаксис у движка MS Access?


Anatoly Podgoretsky   (2003-07-05 20:42:00) [11]

Можно, но тогла пиши в соответствии с синтаксисом движка.


.alex   (2003-07-05 20:36:00) [12]

Спасибо, работает! А почему нельзя это как-нибудь по короче сделать т.е без Parameters.ParamByName(ххх), а просто одним SQL запросом?


Семен Сорокин   (2003-07-05 20:14:00) [13]

попробуй так:
procedure TForm1.Button1Click(Sender: TObject);
var
sSQLQuery: string;
begin
sSQLQuery := "INSERT INTO sobstvenik ([ID], [Name], [Date]) VALUES(:id, :name, :date)";
with ADOQuery1 do begin
Active := FALSE;
SQL.Clear();
SQL.Add(sSQLQuery);

Parameters.ParamByName("id").Value := 111;
Parameters.ParamByName("name").Value := "name";
Parameters.ParamByName("date").Value := StrToDate("11.05.1983");
ExecSQL();
end;
end;


.alex   (2003-07-05 20:05:00) [14]

Пишу вот так:

procedure TForm1.Button1Click(Sender: TObject);
var
sSQLQuery: string;
begin
sSQLQuery := "INSERT INTO sobstvenik (ID, Name, Date) VALUES(:id, :name, :date)";
with ADOQuery1 do begin
Active := FALSE;
SQL.Clear();
SQL.Add(sSQLQuery);

Parameters.ParamByName("id").Value := 111;
Parameters.ParamByName("name").Value := "name";
Parameters.ParamByName("date").Value := "11.05.1983";
ExecSQL();
end;
end;

Всё равно вылетает исключение... Что делать?


Семен Сорокин   (2003-07-05 18:39:00) [15]

sSQLQuery := "INSERT INTO table (ID, Name, Date) VALUES(:id, :name, :date)";
Parameters.ParamByName("id").Value := 111;
Parameters.ParamByName("name").Value := "name";
Parameters.ParamByName("date").Value := Date;


Наверх

Титульная страница Поиск, карта сайта Написать письмо