摘要:為了更直觀形象地顯示SQL返回的多行少列查詢數據,提出了一種基于原生ADO對象的數據庫多欄動態組合顯示的設計方案,并在Delphi編程環境中討論了其實現過程。與現有的設計方案相比,新方案在系統開銷及執行效率方面均有了顯著的改進。
關鍵詞:原生ADO對象;多欄動態組合顯示;GetRows方法;Delohi
引言
在數據庫應用系統的開發中,經常會遇到SQL查詢數據返回字段數較少但記錄數較多(即多行少列)的情況。為了方便用戶查看數據,文獻在Oracle DBMS中利用SQL結構化查詢語言初步實現了數據的分欄顯示。進一步,為了提高可移植性和簡化編程模型,文獻利用Microsoft OWC組件實現了字段列表的多欄動態組合顯示,但由于使用了第三方組件,故文獻所介紹的方法在系統開銷及執行效率等方面均有顯著的不足。本文通過對相關原生ADO對象進行深入的分析后,提出了一種新的數據庫多欄動態組合顯示的設計方案,并在Delphi編程環境中討論了其實現過程。
1 基于ADO的數據庫多欄動態組合顯示的設計方案
1.1 設計方案的總體介紹
ADO是Microsoft公司目前主要的數據存取技術,它成功地封裝了OLE-DB大部分的功能,讓應用程序能夠很方便地處理各種不同類型的數據。ADO由一組COM對象組成(簡稱為原生ADO對象),程序員通過這些原生ADO對象可以輕松地連接數據源、存取數據和處理數據。通過對相關原生ADO對象進行仔細的分析后,我們從GetRows方法中找到了一種新的字段列表的多欄動態組合顯示的設計方案。
GetRows是RecordSet對象的一個方法,它的功能是將數據集的多個記錄的某些列數據檢索到一個二維數組中,并支持記錄的書簽標記操作。顯然,在數據分欄的欄數以及SQL多行少列查洵數據的記錄總數確定后,便可在一個循環語句中通過GetRows方法和記錄指針的移動來分批檢索數據(這里,循環次數為:記錄總數/分欄的欄數,若相除的結果不為整數,則作取整后加1的處理;GetRows方法每次檢索記錄的條數為分欄的欄數),并把每次檢索所得的二維數據從左至右地顯示在一個StringGrid控件中,從而實現字段列表的多欄動態組合顯示。設計方案的整個處理流程如圖1所示。

1.2 Delphi中GetRows方法的編程原理
Delphi的ADO組件封裝了原生ADO-對象的大部分方法,并且提供了和Delphi原有的數據感知組件連接的能力,一般情況下使用這些組件便可快速高效地編寫基于ADO技術的應用系統。對于Delphi ADO組件沒有封裝的方法,則需要通過這些ADO組件提供的某些屬性進行對應的引用,如上述的GetRows方法并沒有封裝在Delphi ADO組件中,但程序員可通過TADODataSet組件的Recordset屬性來完成對GetRows方法的引用。
相關的參數說明如下:
(1)ArrayResult:是—個OLEVariant類型的自定義變量,用來保存GetRows方法的檢索返回數據。該變量是一個二維數組,第一個下標標識字段,第二個下標標識記錄編號。
(2)Rows:用來指定要檢索的記錄條數,該參數的值若設置為—1,則表示從當前記錄指針開始檢索數據集的剩余記錄。
(3)Start:用來指定檢索記錄的首位置(書簽),該參數有0、1和2三種可選值,分別表示GetRows方法的檢索從當前記錄開始、從第一個記錄開始和從最后一個記錄開始。
(4)Fields:用來指定要檢索記錄的字段名或序號,當需要檢索兩個或以上字段時該參數應傳入OLEVariant類型的數組變量。
1.3 動態組合顯示的實現
動態組合顯示是指用戶可以根據需要對數據表格字段進行任意的組合顯示,它的實現要點有以下三方面:
(1)構造SQL查詢語句的字段選擇列表

由于動態組合顯示的字段個數及名稱是用戶在軟件運行時任意組合的,且SQL查詢語句中選擇列表的兩個字段之間要求用逗號隔開,故在構造SQL查詢語句的字段選擇列表時,用一個字符串變量以“<字段名稱>”的方式來連接用戶任意組合的字段列表。顯然,該字符串變量的首字段開始處也帶有“,”分隔符,為了符合SQL語句的格式要求,應該用Delerte函數刪除。Delete函數的格式是:Delete(str,m,n),功能是把字符串str從m位開始,刪除n位。
(2)確定GetRows方法的Fields參數
從上述分析可知,動態組合的顯示字段在運行時由用戶確定,故GetRows方法的Fields參數應由一個OLEVariant類型的動態數組變量來傳遞,該動態數組的長度可用SetLength函數在軟件運行時動態設定。
(3)StringGrid控件的相關屬性
StringGrid控件是一種通用的柵格,用于在行和列中顯示各種數據。這里并沒有使用DBGrid數據庫感應控件來顯示數據,主要原因是StringGrid控件在編程過程中更富有靈活性。StringGfid控件的相關屬性有:
ColCount:指定柵格的列數。
RowCount:指定柵格的行數。
Cells[ACol,ARow]:該屬性是一個二維數組,用戶通過它可以存取特定的行和列上的數據。其中ACol是列的序號,ARow是行的序號,序號都是從0開始。
1.4 主要源碼
2 應用實例
圖2是運用上述技術設計的多欄動態組合顯示系統的程序界面。系統中數據表的字段結構是:(編號、姓名、電話、出生年月、薪水),其中帶下畫線的字段為主鍵。用戶可以根據實際情況自由地組合需要顯示的數據字段和設定合適的欄數。
3 結束語
字段列表的多欄動態組合顯示具有較多的使用場合。應用本文提出的基于原生AD0對象的設計方案,不但具有系統開銷較少、編程簡單等優點,而且極容易擴展到c++Builder、vc、vB等開發環境中。