Импорт и экспорт данных через BDE

d

Материалы и спецификации компонент BDE для перемещения данных

Архитектура BDE (Borland Database Engine, версия 5.2, сборка 2026) для импорта/экспорта использует три базовых механизма: TTable.BatchMove, TQuery с прямым SQL и BDE API-функции DbiPutField/DbiGetField. Каждый компонент работает на разном уровне абстракции и налагает строгие требования на форматы полей.

Различия между альтернативными методами: BDE vs dbGo/ADO vs FireDAC

По сравнению с dbGo (ADO), BDE не поддерживает потоковую передачу данных через курсоры типа adOpenForwardOnly. Каждая запись при BatchMove полностью материализуется в памяти — для таблиц объёмом свыше 1 млн строк это приводит к Not-Enough-Memory (код ошибки BDE $2501). FireDAC, напротив, реализует пагинацию через FetchOptions. BDE же оперирует только статическими наборами (tbDirtyRead).

  1. Драйверы: BDE поставляется с драйверами Paradox 7.x, dBase VII, FoxPro 2.6, текстовым ASCII-драйвером, а также шлюзами к SQL Server 6.5 и Oracle 8 (перестали обновляться в 2002). Для импорта через ODBC требуется дополнительный слой SQL Links, который стоит отдельно. В FireDAD все драйверы (SQLite, MySQL, PostgreSQL, InterBase) входят в установку.
  2. Типизация BLOB: в ExportDataSet через BDE все графические поля (BMP, JPEG) при экспорте из Paradox в текстовый файл превращаются в ftOraBlob (не поддерживается), тогда как ADO корректно маппит ftGraphicadLongVarBinary.
  3. Управление транзакциями: BDE поддерживает транзакции только на уровне BDE-соединения (DbiBeginTran/DbiEndTran). При импорте из пяти файлов в одну транзакцию (используя TDatabase.StartTransaction) все операции должны выполняться через один TDatabase. Если BatchMove вложен в цикл, каждый отдельный BatchMove может породить неявный коммит — спецификация гарантирует атомарность только если MovedCount не превышает 2000 записей на одну транзакцию. FireDAD лишён этого ограничения.
  4. Качество кодировок: BDE передаёт строки в кодировке OEM (для Windows это CP-1251, для DOS — CP-866). При импорте из dBase, где хранятся данные в CP-866, BDE не выполняет трансляцию. Результат: 'Привет' становится 'ЏаЁўҐв'. dbGo/ADO автоматически учитывает CodePage в строке подключения (OLEDB:CharacterSet=1251).

Критерии качества при импорте: целостность ссылок, дедупликация, обрезание полей

Качественная реализация импорта через BDE контролируется тремя параметрами: точность типов, полнота записей и соблюдение primary-индексов. Без предварительной валидации BDE не выявляет битые записи в Paradox-файлах (повреждённые индексы).

Производство отказоустойчивого экспорта: спецификации BatchMove в критических сценариях

При экспорте данных из BDE-источника в другую СУБД (через ODBC с DBNetLink) критична производительность: BDE выделяет по 2 кБ на запись вне зависимости от размера записи. Для таблицы из 100 000 строк потребуется около 200 МБ выделенной памяти под кэш. Спецификация TBatchMove.ChunkSize (по умолчанию 1) управляет размером блока записи: значение 20 увеличивает скорость на 40 % (тесты на Delphi 2026 под Windows 11). Однако если ChunkSize > 50, BDE в режиме batCopy перестаёт уведомлять о процессе (OnMoved не вызывается), что нарушает контроль качества загрузки.

Для минимизации потерь данных в производственной среде используется алгоритм двойной вставки:

  1. Флаг-таблица: перед импортом создаётся таблица Control с полем BatchGuid (строковый, 36 символов — GUID). Если BatchMove завершается успешно, все записи помечаются этим GUID. При сбое (исключение BDE) поиск по GUID позволяет откатить изменения через DELETE.
  2. Разделение на чанки: исходная таблица разбивается по первичному ключу на сегменты по 5000 записей. Для каждого сегмента запускается отдельный BatchMove с Catch-блоком. Если один сегмент упал (ошибка целостности), остальные остаются импортированными — это соответствует уровню качества 'atomic per segment'.
  3. Валидация после переноса: выполняется SELECT COUNT(*) FROM Source INNER JOIN Dest ON Source.PK = Dest.PK с проверкой кардинальности. BDE-запросы к внешним СУБД (через ODBC) выполняют только внешнее соединение через DBI_OPEN_QUERY — количественная проверка занимает до 3 секунд на 100 000 строк (на процессоре Intel i5-12400).

Стандарты качества для такого экспорта: 99.98 % соответствия записей после BatchMove (допустимая потеря — 2 записи на 10 000 при повреждении индекса Paradox). Превышение этого порога требует перестроения .PX файлов через DbiRegenIndexes.

Добавлено: 27.04.2026