Эффективный доступ к различным СУБД из Delphi XE2

мой должен

я работаю с Delphi / C++Builder XE2.

мне нужно получить доступ хотя бы к этим DBMSs:

  • Жар
  • DB2 / 400
  • SQL Server
  • SAP HANA (новая БД в памяти, доступные интерфейсы: JDBC, ODBC, ODBO, SQLDBC)

мне нужно показать и отредактировать данные в визуальных элементах управления с учетом данных. данные могут находиться на любой из этих СУБД, я настройте свойства соединения и инструкции SQL во внешнем текстовом файле.

так я ищу набор компонентов для доступа к базам данных который поддерживает такие DBMSs и имеет хорошие спектакли, подобно старым таблицам парадоксов.

мои догадки

  1. использование производительности ODBC будет хуже, чем использование собственных драйверов. Если это правда, то как я могу преодолеть эту проблему?
  2. даже через ODBC, выступления для ханы в памяти DB будет большим (я не могу проверить его сейчас).

то, что я нашел до сих пор

  • BDE (Borland Database Engine) (TDatabase, TTable...)

    устаревшие.

  • DBX (Embarcadero dbExpress) (TSQLConnection, TSQLTable...)

    заменяет BDE, однонаправленные наборы данных (курсор идет только вперед; не буферизует данные в память, такой набор данных не может быть отображен в DBGrid; для построения пользовательского интерфейса с помощью dbExpress вам нужно будет использовать еще два компонента:TDataSetProvider и TClientDataSet)

    использует собственные драйверы (нет для HANA) или ODBC.

  • FireDAC для (Компоненты Доступа К Данным Embarcadero Fire) (TADConnection, TADTable...)

    это продолжение AnyDAC; использует собственные драйверы (нет для HANA) или ODBC или dbExpress.

  • Юнидак (Devart Универсальные Компоненты Доступа К Данным)

    не бесплатно; использует собственные драйверы (нет для HANA) или ODBC или "DB Client".

  • DA (RemObjects Сведения Аннотация для Delphi)

    не бесплатно.

  • ZDBC (Интерфейс Подключения К Базе Данных Zeos) (TZConnection, TZQuery...)

    С открытым исходным кодом; запускается как порт JDBC для объекта Pascal; не обеспечивает привязку с визуальными элементами управления с учетом данных.

  • dbGo (Embarcadero dbGo) (TADOConnection, TADOTable...)

    реализует ADO (следовательно, через OLE DB через ODBC). Имеет ряд причуд, например, с повторением одноименных параметров в запросах.

  • СП БДЭ (TJvQuery, TJvBDESQLScript...)

    повышение корреспондентской стандартной библиотеки.

  • Доступ К Данным Jv (TJvADODataset, TJvADOQuery...)

    повышение корреспондентской стандартной библиотеки.

(не стесняйтесь расширять этот список)

так что мой выбор среди:

  • dbExpress или FireDAC: куда пойдет Embarcadero в будущее?
  • dbGo: это ADO хороший выбор? Кажется, что он полагается на ODBC, так как насчет производительности?
  • коммерческий продукт, такой как UniDAC или Аннотация данных: это необходимо? Может, так будет лучше?

5 ответов


Если вы используете XE2, я бы рекомендовал dbExpress.

  • он поддерживает ODBC (но не для SAP HANA)
  • однонаправленные наборы данных могут использоваться с ClientDataSet для кэширования. Фактически, ClientDataSets можно использовать для кэширования любого компонента dataset.

Если вы используете XE3 или более позднюю версию, я бы рекомендовал FireDAC.

  • Embarcadero купил AnyDAC и переименовал его в FireDAC.
  • Он входит в состав предприятия SKU и выше. Бесплатная загрузка доступна для лицензированных пользователей XE3.
  • Я считаю, что это будет их стратегии доступа к данным в будущем. См.это недавнее сообщение в блоге.

Я понимаю, что FireDAC можно использовать с XE2, но я не уверен, есть ли какие-либо проблемы.


я решил провести небольшое исследование производительности: UniDAC (5.0.1) vs FireDAC (8.0.1), на Delphi XE3. Базы данных: Firebird, MySQL и SQL Server.

вот результаты выборки записей 150k (использование памяти рассматривалось как разница между до и после выборки).

Жар-птица:

CREATE TABLE TEST_PERF (
    ID  INTEGER PRIMARY KEY,
    VC  VARCHAR(200),
    NM  NUMERIC(18,2),
    DT  TIMESTAMP
)

UniDAC-0,909 секунды, съел 12 324 044 памяти

FireDAC-0,967 секунды, съел 282 179 668 памяти (я в шоке)

MySQL:

CREATE TABLE TEST_PERF (
    ID  INTEGER PRIMARY KEY,
    VC  VARCHAR(200),
    NM  NUMERIC(18,2),
    DT  DATETIME
)

UniDAC-0,363 секунды и 11 552 604 памяти

FireDAC-0,713 секунды и 49 375 108 памяти

SQL Server:

CREATE TABLE TEST_PERF (
    ID  INTEGER PRIMARY KEY,
    VC  VARCHAR(200),
    NM  NUMERIC(18,2),
    DT  DATETIME
)

UniDAC-0,391 секунды и 14 155 576 памяти

FireDAC-0,324 секунды и 51 775 844 памяти

все измеряется просто:

function MemoryUsed: Cardinal;
var
  st: TMemoryManagerState;
  sb: TSmallBlockTypeState;
begin
  GetMemoryManagerState(st);
  Result := st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize;
  for sb in st.SmallBlockTypeStates do
    Result := Result + sb.UseableBlockSize * sb.AllocatedBlockCount;
end;

  UniQuery1.SQL.Text := 'select * from test_perf';
  UniQuery1.SpecificOptions.Values['FetchAll'] := 'True';
  mem := MemoryUsed;
  tc := Now;
  UniQuery1.Open;
  UniQuery1.Last;
  tc := Now - tc;
  mem := MemoryUsed - mem;
  Memo1.Lines.Add('UniDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));

  ADQuery1.SQL.Text := 'select * from test_perf';
  ADQuery1.FetchOptions.Mode := fmAll;
  mem := MemoryUsed;
  tc := Now;
  ADQuery1.Open;
  ADQuery1.Last;
  tc := Now - tc;
  mem := MemoryUsed - mem;
  Memo1.Lines.Add('FireDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));

если кто-то заинтересован, вот это тест приложения, вы можете добавить там сравнение производительности для ADO, dbExpress, ZeosLib и других, которые вас интересуют.


Я всегда использовать ADO-используется с SQLServer, Oracle, Sybase, PostGreSQL и другими. Вы можете найти поставщика ADO практически для любой базы данных. Никогда не было проблемы, которую я не мог решить с помощью небольшого исследования. Поскольку ADO так широко используется, большинство проблем хорошо известны. И UDL файлы могут сделать вашу жизнь намного проще.

но я никогда не использую компоненты Delphi ADO на палитре компонентов - либо я использую их в памяти, либо чаще сбрасываю результаты из ADO вызывает непосредственно в TKBMMemtable и полностью избегает Delphi "из коробки". Вы можете написать функцию утилиты, которая сделает это автоматически для вас.


Firedac-поставляется с Delphi, поэтому, вероятно, вам все равно придется заплатить за это. UNidac-быстрее, и пусть Вам не придется обновлять Delphi так часто,для того,чтобы обновить данные Acess, также если вы однажды решите пойти в Lazzarus, Вы тоже сэкономите много работы.


есть много неправильных представлений во многих потоках, поэтому я попытаюсь дать мои 2 цента. Проблема в том, что мы, дельфийцы, привыкли думать в executables, поэтому мы ищем способы перемещения данных (особенно когда наша база данных и сервер приложений размещены снаружи); эти сценарии никогда не будут бить RIA приложение, потому что вы больше не перемещаете данные,а просто представление экрана. Другое заблуждение говорит, что TDATASET не работает с AJAX. Просто посмотрите некоторые UNIGUI примеры youtube. Кстати, я использую обычный DataSnap С clientdataset, а не ОРМ.