Обновление версий dbExpress

Почему «просто перекомпилировать» — путь к багам
Основное заблуждение, с которым сталкивается каждый второй разработчик: убеждение, что dbExpress — это статичная библиотека, которую достаточно перелинковать с новой версией Delphi. На практике внутренний протокол между TSQLConnection и драйвером (особенно в версиях до Delphi 2010 и после) претерпевал изменения, несовместимые на уровне бинарных интерфейсов. Если вы берёте старый dbexp*.dll (или .so) и подключаете его к новой среде — ваше приложение может упасть с EDBEngineError или, что опаснее, молча перепутать кодировки строк. Опытные специалисты всегда проверяют не только версию Delphi, но и точную минорную версию MIDAS.dll (Datasnap), так как dbExpress завязан на её внутренние структуры. Настоятельно рекомендую: при переходе с XE7 на 10.x или с 10.x на 11/12 обязательно получайте свежий пакет драйвера из папки redist новой поставки — никакой самостоятельной «доводки» старых бинарников.
Ловушка строковых типов и Unicode
Многие до сих пор считают, что dbExpress «сам разрулит» кодировку, потому что он основан на массивах байтов. Это опасное упрощение. Начиная с Delphi 2009, весь dbExpress перешёл на UnicodeString, но старые базы (Interbase 5, Oracle 8) или некоторые ODBC-прокладки могут возвращать ANSI-строки без объявленной кодовой страницы. Типичная ошибка: обновляете dbExpress-проект, подключаетесь к старой Firebird 1.5 — и вдруг половина русских букв превращается в вопросительные знаки. Совет эксперта: перед тем как обновлять, встройте обработчик OnGetCharset (если его нет в вашей версии — обновляйте драйвер до актуального) и принудительно укажите WIN1251 для старых источников. Никогда не полагайтесь на автоопределение — ни один dbExpress-драйвер не поднимает кодовую страницу сервера корректно из-за бага согласования ICU-таблиц.
Секрет производительности: не используйте стандартный TSQLMonitor
Распространённая рекомендация в старых блогах — включать TSQLMonitor для отладки и оставлять его в релизе «на всякий случай». Профессионалы знают: стандартный монитор dbExpress перехватывает пакеты на низком уровне, что приводит к двукратному росту нагрузки на соединение при большом количестве коротких запросов. Кроме того, при обновлении версии драйвера формат лога OnTrace может измениться, и ваш обработчик, парсящий строки как AnsiString, начнёт падать с Access Violation. Вместо этого используйте профилировщик самого СУБД (например, Firebird Audit или SQL Server Profiler), а dbExpress-монитор подключайте только для точечной отладки конкретного метода с обязательной фиксацией версии драйвера в комментарии кода.
Неочевидная зависимость от BDE и ODBC
Третий подводный камень — иллюзия того, что dbExpress полностью самодостаточен. На практике, особенно при работе с Oracle или IBM DB2 через драйверы dbexpora.dll или dbexpdb2.dll, dbExpress является обёрткой над нативным клиентом (OCI, DB2 CLI). При обновлении Delphi эти DLL драйверов сохраняются в system32, но более новые версии dbExpress начинают требовать определённую минорную версию клиента. В Delphi 11.3, например, прекратилась поддержка Oracle Instant Client 11 — перестал работать пул соединений. Совет: перед обновлением всего стенда обновите сначала клиентскую библиотеку (OCI, DB2, Firebird fbclient.dll) до версии, указанной в release notes вашего выпуска Delphi. И никогда не храните клиентскую библиотеку в папке с exe — dbExpress при старте сначала ищет её системным путём, и конфликт версий проявляется непредсказуемо.
Как обновлять без простоя: пошаговая методика
- Изоляция драйверов. Создайте отдельную папку
drivers\[версия Delphi]и явно пропишите путь в реестреHKEY_CURRENT_USER\Software\Embarcadero\dbExpress\Directories. Никогда не используйте глобальный каталог — это сломает другие проекты на старых версиях. - Тест на регресс кодировок. Напишите скрипт, который вставляет все кириллические символы ('А'-'Я', 'а'-'я', 'Ёё') в каждое текстовое поле и читает их обратно. Запускайте до и после обновления — расхождения в один байт укажут на несовместимость в уровне TClientDataSet+dbExpress.
- Ручная чистка кэша метаданных. При обновлении драйвера сбрасывайте внутренний кэш параметров курсоров, выполнив
TSQLConnection.Closeи очистив наборGetTableNames. Оставленный кэш — причина «висящих» провайдеров в Datasnap. - Проверка транзакций. dbExpress в XE и 10.3 по-разному обрабатывает сохранение Savepoint — неявный Rollback может не откатывать до нужной точки. Обязательно прогоните юнит-тест с вложенными транзакциями.
Финальный профессиональный совет
Лучший способ избежать боли при обновлении — полностью отказаться от dbExpress в пользу FireDAC, если ваш проект не привязан жёстко к устаревшему коду. Но если заказчик требует сохранить dbExpress, помните: ни один драйвер dbExpress не соответствует спецификации SQL-92 на 100%, и каждая новая версия Delphi «тихо» исправляет отклонения, которые могут «подвинуть» бизнес-логику. Единственный надёжный ориентир — модульные тесты на данных, приближенных к реальным, с принудительным указанием версии драйвера в конфигурационном файле. И никогда не верьте маркетинговым фразам «полная обратная совместимость» — dbExpress, в отличие от FireDAC, не имеет механизма эмуляции старого поведения.
Добавлено: 27.04.2026
