Проблема с простым запросом

Прикладное ПО на InterBase, Firebird или Yaffil. Реклама, обсуждение, и т.п.
Ответить
SeGun
Сообщения: 5
Зарегистрирован: 29 ноя 2005, 17:55

Проблема с простым запросом

Сообщение SeGun » 14 янв 2012, 21:59

Здравствуйте.

Скачал Firebird-2.5.1.26351_1_Win32
Среда Delphi 7
Пытаюсь выполнить запрос
DM1.QAnketa_Rep.SQL.Text:='SELECT country, count(country) FROM TESTS WHERE DZT Between '+'"'+SD1+'"'+' AND '+'"'+SD2+'"'+' GROUP BY COUNTRY';
Где SD1 и SD2
SD1:=DateToStr(Form2.DateTimePicker1.DateTime);
SD2:=DateToStr(IncDay((Form2.DateTimePicker2.DateTime),1));
В ответ получаю сообщение:
EIBInterBase error
Dynamic SQL Error
SQL Error Code = -206 column UnKnown
14.12.11 {Это дата из базы поле DZT}
at line 1 column 72
Хотя такой запрос:
select country, count(country) from tests where dzt between '09.01.12' and '09.01.12' group by country
Успешно возвращает результат в IBExpert

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Проблема с простым запросом

Сообщение kdv » 14 янв 2012, 22:51

Вообще-то, поскольку формат даты может отличаться на разных компьютерах, я бы рекомендовал использовать параметры вместо подстановки дат в виде строк в запрос.

собственно, по проблеме - используйте компонент IBSQLMonitor или отладчик, чтобы увидеть, какой запрос на самом деле находится в SQL.Text. Вы уверены, что там то же самое, что вы выполняете в IBExpert? А там не то же самое, там вот что

select country, count(country) from tests where dzt between "09.01.12" and "09.01.12" group by country

а двойные кавычки, как известно, в третьем диалекте служат для обрамления "квотируемых идентификаторов"
http://www.ibase.ru/ibfaq.htm#dial

SeGun
Сообщения: 5
Зарегистрирован: 29 ноя 2005, 17:55

Re: Проблема с простым запросом

Сообщение SeGun » 14 янв 2012, 23:18

Спасибо за подсказку.
Нашел вот такое решение:
DM1.QAnketa_Rep.SQL.Text:='SELECT country, count(country) FROM TESTS WHERE DZT Between '''+FormatDateTime('dd/mm/yyyy',DTS)+''' AND '''+FormatDateTime('dd/mm/yyyy',DTPO)+''' GROUP BY COUNTRY';
где:
DTS:=Form2.DateTimePicker1.DateTime;
DTPO:=Form2.DateTimePicker2.DateTime;
Проблема решена.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Проблема с простым запросом

Сообщение kdv » 15 янв 2012, 14:27

используйте ПАРАМЕТРЫ! К чему эти лишние преобразования?

Код: Выделить всё

QAnketa_Rep.SQL.Clear;
QAnketa_Rep.SQL.Add('select country, count(country) from tests where dzt between :dt1 and :dt2 group by country');
QAnketa_Rep.Prepare;
QAnketa_Rep.ParamByName('dt1').asDateTime:=DateTimePicker1.DateTime;
QAnketa_Rep.ParamByName('dt2').asDateTime:=DateTimePicker2.DateTime;
QAnketa_Rep.Open;
И все. Откуда это стремление нагородить побольше кривого кода?

Ответить