Компонент TFDQuery

Компонент TFDQuery: универсальный инструмент для манипуляции данными
TFDQuery — это центральный элемент библиотеки FireDAC, предназначенный для выполнения SQL-инструкций и управления наборами записей. Он объединяет возможности прямого выполнения запросов (как TFDCommand) и работы с таблицами (как TFDTable), предоставляя при этом полный контроль над извлечением, вставкой и модификацией информации. В 2026 году этот компонент остаётся стандартом де-факто для большинства проектов, где требуется гибкость и производительность при взаимодействии с СУБД.
Кому подходит TFDQuery: сегменты пользователей и их задачи
Выбор TFDQuery зависит от профиля разработчика и специфики приложения. Ниже — основные категории специалистов, их цели и критерии принятия решения.
- Начинающие разработчики и энтузиасты Delphi:
Цель — быстро создать рабочее приложение для учебных или личных проектов (например, учёт расходов, каталогизация). Критерий — простота настройки: достаточно указать Connection, написать SQL-строку и привязать к визуальным компонентам. TFDQuery идеален, так как не требует глубокого знания драйверов или тонкой настройки кеширования. Выбор: однозначно TFDQuery. - Разработчики корпоративных решений (управленческий учёт, ERP-системы, логистика):
Цель — стабильность, поддержка сложных SQL-конструкций (подзапросы, оконные функции, пакеты) и работа с разными СУБД (PostgreSQL, SQL Server, Oracle). Критерий — возможность переключать драйвер без изменения кода при минимальном рефакторинге. TFDQuery поддерживает макросы, подменяющие диалект SQL, а также автоматическую адаптацию типов полей. Выбор: TFDQuery с использованием параметризованных запросов и FireDAC-маппера для переносимости. - Специалисты по миграции с BDE/DBX на FireDAC:
Цель — перенести устаревшие проекты на современную платформу без потери функциональности. Критерий — совместимость с существующим кодом (события AfterOpen, BeforeClose, CalcFields). TFDQuery имеет схожие события и свойства (например, FetchOptions, RowsetSize), что упрощает адаптацию. Выбор: TFDQuery как замена TQuery/TSQLQuery. - Разработчики мобильных и встраиваемых решений (InterBase ToGo, SQLite, Firebird Embedded):
Цель — минимизировать нагрузку на устройство и обеспечить локальное кеширование. Критерий — возможность работы в автономном режиме с бинарными BLOB-данными. TFDQuery позволяет гибко настраивать режим загрузки (Cache или FetchAll) и поддерживает транзакции на уровне одного компонента. Выбор: TFDQuery с параметром CachedUpdates = True для локального редактирования с отложенной синхронизацией.
Критерии выбора между TFDQuery и похожими компонентами
Хотя TFDQuery универсален, в некоторых сценариях его аналоги могут оказаться более рациональным решением. Рассмотрим ключевые различия:
- TFDQuery vs TFDCommand: TFDCommand оптимизирован для разового выполнения (DDL, хранимые процедуры без возврата строк). Если вам не нужен результирующий набор — выбирайте TFDCommand. TFDQuery тратит немного больше памяти на поддержку курсора.
- TFDQuery vs TFDTable: TFDTable автоматически генерирует SELECT * FROM [Table] и подходит для работы с одной таблицей. Если вы используете JOIN, агрегатные функции или WHERE-фильтры — обязателен TFDQuery.
- TFDQuery vs TFDStoredProc: Для вызова процедур с возвращаемым набором строк TFDStoredProc упрощает управление параметрами. TFDQuery тоже может вызывать процедуры, но требует ручного описания параметров.
Практический пример: TFDQuery в действии (2026)
Рассмотрим классический сценарий — получение списка заказов с суммой по клиенту. Используем TFDQuery с параметризацией для защиты от SQL-инъекций.
Разметка компонента на форме:
- FDConnection1 — подключение к PostgreSQL (свойства: DriverID = PG, Server, Database, UserName, Password).
- FDQuery1 — SQL-запрос с плейсхолдером :ClientID.
- DataSource1 — связывает FDQuery1 с визуальной сеткой DBGrid.
Код установки запроса (OnCreate главной формы):
FDQuery1.SQL.Text := 'SELECT o.OrderID, o.OrderDate, SUM(ol.Quantity * ol.Price) AS Total ' + 'FROM Orders o ' + 'JOIN OrderLines ol ON o.OrderID = ol.OrderID ' + 'WHERE o.ClientID = :ClientID ' + 'GROUP BY o.OrderID, o.OrderDate ' + 'ORDER BY o.OrderDate DESC';
FDQuery1.Params.ParamByName('ClientID').AsInteger := 101; // ID клиента для фильтрации
FDQuery1.Open;Результат отображается в DBGrid. При изменении параметра вызывается Close + Open для обновления данных. Для повышения производительности в FireDAC 2026 года можно включить FetchOptions.CursorKind = ckDynamic для реального времени.
Заключение: почему TFDQuery остаётся выбором №1
Компонент TFDQuery закрывает 90% задач по работе с реляционными БД в Delphi. Он одинаково эффективен как в небольших утилитах, так и в тяжёлых многослойных решениях. Главные преимущества — переносимость между СУБД, богатый набор опций (FetchOptions, Filter, Aggregates) и отличная интеграция с IDE. Для проектов, где важна гибкость запросов и контроль над курсором, TFDQuery — осознанный и сбалансированный выбор.
Добавлено: 27.04.2026
