Delphi - Как обобщить набор результатов запроса - PullRequest
2 голосов
/ 24 октября 2011

Я работаю с несколькими базами данных в одном приложении.Я использую драйверы от двух разных компаний.В обеих компаниях есть потомки tTable и tQuery, которые хорошо работают.

Мне нужен способ иметь общий доступ к данным, независимо от того, какой компонент driver / tQuery я использую для возврата набора данных.Эти данные НЕ будут привязаны к компонентам, просто к моей логике.

Например ... (псевдокод) Давайте создадим функцию, которая может работать с любым компонентом tQuery

function ListAllTables(NameOfDatabase : String) :ReturnSet??
begin

If NameOfDataBase = 'X' then use tQuery(Vendor 1)
    else use tQuery(Vendor 2)
RunQuery;
Return Answer...
end;

Когда работает НОРМАЛЬНОзапрос, я делаю

Query.Open;
While not Query.EOF do
   begin
   Read my rows..
   next;
end;

Если я вызываю ListAllTables, какой мой тип возврата, чтобы я мог перебирать строки?Каждый поставщик tQuery отличается от других, поэтому я не могу его использовать (могу ли я, и если да, хотел бы я?), То мог бы создать таблицу памяти и передать ее обратно, но для ListAllRows это кажется дополнительной работой по созданиютаблицы памяти, а затем передать ее обратно в вызывающую подпрограмму, чтобы она могла «не строить», то есть перебирать строки ...

Каковы ваши идеи и предложения?Спасибо GS

Ответы [ 4 ]

4 голосов
/ 24 октября 2011

Почти все наборы данных Delphi происходят от TDataset, и наиболее полезное поведение определяется в TDataset.

Следовательно, если вы присваиваете каждой таблице или запросу переменную типа TDataset, вы должны иметь возможность выполнять свою логику для этого набора данных независимо от поставщика.преобразование наборов данных в набор фабричных функций, которые только создают набор данных для конкретного поставщика и возвращают его как набор данных TDat.Каждая фабричная функция идет в своем собственном модуле.Тогда только те небольшие устройства должны иметь какие-либо знания о конкретных компонентах поставщика.

2 голосов
/ 24 октября 2011
  1. Вы можете использовать IProviderSupport для обобщения выполнения запроса.Я ожидаю, что используемые запросы поддерживают IProviderSupport.Этот интерфейс позволяет задавать текст команды, параметры, выполнять команды и т. Д.
  2. Общий знаменатель для используемых запросов - TDataSet.Итак, вам нужно будет передать ссылку на TDataSet.

Например:

var
  oDS: TDataSet;
...
if NameOfDataBase = 'X' then
  oDS := T1Query.Create(nil)
else
  oDS := T2Query.Create(nil);
(oDS as IProviderSupport).PSSetCommandText('select * from mytab');
oDS.Open;
while not oDS.Eof do begin
  //
  oDS.Next;
end;
1 голос
/ 24 октября 2011

Возможно, вы могли бы рассмотреть универсальный компонент доступа к данным, такой как UniDAC или AnyDAC. Это позволяет использовать только один набор компонентов для согласованного доступа к различным базам данных.

Возможно, вас также заинтересует DataAbstract от RemObjects. Мощная абстракция данных, многоуровневое решение для удаленного взаимодействия со множеством функций. Не недорого, но отличное соотношение цены и качества.

Соответствующие ссылки:

0 голосов
/ 24 октября 2011

Простой подход состоит в том, чтобы ListAllTables возвращал (или заполнял) список строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...