Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2015, 14:17   #1
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию TSQLScript и экранировка ':'

Задача

на удаленном сервере Firebird БД(без прямого доступа) и возможности использовать какую-либо IBExpert.
с помощью TSQLScript или любого другого компонента надо
создать (пересоздать) ХП в которой есть ну скажем
Код:
select id from tx where f= :f  into :n 
т.е. какие-то параметры которые будут использоваться на на сервере при выполнении данной ХП.

Так вот SQLScript "упорно" cчитает это "своими личными" параметрами и пытается их подставить (а их нет).
КАК объяснить что это НЕ ЕГО параметр, и надо передать серверу все "КАК ЕСТЬ"

P.S. Даже если попытаться задать ИМ значения
Код:
ParamByName('f').AsString =':f';
все равно получаем не то что надо.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 01.12.2015, 15:02   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

execute statement там есть какой?
come-on вне форума Ответить с цитированием
Старый 01.12.2015, 15:42   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А удвоенное :: ест?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.12.2015, 09:25   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

ларчик открывается просто.
Код:
SQLQueryX.ParamCheck:=false; // и теперь НЕТ никаких параметров
SQLQueryX.Text:='create procedure ....';
вот только нельзя здесь пихать несколько команд.

ТЕПЕРЬ возникает вопрос как поправить генофонд? никогда ранее таким не занимался
Добавить указанную выше строку paramcheck:=false; поскольку для работы TSQLScript использует свой внутренний SQLQuery( private и доступа к нему извне даже у наследника нет) но увы без этой строки.

Для быстрого решения проблемы есть и другой вариант (перекрыть один метод и использовать свой SQLQuery).
Этим и займусь, но хотелось бы все-таки исправить исходник.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 02.12.2015, 13:42   #5
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

еще раз спрошу, не проще ли #2?
come-on вне форума Ответить с цитированием
Старый 02.12.2015, 14:08   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
еще раз спрошу, не проще ли #2?
Там(FireBird) есть только EXECUTE BLOCK (выполнение блока команд, НО НЕ выполнение команд(-ы) записанной в переменную).
теперь (после Paramcheck) если хочется выполнить блок команд, то можно и так.
Код:
Q.ParamCheck:=false;
Q.SQL.Text:='EXECUTE BLOCK 
   BEGIN
   <наш блок команд включающий что угодно>
  END';
Но лично мне приятнее выполнять команды по одной, но загружая их оптом из файла.
Код:
SQLScript.Script.LoadFromFile(...);//один раз загрузили тот же блок но без EXECUTE (тем более что он(этот блок) уже ЕСТЬ и в нужном формате)
SQLScript.Execute;//и выполнили по очереди.
Перегрузка одного метода и пять строк кода в этом методе это позволяют.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.12.2015 в 14:12.
evg_m на форуме Ответить с цитированием
Старый 02.12.2015, 15:34   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

http://www.firebirdsql.org/refdocs/l...-execstat.html
Это разве не оно?
come-on вне форума Ответить с цитированием
Старый 02.12.2015, 16:05   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Да видимо оно, НО опять же ....
чтобы выполнить это "из клиента" (SQLQuery и т.п.) его надо будет "завернуть" в уже упомянутый EXECUTE BLOCK + выполнить перекодировку имеющегося файла обновлений чтобы получить нечто вроде
Код:
EXECUTE BLOCK 
delcare sql varchar(10000)
BEGIN
  sql =.......  ||ASCII_CHAR(58)||'f into '||ASCII_CHAR(58)||'n'  /*:f into :n */
           .......
 EXECUTE STATMENT sql;
END;
выполнимо конечно и легко, но вариант решения исходной проблемы УЖЕ найден(см. выше) и без написания кода по "перекодированию" имеющегося файла обновления.

P.S. мне тоже казалось что такое (EXECUTE STATEMENT) должно было быть, но увы моя "offline справка" про него не знала , хотя и
Цитата:
(Охватывает Firebird до версии 2.5.3 включительно)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.12.2015 в 16:12.
evg_m на форуме Ответить с цитированием
Старый 02.12.2015, 16:08   #9
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

А тупо создать хранимую процедуру и вызывать ее нельзя?
т.е. сначала сделаете так, а потом просто вызываете ту что создали, с параметром.
come-on вне форума Ответить с цитированием
Старый 02.12.2015, 16:14   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

к тому что зачем держать в проге ненужный код, а потом не дай бог еще его поддерживай, в то время когда все есть готовое...
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск