Delphi: Невозможно выполнить эту операцию с открытым набором данных

0

Когда я попытался использовать FireDAC FDQuery с базой данных MySQL, я получил следующую ошибку:

Cannot perform this operation on an open dataset.
query.Open(....my connection string to MySQL....); 
try
    query.ExecSql;
finally
    query.Close;

Я заполнил FDQuery, дважды щелкнув значок в форме. Я также подключился к базе данных, чтобы проверить это. Он вернул результаты правильно. Я хотел бы использовать его из кода, но он не работает, поэтому я отладил его. Я всегда добираюсь до точки останова: query.Close;

Теги:
firedac
firemonkey

2 ответа

5

Вы не можете вызывать Open и ExecSQL на одном и том же SQL, потому что они делают разные вещи.

Используйте Open когда запрос вернет набор результатов, что означает SELECT. Используйте ExecSQL когда запрос не возвращает результирующий набор, что означает INSERT, DELETE или UPDATE.

Я не могу сказать вам, какое из них применимо к вашей ситуации, потому что вы не включили свой SQL в свой пост.

0

Я не знаю конкретно о FireDAC, но в целом с такими компонентами базы данных, для запросов, не возвращающих набор результатов, таким образом, подходящих для ExecSQL, вы хотели бы использовать ExecSQL для объекта Connection, в данном случае TFDConnection. (Предположительно, это будет объект Connection, к которому подключен ваш объект FDQuery.) Http://docwiki.embarcadero.com/RADStudio/Rio/en/Executing_Commands_(FireDAC) Очевидно, что в TFDCustomQuery есть метод ExecSQL, но я не знаю, зачем вы это используете, и, как вы обнаружили, он не работает, если запрос уже используется.

  • 0
    Причина, по которой вы захотите использовать ExecSQL в Query, зависит от сложности запроса. Вы можете оказаться в ситуации, когда вы не хотите создавать запрос в своем коде (для передачи в TfdConnection.ExecSQL), у него есть несколько параметров, подвыборов и т. Д. Вместо множества строк кода SQL в Метод Delphi, объект TFDQuery имеет встроенные (особенно когда запрос сам по себе является статическим, но сложным). Просто еще один инструмент, чтобы иметь в наличии.
  • 0
    @JacalarRick Похоже, вы описываете обоснование использования свойства SQL запроса, а не метода ExecSQL.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню