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

d

Почему «просто перекомпилировать» — путь к багам

Основное заблуждение, с которым сталкивается каждый второй разработчик: убеждение, что 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 при старте сначала ищет её системным путём, и конфликт версий проявляется непредсказуемо.

Как обновлять без простоя: пошаговая методика

Финальный профессиональный совет

Лучший способ избежать боли при обновлении — полностью отказаться от dbExpress в пользу FireDAC, если ваш проект не привязан жёстко к устаревшему коду. Но если заказчик требует сохранить dbExpress, помните: ни один драйвер dbExpress не соответствует спецификации SQL-92 на 100%, и каждая новая версия Delphi «тихо» исправляет отклонения, которые могут «подвинуть» бизнес-логику. Единственный надёжный ориентир — модульные тесты на данных, приближенных к реальным, с принудительным указанием версии драйвера в конфигурационном файле. И никогда не верьте маркетинговым фразам «полная обратная совместимость» — dbExpress, в отличие от FireDAC, не имеет механизма эмуляции старого поведения.

Добавлено: 27.04.2026