Ask писал(а):Правильный план -- написать библиотеку для генерации SQL:
with publicip do
SQL.Select([address, regnum, dateref]).Where(regnum = myRegNum).Limit(10).Open;
Где address, regnum, dataref -- published properties объекта publicip, myRegNum -- просто переменная.
Преимущества:
1) настоящие проверки во время компиляции,
в том числе на соответствие типа параметра и типа поля, наличие выбираемых полей в указанной таблице и т.п.
Интересная идея, нужно обдумать хорошенько.
Приведенный пример представляет собой простой запрос, а как быть с вложенными запросами...
Вот реально взятый очень простой запрос из проекта с функциями объединения, как быть с функциями, переопределением типов...?:
- Код: Выделить всё
sqlToolsAddress.SQL.Text :=
'SELECT DISTINCT '
+'textcat(textcat(textcat(textcat(textcat(textcat('
+'address.adr_street::text, '', ''::text), address.adr_korpus::text), '
+'''/''::text), address.adr_homenum::text), ''/''::text), address.adr_aptnum::text)::varchar(45) AS adr_address '
+'FROM address ORDER BY adr_address;';
Можно, конечно, на уровне паскаля объединять, перебирать, преобразовывать, НО тогда теряется основное достоинство SQL - передавать по сети только то, что необходимо
2) переносимо между различными СУБД
Вот это меня смущает, скорее всего нужно будет иметь разные диалекты.
Недостатки:
1) надо писать
Это не недостаток.
2) другой синтаксис, требует переобучения
Не совсем понял
3) требует перегрузки операций -- не будет работать на старых Дельфях
Старые не надо.
-------
Я уверен, если удастся найти оптимальное решение интеграции SQL в Lazarus, - рейтинг его просто взлетит. Его и так очень интенсивно используют для построения приложений управления базами данных.