Почему я получаю ошибку «ошибка преобразования fb из строки «0»» при использовании обычного запроса?

#delphi #firebird #rad-studio

#delphi #firebird #rad-studio

Вопрос:

Я новичок в Delphi и Firebird. Когда я запускаю следующий запрос, я получаю сообщение об ошибке:

ошибка преобразования fb из строки «0»

RECEIPTDATE является DATE столбцом.

Как я должен изменить свой запрос?

 FDQueryDataBetween.SQL.Add('select * from RAPOR where RECEIPTDATE BETWEEN ' startDate ' AND ' stopDate '');
 

Комментарии:

1. Какую версию Firebird вы используете и какой диалект SQL использует ваша БД? Существуют различия между диалектом 1 и диалектом 3 при форматировании строк даты вручную. Какие строковые значения startDate содержат и stopDate содержат? Поддерживаемые форматы см. в литералах даты Firebird . Но почему вы вообще создаете инструкцию SQL вручную? Вместо этого используйте параметризованный запрос , пусть Firebird сам обрабатывает форматирование за вас.

2. Я использую firebird 3. Тип StartDate и stopDate — TDate . Мне нужно использовать много запросов, поэтому я использую ручной запрос. Я думаю, что этот способ полезен для меня. Я буду искать параметризованный запрос.

3. Вы ДЕЙСТВИТЕЛЬНО не должны использовать ручные запросы, когда задействованы значения параметров. Они неэффективны и опасны, если вы их неправильно поняли (атаки SQL-инъекций и т. Д.). Вместо этого используйте параметризованные запросы. Они безопаснее, быстрее и эффективнее, особенно если вам нужно выполнять одни и те же запросы много раз. Параметризованный запрос может быть подготовлен заранее на стороне сервера, а затем вы просто выполняете его столько раз, сколько вам нужно, каждый раз предоставляя только новые значения параметров, а не все новые запросы.

4. НЕ объединяйте строки для построения SQL. Это не только делает вас открытым для внедрения SQL, но и вызывает проблемы с цитированием значений, проблемы с преобразованием и другие проблемы. Вместо этого используйте параметры, что позволяет драйверам базы данных решать все вышеуказанные проблемы. Здесь есть десятки существующих сообщений об использовании параметризованных запросов в Delphi.

Ответ №1:

Я решил проблему с использованием параметров.

 FDQueryDataBetween.SQL.Add('select * from RAPOR where RECEIPTDATE BETWEEN :startDate AND :stopDate');
FDQueryDataBetween.ParamByName('startDate').AsDate:= DateTimePickerStart.Date;
FDQueryDataBetween.ParamByName('stopDate').AsDate:= DateTimePickerEnd.Date;