Страница 1 из 1

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

Добавлено: 14 янв 2012, 21:59
SeGun
Здравствуйте.

Скачал 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

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

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

собственно, по проблеме - используйте компонент 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

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

Добавлено: 14 янв 2012, 23:18
SeGun
Спасибо за подсказку.
Нашел вот такое решение:
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;
Проблема решена.

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

Добавлено: 15 янв 2012, 14:27
kdv
используйте ПАРАМЕТРЫ! К чему эти лишние преобразования?

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

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;
И все. Откуда это стремление нагородить побольше кривого кода?