摘要:為了更直觀形象地顯示SQL返回的多行少列查詢數(shù)據(jù),提出了一種基于原生ADO對(duì)象的數(shù)據(jù)庫(kù)多欄動(dòng)態(tài)組合顯示的設(shè)計(jì)方案,并在Delphi編程環(huán)境中討論了其實(shí)現(xiàn)過程。與現(xiàn)有的設(shè)計(jì)方案相比,新方案在系統(tǒng)開銷及執(zhí)行效率方面均有了顯著的改進(jìn)。
關(guān)鍵詞:原生ADO對(duì)象;多欄動(dòng)態(tài)組合顯示;GetRows方法;Delohi
引言
在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的開發(fā)中,經(jīng)常會(huì)遇到SQL查詢數(shù)據(jù)返回字段數(shù)較少但記錄數(shù)較多(即多行少列)的情況。為了方便用戶查看數(shù)據(jù),文獻(xiàn)在Oracle DBMS中利用SQL結(jié)構(gòu)化查詢語言初步實(shí)現(xiàn)了數(shù)據(jù)的分欄顯示。進(jìn)一步,為了提高可移植性和簡(jiǎn)化編程模型,文獻(xiàn)利用Microsoft OWC組件實(shí)現(xiàn)了字段列表的多欄動(dòng)態(tài)組合顯示,但由于使用了第三方組件,故文獻(xiàn)所介紹的方法在系統(tǒng)開銷及執(zhí)行效率等方面均有顯著的不足。本文通過對(duì)相關(guān)原生ADO對(duì)象進(jìn)行深入的分析后,提出了一種新的數(shù)據(jù)庫(kù)多欄動(dòng)態(tài)組合顯示的設(shè)計(jì)方案,并在Delphi編程環(huán)境中討論了其實(shí)現(xiàn)過程。
1 基于ADO的數(shù)據(jù)庫(kù)多欄動(dòng)態(tài)組合顯示的設(shè)計(jì)方案
1.1 設(shè)計(jì)方案的總體介紹
ADO是Microsoft公司目前主要的數(shù)據(jù)存取技術(shù),它成功地封裝了OLE-DB大部分的功能,讓應(yīng)用程序能夠很方便地處理各種不同類型的數(shù)據(jù)。ADO由一組COM對(duì)象組成(簡(jiǎn)稱為原生ADO對(duì)象),程序員通過這些原生ADO對(duì)象可以輕松地連接數(shù)據(jù)源、存取數(shù)據(jù)和處理數(shù)據(jù)。通過對(duì)相關(guān)原生ADO對(duì)象進(jìn)行仔細(xì)的分析后,我們從GetRows方法中找到了一種新的字段列表的多欄動(dòng)態(tài)組合顯示的設(shè)計(jì)方案。
GetRows是RecordSet對(duì)象的一個(gè)方法,它的功能是將數(shù)據(jù)集的多個(gè)記錄的某些列數(shù)據(jù)檢索到一個(gè)二維數(shù)組中,并支持記錄的書簽標(biāo)記操作。顯然,在數(shù)據(jù)分欄的欄數(shù)以及SQL多行少列查洵數(shù)據(jù)的記錄總數(shù)確定后,便可在一個(gè)循環(huán)語句中通過GetRows方法和記錄指針的移動(dòng)來分批檢索數(shù)據(jù)(這里,循環(huán)次數(shù)為:記錄總數(shù)/分欄的欄數(shù),若相除的結(jié)果不為整數(shù),則作取整后加1的處理;GetRows方法每次檢索記錄的條數(shù)為分欄的欄數(shù)),并把每次檢索所得的二維數(shù)據(jù)從左至右地顯示在一個(gè)StringGrid控件中,從而實(shí)現(xiàn)字段列表的多欄動(dòng)態(tài)組合顯示。設(shè)計(jì)方案的整個(gè)處理流程如圖1所示。
1.2 Delphi中GetRows方法的編程原理
Delphi的ADO組件封裝了原生ADO-對(duì)象的大部分方法,并且提供了和Delphi原有的數(shù)據(jù)感知組件連接的能力,一般情況下使用這些組件便可快速高效地編寫基于ADO技術(shù)的應(yīng)用系統(tǒng)。對(duì)于Delphi ADO組件沒有封裝的方法,則需要通過這些ADO組件提供的某些屬性進(jìn)行對(duì)應(yīng)的引用,如上述的GetRows方法并沒有封裝在Delphi ADO組件中,但程序員可通過TADODataSet組件的Recordset屬性來完成對(duì)GetRows方法的引用。
相關(guān)的參數(shù)說明如下:
(1)ArrayResult:是—個(gè)OLEVariant類型的自定義變量,用來保存GetRows方法的檢索返回?cái)?shù)據(jù)。該變量是一個(gè)二維數(shù)組,第一個(gè)下標(biāo)標(biāo)識(shí)字段,第二個(gè)下標(biāo)標(biāo)識(shí)記錄編號(hào)。
(2)Rows:用來指定要檢索的記錄條數(shù),該參數(shù)的值若設(shè)置為—1,則表示從當(dāng)前記錄指針開始檢索數(shù)據(jù)集的剩余記錄。
(3)Start:用來指定檢索記錄的首位置(書簽),該參數(shù)有0、1和2三種可選值,分別表示GetRows方法的檢索從當(dāng)前記錄開始、從第一個(gè)記錄開始和從最后一個(gè)記錄開始。
(4)Fields:用來指定要檢索記錄的字段名或序號(hào),當(dāng)需要檢索兩個(gè)或以上字段時(shí)該參數(shù)應(yīng)傳入OLEVariant類型的數(shù)組變量。
1.3 動(dòng)態(tài)組合顯示的實(shí)現(xiàn)
動(dòng)態(tài)組合顯示是指用戶可以根據(jù)需要對(duì)數(shù)據(jù)表格字段進(jìn)行任意的組合顯示,它的實(shí)現(xiàn)要點(diǎn)有以下三方面:
(1)構(gòu)造SQL查詢語句的字段選擇列表
由于動(dòng)態(tài)組合顯示的字段個(gè)數(shù)及名稱是用戶在軟件運(yùn)行時(shí)任意組合的,且SQL查詢語句中選擇列表的兩個(gè)字段之間要求用逗號(hào)隔開,故在構(gòu)造SQL查詢語句的字段選擇列表時(shí),用一個(gè)字符串變量以“<字段名稱>”的方式來連接用戶任意組合的字段列表。顯然,該字符串變量的首字段開始處也帶有“,”分隔符,為了符合SQL語句的格式要求,應(yīng)該用Delerte函數(shù)刪除。Delete函數(shù)的格式是:Delete(str,m,n),功能是把字符串str從m位開始,刪除n位。
(2)確定GetRows方法的Fields參數(shù)
從上述分析可知,動(dòng)態(tài)組合的顯示字段在運(yùn)行時(shí)由用戶確定,故GetRows方法的Fields參數(shù)應(yīng)由一個(gè)OLEVariant類型的動(dòng)態(tài)數(shù)組變量來傳遞,該動(dòng)態(tài)數(shù)組的長(zhǎng)度可用SetLength函數(shù)在軟件運(yùn)行時(shí)動(dòng)態(tài)設(shè)定。
(3)StringGrid控件的相關(guān)屬性
StringGrid控件是一種通用的柵格,用于在行和列中顯示各種數(shù)據(jù)。這里并沒有使用DBGrid數(shù)據(jù)庫(kù)感應(yīng)控件來顯示數(shù)據(jù),主要原因是StringGrid控件在編程過程中更富有靈活性。StringGfid控件的相關(guān)屬性有:
ColCount:指定柵格的列數(shù)。
RowCount:指定柵格的行數(shù)。
Cells[ACol,ARow]:該屬性是一個(gè)二維數(shù)組,用戶通過它可以存取特定的行和列上的數(shù)據(jù)。其中ACol是列的序號(hào),ARow是行的序號(hào),序號(hào)都是從0開始。
1.4 主要源碼
2 應(yīng)用實(shí)例
圖2是運(yùn)用上述技術(shù)設(shè)計(jì)的多欄動(dòng)態(tài)組合顯示系統(tǒng)的程序界面。系統(tǒng)中數(shù)據(jù)表的字段結(jié)構(gòu)是:(編號(hào)、姓名、電話、出生年月、薪水),其中帶下畫線的字段為主鍵。用戶可以根據(jù)實(shí)際情況自由地組合需要顯示的數(shù)據(jù)字段和設(shè)定合適的欄數(shù)。
3 結(jié)束語
字段列表的多欄動(dòng)態(tài)組合顯示具有較多的使用場(chǎng)合。應(yīng)用本文提出的基于原生AD0對(duì)象的設(shè)計(jì)方案,不但具有系統(tǒng)開銷較少、編程簡(jiǎn)單等優(yōu)點(diǎn),而且極容易擴(kuò)展到c++Builder、vc、vB等開發(fā)環(huán)境中。