Delphi - 如何对查询结果集进行泛化

时间:2011-10-23 23:56:44

标签: delphi dataset

我正在使用同一个应用程序中的多个数据库。我正在使用两家不同公司的司机。两家公司都有tTable和tQuery Descendants,效果很好。

我需要一种方法来对数据进行泛型访问,无论我使用哪个驱动程序/ 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;

当NORMALLY运行查询时,我会

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

如果我正在调用ListAllTables,那么我的返回类型是什么,以便我可以遍历行?每个tQuery供应商都是不同的,所以我不能使用它(我可以,如果是这样,我想要吗?)我可以构建一个内存表,并将其传回去,但这似乎是ListAllRows构建一个额外的工作内存表,然后将其传递回调用例程,以便它可以“取消构建”,即遍历行...

您有什么想法和建议? 谢谢 GS

4 个答案:

答案 0 :(得分:4)

几乎所有Delphi数据集都来自TDataset,并且最有用的行为是在TDataset上定义的。

因此,如果将每个表或查询分配给TDataset类型的变量,您应该能够以供应商中立的方式对该数据集执行逻辑。

我还将数据集的生成隔离为一组工厂函数,这些函数仅创建特定于供应商的数据集并将其作为TDataset返回。每个工厂功能都在它自己的单元中。然后,只有那些小单位需要了解供应商特定组件。

答案 1 :(得分:2)

  1. 您可以使用IProviderSupport来概括查询执行。我期待,使用的查询支持IProviderSupport。该界面允许设置命令文本,参数,执行命令等。
  2. 使用过的查询的共同点是TDataSet。因此,您需要传递TDataSet参考。
  3. 例如:

    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;
    

答案 2 :(得分:1)

也许您可以考虑使用通用数据访问组件,例如UniDAC或AnyDAC。这允许您仅使用一个组件集以一致的方式访问不同的数据库。

您可能也对RemObjects的DataAbstract感兴趣。功能强大的数据抽象,多层,远程解决方案,具有许多功能。不便宜,但物有所值。

相关链接:

答案 3 :(得分:0)

一种简单的方法是让ListAllTables返回(或填充)一个字符串列表。