Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 14.12.2019, 14: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, 09:33   #2
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 200
По умолчанию

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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MySql, Delphi 10.3 Rio, FireDAC. Селективная процедура с курсором sappan БД в Delphi 0 01.04.2019 21:48
MySQL + FireDAC. Данные уходят в БД только при закрытии соединения Hamster2008 БД в Delphi 0 18.03.2019 09:17
Возвращение значений массива, после рекурсионного вызова Весбат Помощь студентам 4 11.12.2014 17: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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS