吳險峰
摘要:總結了ACCESS中設計和實用帶參數查詢的方法。介紹了通過ADO訪問ACCESS中的常規方法,并探討了ACC-ESS中查詢與存儲過程的關系,以及以存儲過程方式訪問查詢的方法。
關鍵詞:ACCESS參數查詢存儲過程
1ACCESS環境下的參數查詢
1.1在查詢設計器中建立參數查詢
參數在查詢中,通常作為查詢條件準則的一個部分,比如,要根據產品的類別來列出產品清單(例一),則在查詢的設計視圖中,將字段列表中的[類別ID]字段拖到查詢設計網格。然后在其下的“條件”單元格中,鍵入[a_類別],即建立了名為“a-類別”的參數,保存命名為[按類別查詢產品]。
特別注意的是,必須在用[]界定參數名,ACCESS的查詢中,用[]來界定對象名,主要是表、查詢、字段、參數等,如果在[]中的標識符不是表、查詢、字段或其他對象的名稱,則ACCESS將它視作參數。
當我們運行查詢的時候,系統彈出參數輸入對話框,在輸入框中輸入實際參數值后,Access繼續處理查詢,然后在數據表中顯示查詢結果。
1.2參數對話框的使用
參數對話框有兩個主要的作用,一是指定參數的數據類型;二是指定運行時參數的輸入順序。
必須要指定參數的數據類型的兩種情況是:(1)參數用于交叉表查詢;(2)參數的數據類型為邏輯值(是/否)。在交叉表查詢中,如果未在參數對話框中指定參數的數據類型,查詢運行時將會報錯而不能進行,這是由于iet引擎要求TRANSFORM查詢中的變量必須有確定的數據類型。
查詢參數中有邏輯值(是/否)時,如果不在查詢窗口中規定參數為邏輯型(是/否),則系統會把表示邏輯值的數值當成普通的數值,換而言之,只有輸入-1/0時才能夠和表中的值相匹配。如果在查詢窗口中規定參數為邏輯型,那么輸入非(4)、yes/no、true/false均能夠和表中的值準確匹配。所以在這種情況下,也應在查詢參數對話框中作明確的規定,以避免使用時的混亂。
查詢窗口的另外一個作用是,當有多個參數時,可以規定參數的輸入順序,在默認情況下,各參數的輸入順序是依其在查詢設計網格中出現的位置來決定的,我們可以在查詢參數設置對話框中輸入相關的參數,強制性的規定各參數的輸入順序。
1.3自定義有提示信息的參數輸入窗口
在ACCESS的查詢設計器中,參數不僅可以是一個普通的變量,還可以是窗體、報表等容器中所包含的控件。利用這一特性,我們可以把帶參數的查詢和窗體、報表等結合起來,設計出有自定義提示信息的,或不同輸入風格的參數輸入窗口。如按類別查詢產品時,可以先創建一個命名為“類別查詢”的窗體,在該窗體中,創建一個命名為[類別1的組合框,用于輸入參數,然后,在查詢設計器中建立相應的查詢,在[類別id]的條件單元格中輸入“[Forms]![類別查詢]![類別]”,這樣,就可以把自定義窗體和查詢聯結起來,獲得更個性化和高效的輸入界面。
2用ADO訪問帶參數的查詢
2.1利用Parameters集合攜帶參數
在ADO中,可以用多種方法來查詢數據庫,如果要使用查詢參數時,則必須使用Command對象。
使用Command對象通常用CommandText(屬性定義命令)的可執行文本(例如SQL語句)。如果要運行一個查詢,將CommandText屬性的值設置為該查詢的名稱即可,然后,在適當時候,用Execute方法執行命令,并返回Recordset對象,但如果要運行一個帶有參數的查詢,常規的方法是,利用Parameter對象和Parameters集合。
Command對象包含一個由Parameter對象組成的Pa-rameters集合。我們正是通過它們來傳遞參數的。其使用的過程是,使用CreateParameter方法創建帶適當屬性設置的Parameter對象,并使用Append方法將它們添加到Pa-rameters集合中,之后再使用Execute方法即可。
在創建Parameter對象時,使用CreateParameter方法,其完整形式為:command,CreateParameter(Name,Type,Direction,Size,Value)
Name為包含Parameter對象的名稱,Type指定Pa-rameter對象的數據類型。Direction指定Parameter對象的類型,即該參數是輸入參數還是輸出參數等,由于AC-CESS只支持輸入參數,因此該參數一般是adParamlnput。Size指定參數值的最大長度(以字符或字節為單位)。Value指定Parameter對象的值。這些參數均為可選參數,也可以通過對象的相關屬性的設置來達到同樣的目的。在將Pa-rameter添加到Parameters集合之前,應規定Parameter的數據類型。訪問1.1中例1的[按類別查詢產品]的代碼如下:

2.2視查詢為存儲過程
我們可以把查詢都當作是對SQL語句的封裝和優化,在這點上與存儲過程有些接近。可以在ACCESS中把查詢視為存儲過程。這樣,當我們用ADO訪問ACCESS中的查詢時就可采用另外一種方式,即調用存儲過程的方式,調用存儲過程也使用Command對象,但在參數的使用上,卻采用了不同的方式,即直接通過Execute傳遞參數。
在ADO中以調用存儲過程的方式訪問例1中的[按類別查詢產品]的代碼如下:
其中第二個參數為傳遞給存儲過程的參數,注意,需要把存儲過程的參數數組化后才能作為Execute的參數。
比較兩段代碼,可以得到這樣一個結論,如果查詢帶有參數,既可用Command對象的Parameters的當前值作為參數,也可以在Execute方法中調用傳遞的參數,對于性能不太敏感的應用而言,這兩種方式是沒有多大差別的,對于要求較高的性能,則需考慮采用何種方式,因為Command對象有一個CommandType屬性,該屬性指定系統按何種方式處理Commandtext,比如是按查詢表的方式(adCmdTable),還是按存儲過程的方式(adCmdStoredProe)。對不同的方式系統可以按其特性進行優化處理。而在以上兩段代碼中使用Command對象時,均未對Command對象的Command-Type屬性作設置,此時取默認值adCmdUnknown表示類型未知,系統性能將會降低,因為ADO必須耗費代價來確定CommandText屬性是SQL語句、存儲過程還是表名。如果知道正在使用的命令的類型,設置CommandType屬性可以提示ADO直接轉入相關代碼,所以,使用的查詢是類似于SOL查詢的返回,則應設置CommandType為ad-CmdTable,而其他無返回的的查詢則建議使用adCmd-StoredProc,一旦明確了CommandType,那么調用方式就不可混淆,這樣可以提高執行效率。問時我們也可以考慮到應用在ACCESS和SQL SERVER之間平滑遷移時的需要,來選擇策略。