我正在使用同一个应用程序中的多个数据库。我正在使用两家不同公司的司机。两家公司都有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
答案 0 :(得分:4)
几乎所有Delphi数据集都来自TDataset,并且最有用的行为是在TDataset上定义的。
因此,如果将每个表或查询分配给TDataset类型的变量,您应该能够以供应商中立的方式对该数据集执行逻辑。
我还将数据集的生成隔离为一组工厂函数,这些函数仅创建特定于供应商的数据集并将其作为TDataset返回。每个工厂功能都在它自己的单元中。然后,只有那些小单位需要了解供应商特定组件。
答案 1 :(得分:2)
例如:
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返回(或填充)一个字符串列表。