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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2019, 13:12   #1
Rav
Новичок
Джуниор
 
Регистрация: 31.10.2007
Сообщений: 2
Вопрос [FireDAC][MySQL] Commands out of sync после вызова CALL stored_proc (....)

Добрый день!

Задача: нужно выполнить произвольную StoredProc в базе данных. Название и параметры заранее не известны. Я просто вызываю SQL-код типа: "CALL StoredProc (бла-бла-бла)".

Раньше пользовался много лет ADOConnection (для MySQL приходилось использовать ODBC), используя примитивную функцию:
Код:
var
  adoQuery: TADOQuery;
begin
  adoQuery := TADOQuery.Create(aConn);
  try
    adoQuery.SQL.Clear;
    adoQuery.SQL.Add('CALL StoredProc (бла-бла-бла)');
    adoQuery.ExecSQL;
  finally
    FreeAndNil(adoQuery);
  end;
и все отлично работало. Без каких-либо проблем.

Теперь понадобилось использовать FireDAC.

Код:
var
  fdQuery: TFDQuery;
begin
  fdQuery := TFDQuery.Create(nil);
  try
    fdQuery.Connection := fdDb;
    fdQuery.ExecSQL('CALL StoredProc (бла-бла-бла)');
  finally
    fdDataSetFree(fdQuery);
  end;
Первый такой вызов SQL проходит успешно. Но любой другой SQL-запрос, даже если никак не связан с StoredProc (например простой insert) выдают ошибку

EMySQLNativeException "[FireDAC][Phys][MySQL] Commands out of sync; you can't run this command now"

Что не так? FetachAll после ExecSQL делать пробовал - не помогло
Rav вне форума Ответить с цитированием
Старый 27.12.2019, 08:33   #2
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Можете почитать тут:https://habr.com/ru/post/21326/
И в качестве бреда можете попробовать вызвать процедуру через TFDStoredProc, но для этого придется перед вызовом FDStoredProc.ExecProc('Имя порцедуры',[параметры]), все таки знать имя и параметры.
В целом вы тут fdQuery.ExecSQL('CALL StoredProc (бла-бла-бла)'); их и передаете по факту. Если у вас необходимость вызова нескольких процедур, то можете организовать их либо последовательным вызовом из кода либо вызовом отдельной процедуры которую вызовите через FDStoredProc.ExecProc('Процедура для процедур',[ключевые параметры])
Пишу много и развернуто

Последний раз редактировалось Heneken87; 27.12.2019 в 09:05.
Heneken87 вне форума Ответить с цитированием
Старый 18.01.2020, 21:26   #3
Rav
Новичок
Джуниор
 
Регистрация: 31.10.2007
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
И в качестве бреда можете попробовать вызвать процедуру через TFDStoredProc
Ну я в общем-то так и реализовал, работает. Просто получилось не "изящно" (хотя это вопрос спорный, понимаю), зато работает надежно.
Rav вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MySql, Delphi 10.3 Rio, FireDAC. Селективная процедура с курсором sappan БД в Delphi 0 01.04.2019 20:48
MySQL + FireDAC. Данные уходят в БД только при закрытии соединения Hamster2008 БД в Delphi 0 18.03.2019 08:17
Возвращение значений массива, после рекурсионного вызова Весбат Помощь студентам 4 11.12.2014 16:38
Commands out of sync; you can't run this command now tocsik SQL, базы данных 8 13.08.2014 20:07
Не выполняется код после вызова другой процедуры... sorockinalex Общие вопросы Delphi 3 09.09.2012 18:24