use*_*073 1 delphi tquery indirection delphi-2010
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 /间接的方法.我并不过分关注快速致盲.请记住 - 更简单更好,我不是一个专业的程序员....
任何想法都赞赏.感谢大家.
Cli*_*ood 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;
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |