DBExpress – не выполняет скрипт SQL из нескольких инструкций…

Проблема

Сегодня экспериментировал с DBExpress, многие в сети ругают данную технологию из-за однонаправленных курсоров, в частности. То есть, обойти это можно, использовав кэширующие компоненты TClientDataSet и TSimpleDataSet – в принципе, для большинства задач годится.

Но вот что мне откровенно не понравилось – невозможность выполнять скрипты SQL из нескольких инструкций. Ни TSQLQuery, ни TSQLConnection никак не хотели выполнять инструкции, если их было больше 1 штуки ((( Ошибка была примерно следующей, на примере создания таблиц в БД…

1

 

Итак, что я сделал – в программе Worbench оттестировал и  выгрузил рабочий скрипт для создания БД и таблиц в БД. Если всё запускать из консоли MySQL.exe – всё прекрасно работает. Если тот же самый скрипт отдать компонентам Delphi TSQLQuery или TSQLConnection как тут же вылезает эта ошибка…

Оказывается, в технологии DBExpress нельзя вот так просто скормить скрипт целиком компонентам…((( TSQLQuery, ни TSQLConnection и др. понимают только единичные sql инструкции, то есть только до символа delimiter, по умолчанию при установке он равняется точке с запятой.

Решение

Разминки ради, я решил обойти эту ошибку, создав код, который будет “скармливать” компонентам Delphi эти инструкции по 1, но, согласитесь, это крайне неудобно )))

Алгоритм такой…

-Создать скрипт (в workbench или ручками…);

-Сохранить его в текстовом файле

-Поставить свой разделитель (или не ставить – в конце я привожу улучшенный код, этот шаг можно пропустить)

-Прочитать скрипт с помощью кода, указанного в данном посте ниже

Итак, для простоты сохраним скрипт в txt файле…, предварительно расставив между инструкциями какой-нибудь знак разделитель, типа правой фигурной скобки… “}”

Что касается Delphi, то внутри процедуры FormCreate, я создал такой код…(это отрывок кода… для иллюстрации идеи…)

Проверяем работу программы

2Всё на месте!!!

В Delphi, я оформил всё следующим образом…

3

 

Улучшенное решение

Чтобы не мудрить с вставкой своего разделителя, я оптимизировал код под разделитель -точка с запятой, потому что он стандартный в mysql, теперь не нужно в текстовом файле проставлять свои разделители… получилось так…


 

This entry was posted in Delphi, Без рубрики. Bookmark the permalink.