吳險(xiǎn)峰
摘要:總結(jié)了ACCESS中設(shè)計(jì)和實(shí)用帶參數(shù)查詢(xún)的方法。介紹了通過(guò)ADO訪(fǎng)問(wèn)ACCESS中的常規(guī)方法,并探討了ACC-ESS中查詢(xún)與存儲(chǔ)過(guò)程的關(guān)系,以及以存儲(chǔ)過(guò)程方式訪(fǎng)問(wèn)查詢(xún)的方法。
關(guān)鍵詞:ACCESS參數(shù)查詢(xún)存儲(chǔ)過(guò)程
1ACCESS環(huán)境下的參數(shù)查詢(xún)
1.1在查詢(xún)?cè)O(shè)計(jì)器中建立參數(shù)查詢(xún)
參數(shù)在查詢(xún)中,通常作為查詢(xún)條件準(zhǔn)則的一個(gè)部分,比如,要根據(jù)產(chǎn)品的類(lèi)別來(lái)列出產(chǎn)品清單(例一),則在查詢(xún)的設(shè)計(jì)視圖中,將字段列表中的[類(lèi)別ID]字段拖到查詢(xún)?cè)O(shè)計(jì)網(wǎng)格。然后在其下的“條件”單元格中,鍵入[a_類(lèi)別],即建立了名為“a-類(lèi)別”的參數(shù),保存命名為[按類(lèi)別查詢(xún)產(chǎn)品]。
特別注意的是,必須在用[]界定參數(shù)名,ACCESS的查詢(xún)中,用[]來(lái)界定對(duì)象名,主要是表、查詢(xún)、字段、參數(shù)等,如果在[]中的標(biāo)識(shí)符不是表、查詢(xún)、字段或其他對(duì)象的名稱(chēng),則ACCESS將它視作參數(shù)。
當(dāng)我們運(yùn)行查詢(xún)的時(shí)候,系統(tǒng)彈出參數(shù)輸入對(duì)話(huà)框,在輸入框中輸入實(shí)際參數(shù)值后,Access繼續(xù)處理查詢(xún),然后在數(shù)據(jù)表中顯示查詢(xún)結(jié)果。
1.2參數(shù)對(duì)話(huà)框的使用
參數(shù)對(duì)話(huà)框有兩個(gè)主要的作用,一是指定參數(shù)的數(shù)據(jù)類(lèi)型;二是指定運(yùn)行時(shí)參數(shù)的輸入順序。
必須要指定參數(shù)的數(shù)據(jù)類(lèi)型的兩種情況是:(1)參數(shù)用于交叉表查詢(xún);(2)參數(shù)的數(shù)據(jù)類(lèi)型為邏輯值(是/否)。在交叉表查詢(xún)中,如果未在參數(shù)對(duì)話(huà)框中指定參數(shù)的數(shù)據(jù)類(lèi)型,查詢(xún)運(yùn)行時(shí)將會(huì)報(bào)錯(cuò)而不能進(jìn)行,這是由于iet引擎要求TRANSFORM查詢(xún)中的變量必須有確定的數(shù)據(jù)類(lèi)型。
查詢(xún)參數(shù)中有邏輯值(是/否)時(shí),如果不在查詢(xún)窗口中規(guī)定參數(shù)為邏輯型(是/否),則系統(tǒng)會(huì)把表示邏輯值的數(shù)值當(dāng)成普通的數(shù)值,換而言之,只有輸入-1/0時(shí)才能夠和表中的值相匹配。如果在查詢(xún)窗口中規(guī)定參數(shù)為邏輯型,那么輸入非(4)、yes/no、true/false均能夠和表中的值準(zhǔn)確匹配。所以在這種情況下,也應(yīng)在查詢(xún)參數(shù)對(duì)話(huà)框中作明確的規(guī)定,以避免使用時(shí)的混亂。
查詢(xún)窗口的另外一個(gè)作用是,當(dāng)有多個(gè)參數(shù)時(shí),可以規(guī)定參數(shù)的輸入順序,在默認(rèn)情況下,各參數(shù)的輸入順序是依其在查詢(xún)?cè)O(shè)計(jì)網(wǎng)格中出現(xiàn)的位置來(lái)決定的,我們可以在查詢(xún)參數(shù)設(shè)置對(duì)話(huà)框中輸入相關(guān)的參數(shù),強(qiáng)制性的規(guī)定各參數(shù)的輸入順序。
1.3自定義有提示信息的參數(shù)輸入窗口
在A(yíng)CCESS的查詢(xún)?cè)O(shè)計(jì)器中,參數(shù)不僅可以是一個(gè)普通的變量,還可以是窗體、報(bào)表等容器中所包含的控件。利用這一特性,我們可以把帶參數(shù)的查詢(xún)和窗體、報(bào)表等結(jié)合起來(lái),設(shè)計(jì)出有自定義提示信息的,或不同輸入風(fēng)格的參數(shù)輸入窗口。如按類(lèi)別查詢(xún)產(chǎn)品時(shí),可以先創(chuàng)建一個(gè)命名為“類(lèi)別查詢(xún)”的窗體,在該窗體中,創(chuàng)建一個(gè)命名為[類(lèi)別1的組合框,用于輸入?yún)?shù),然后,在查詢(xún)?cè)O(shè)計(jì)器中建立相應(yīng)的查詢(xún),在[類(lèi)別id]的條件單元格中輸入“[Forms]![類(lèi)別查詢(xún)]![類(lèi)別]”,這樣,就可以把自定義窗體和查詢(xún)聯(lián)結(jié)起來(lái),獲得更個(gè)性化和高效的輸入界面。
2用ADO訪(fǎng)問(wèn)帶參數(shù)的查詢(xún)
2.1利用Parameters集合攜帶參數(shù)
在A(yíng)DO中,可以用多種方法來(lái)查詢(xún)數(shù)據(jù)庫(kù),如果要使用查詢(xún)參數(shù)時(shí),則必須使用Command對(duì)象。
使用Command對(duì)象通常用CommandText(屬性定義命令)的可執(zhí)行文本(例如SQL語(yǔ)句)。如果要運(yùn)行一個(gè)查詢(xún),將CommandText屬性的值設(shè)置為該查詢(xún)的名稱(chēng)即可,然后,在適當(dāng)時(shí)候,用Execute方法執(zhí)行命令,并返回Recordset對(duì)象,但如果要運(yùn)行一個(gè)帶有參數(shù)的查詢(xún),常規(guī)的方法是,利用Parameter對(duì)象和Parameters集合。
Command對(duì)象包含一個(gè)由Parameter對(duì)象組成的Pa-rameters集合。我們正是通過(guò)它們來(lái)傳遞參數(shù)的。其使用的過(guò)程是,使用CreateParameter方法創(chuàng)建帶適當(dāng)屬性設(shè)置的Parameter對(duì)象,并使用Append方法將它們添加到Pa-rameters集合中,之后再使用Execute方法即可。
在創(chuàng)建Parameter對(duì)象時(shí),使用CreateParameter方法,其完整形式為:command,CreateParameter(Name,Type,Direction,Size,Value)
Name為包含Parameter對(duì)象的名稱(chēng),Type指定Pa-rameter對(duì)象的數(shù)據(jù)類(lèi)型。Direction指定Parameter對(duì)象的類(lèi)型,即該參數(shù)是輸入?yún)?shù)還是輸出參數(shù)等,由于A(yíng)C-CESS只支持輸入?yún)?shù),因此該參數(shù)一般是adParamlnput。Size指定參數(shù)值的最大長(zhǎng)度(以字符或字節(jié)為單位)。Value指定Parameter對(duì)象的值。這些參數(shù)均為可選參數(shù),也可以通過(guò)對(duì)象的相關(guān)屬性的設(shè)置來(lái)達(dá)到同樣的目的。在將Pa-rameter添加到Parameters集合之前,應(yīng)規(guī)定Parameter的數(shù)據(jù)類(lèi)型。訪(fǎng)問(wèn)1.1中例1的[按類(lèi)別查詢(xún)產(chǎn)品]的代碼如下:
2.2視查詢(xún)?yōu)榇鎯?chǔ)過(guò)程
我們可以把查詢(xún)都當(dāng)作是對(duì)SQL語(yǔ)句的封裝和優(yōu)化,在這點(diǎn)上與存儲(chǔ)過(guò)程有些接近??梢栽贏(yíng)CCESS中把查詢(xún)視為存儲(chǔ)過(guò)程。這樣,當(dāng)我們用ADO訪(fǎng)問(wèn)ACCESS中的查詢(xún)時(shí)就可采用另外一種方式,即調(diào)用存儲(chǔ)過(guò)程的方式,調(diào)用存儲(chǔ)過(guò)程也使用Command對(duì)象,但在參數(shù)的使用上,卻采用了不同的方式,即直接通過(guò)Execute傳遞參數(shù)。
在A(yíng)DO中以調(diào)用存儲(chǔ)過(guò)程的方式訪(fǎng)問(wèn)例1中的[按類(lèi)別查詢(xún)產(chǎn)品]的代碼如下:
其中第二個(gè)參數(shù)為傳遞給存儲(chǔ)過(guò)程的參數(shù),注意,需要把存儲(chǔ)過(guò)程的參數(shù)數(shù)組化后才能作為Execute的參數(shù)。
比較兩段代碼,可以得到這樣一個(gè)結(jié)論,如果查詢(xún)帶有參數(shù),既可用Command對(duì)象的Parameters的當(dāng)前值作為參數(shù),也可以在Execute方法中調(diào)用傳遞的參數(shù),對(duì)于性能不太敏感的應(yīng)用而言,這兩種方式是沒(méi)有多大差別的,對(duì)于要求較高的性能,則需考慮采用何種方式,因?yàn)镃ommand對(duì)象有一個(gè)CommandType屬性,該屬性指定系統(tǒng)按何種方式處理Commandtext,比如是按查詢(xún)表的方式(adCmdTable),還是按存儲(chǔ)過(guò)程的方式(adCmdStoredProe)。對(duì)不同的方式系統(tǒng)可以按其特性進(jìn)行優(yōu)化處理。而在以上兩段代碼中使用Command對(duì)象時(shí),均未對(duì)Command對(duì)象的Command-Type屬性作設(shè)置,此時(shí)取默認(rèn)值adCmdUnknown表示類(lèi)型未知,系統(tǒng)性能將會(huì)降低,因?yàn)锳DO必須耗費(fèi)代價(jià)來(lái)確定CommandText屬性是SQL語(yǔ)句、存儲(chǔ)過(guò)程還是表名。如果知道正在使用的命令的類(lèi)型,設(shè)置CommandType屬性可以提示ADO直接轉(zhuǎn)入相關(guān)代碼,所以,使用的查詢(xún)是類(lèi)似于SOL查詢(xún)的返回,則應(yīng)設(shè)置CommandType為ad-CmdTable,而其他無(wú)返回的的查詢(xún)則建議使用adCmd-StoredProc,一旦明確了CommandType,那么調(diào)用方式就不可混淆,這樣可以提高執(zhí)行效率。問(wèn)時(shí)我們也可以考慮到應(yīng)用在A(yíng)CCESS和SQL SERVER之間平滑遷移時(shí)的需要,來(lái)選擇策略。