Delphi - 使用不同的TTable和TQuery作为一个对象

时间:2011-11-15 00:42:16

标签: delphi delphi-2010 indirection tquery

Delphi 2010,Win7 - 64

我正在编写一个涉及连接到不同数据库的应用程序。我使用两个不同的供应商进行数据库访问我使用DA-Soft的AnyDAC,它允许我连接到“工业”数据库,Oracle,SQL Server等,我使用ComponentAce的ABS数据库,这是一个基于PC的小型SQL数据库。 (顺便说一下,我强烈推荐)。我的问题是我需要编写一系列通用例程,这些例程可能会违反供应商组件。

这两个组件都有TTable和TQuery组件。我需要编写一组例程,其中一些是基于TTable的,有些是基于TQuery的。这些例程可能违反供应商组件。

作为一个例子,我需要能够遍历TTable中的所有行。我第一次运行例程时,需要使用DA-Soft的TTable。下次我运行它时,我需要它来运行Component Ace的TTable。 TQuery也存在相同的情况。

我需要一层抽象 - 至少我认为我做了。我不想多次编写每个例程。建议提供这层abstration /间接的方法。我并不过分关注快速致盲。请记住 - 更简单更好,我不是专业程序员....

任何想法都赞赏。 谢谢大家。

2 个答案:

答案 0 :(得分:10)

我假设他们都是TDataSet的后代。

在最简单的情况下,您可以编写您只需要TDataSet参数的例程。您可以访问TDataSet.Next和FieldByName。这将涵盖相当多的案例。

如果您的例程需要为每个TDataSet类型调用一些不同的代码,那么您最好的选择是使用接口并创建每种类型的自定义后代

IMyDataSetOperations = interface 
  procedure OpenSpecial;
  function GetDataSet: TDataSet;
end;

TMyAnyDacTable = class(TAnyDacTable, IMyDataSetOperations)
  procedure OpenSpecial;
  function GetDataSet: TDataSet;
end;

TMyComponentAceTable = class(TComponentAceTable, IMyDataSetOperations)
  procedure OpenSpecial;
  function GetDataSet: TDataSet;
end;

procedure TMyAnyDacTable.OpenSpecial
begin
  // code specific for AnyDAC dataset
end;

function TMyAnyDacTable.GetDataSet: TDataSet;
begin
  result := self;
end;

然后,您可以使用IMyDataSetOperations接口

编写例程
function CalculateAverage(const AMyDataSet: IMyDataSetOperations): Currency;
var
  total: Currency;
  i: Count;
begin
  AMyDataSet.OpenSpecial;
  i := 0;
  total := 0;
  AMyDataSet.GetDataSet.First;
  while not AMyDataSet.GetDataSet.Eof do
  begin
    total := total + AMyDataSet.GetDataSet.FieldByName('Amount').AsCurrency;
    Inc(i);  
    AMyDataSet.GetDataSet.Next;
  end

  if i > 0 then
    result := total / i
  else
    result := 0;
end

答案 1 :(得分:1)

我建议你使用Object Persistence Framework。我认为Instant Object是一个很好的OPF。现在我正在使用它。通过使用OPF,我们的应用程序将独立于DBMS,我们不需要多次为每个例程创建例程。