2011-11-15 30 views
1

德爾福2010年,Win7的 - 64德爾福 - 使用不同的TTable的TQuery和作爲一個對象

我寫這涉及連接到不同的數據庫應用程序。我使用兩個不同的供應商來訪問數據庫。我使用DA-Soft的AnyDAC,它允許我連接到「工業」數據庫,Oracle,SQL Server等,並使用ComponentAce的ABS數據庫,這是一個基於PC的小型SQL數據庫。 (我強烈推薦的方式)。我的問題是我需要編寫一系列通用例程,這些例程可能違背Vendors組件。

這兩個組件都有TTable和TQuery組件。我需要編寫一套例程,其中一些基於TTable,另一些基於TQuery。這些例程可能違背任何供應商組件。

作爲一個例子,我需要能夠遍歷TTable中的所有行。我第一次運行例程時,需要使用DA-Soft的TTable。下一次我運行它時,我需要它運行它對組件王牌的TTable。 TQuery存在相同的場景。

我需要一個抽象層在這裏 - 至少我想我是這樣做的。我不想多次寫每個程序。建議如何提供這種抽象/間接層。我並不過分擔心快速致盲。請記住 - 簡單更好,我不是一個專業的程序員....

任何想法讚賞。 謝謝大家。

+2

你可以通過TTable和TQuery作爲它們的共同祖先TDataSet嗎? –

回答

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

我建議你使用Object Persistence Framework。我認爲Instant Object是很好的OPF。現在我正在使用它。通過使用OPF,我們的應用程序將獨立於DBMS,並且我們不需要爲每個例程多次創建例程。

+0

從某種意義上說,AnyDAC控件是一種對象持久性框架。它們支持大約15種不同的數據庫引擎,但實際上並不是本地的,也就是說SQL訪問,但不必安裝LOCAL數據庫引擎,這就是爲什麼我使用Component Ace的ABS數據庫的原因。 – user1009073

+0

AnyDAC也支持本地數據庫:SQLite,Advantage Database(dbf),MS Access – Branko