18.3.3 使用存儲過程
18.3.3.1 TStoredProc部件概述
存儲過程是以數據庫服務器為基礎的接受輸入參數,並將結果返回給應用程序的一段程序。TStoredProc部件操作遠程服務器上的數據庫中的存儲過程。存儲過程是一連串表達式的集合,作為服務器的一部分存儲。存儲過程在服務器上執行一系列重復性的與數據庫相關的任務,並將結果傳給客戶應用程序,如Delphi數據庫應用程序。
TStaredProc部件使Delphi數據庫應用程序能執行服務器上的存儲過程。
通常,作用於數據庫表中大量記錄並且使用統計或數學函數的操作都是存儲過程的首選對象。通過將這些重復計算任務轉移到服務器,可以提高數據庫應用程序的性能。
● 充分利用服務器的處理能力和速度
● 減少網絡傳輸的數量
例如,考慮一個需要計算單個值的應用程序,在大批記錄中的標准差值。如果在Delphi應用程序中執行這項功能就必須從服務器中得到所有在計算中用到的記錄,這必將導致網絡擁塞。因為應用程序所需的只是代表標准差的最終返回值。因此,由服務器上的存儲過程來讀數據,執行計算和將值傳給應用程序將更有效。
1. TSoredProc的關鍵屬性
⑴ DatabaseName屬性
DatabaseName屬性描述要訪問的數據庫的名字。該屬性可以為:
● 已定義的BDE別名
● 本地型數據庫的目錄
● Local InterBase服務器的目錄路徑和文件名
● TDatabase定義的應用程序別名
在改變DatabaseName之前要使用Close方法將Dataset部件置為非活躍狀態。
⑵ StoredProcName屬性
StoredProcName屬性表示服務器上的存儲過程名。Oracle服務器允許多個具有相同名字的存儲過程。因此要設置Overload屬性來描述執行在Oracle服務器上的存儲過程名。
⑶ Overload屬性
Oracle服務器允許Oracle軟件包中存儲過程的重載。就是說具有相同名字的不同過程,設置Overload屬性用來描述執行在Oracle服務器上的存儲過程。如果Overload值為零,則假定沒有重載,如果Overload為1,則Delphi執行具有同名的第一個存儲過程;如果值為2,則執行第二個存儲過程。
⑷ Params屬性
Params屬性包含傳給存儲過程的參數。
2. 關鍵方法
⑴ ParamByName方法
聲明:function ParamByName(const Value: String): TParam;
ParamByName方法返回Params屬性中具有名為Value的元素值。一般用該方法在動態查詢中給參數賦值。
⑵ Prepare方法
PrePare方法准備要執行的存儲過程,這允許服務器載入存儲過程,否則准備處理異常。
⑶ ExecProc方法
ExecProc方法執行服務器上的存儲過程。
⑷ Open方法
Open方法打開DataSet部件,並將其置於浏覽狀態。這相當於將Active屬性置為True。對於TStoredProc如果存儲過程返回一個結果集,則使用Open執行存儲過程。如果存儲過程返回單行,早使用ExecProc執行存儲過程。
18.3.3.2 TStoreProc使用方法
1. 建立一個StoredProc部件
為數據庫服務器上的存儲過程建立一個TStoredProc部件的步驟如下:
⑴ 從Component Palette的Data Access頁選擇TStoredProc部件放在數據模塊上。
⑵ 將TStoredProc部件的DatabaseName屬性設置為存儲過程所在的數據庫名。
DatabaseName必須是BDE別名。
⑶ 將TStoredProc部件的StoredProcName屬性設為所用的存儲過程名,或者從下拉式
列表框中選擇。
⑷ 在TStoredProc部件的Params屬性中描述輸入參數。可以使用參數編輯器來設置輸
入參數。參數編輯器也可讓用戶察看存儲過程返回給應用程序的值。
2. 設置存儲過程的輸入參數,察看輸出結果參數
許多存儲過程需要給它們傳入一系列的輸入參數,以確定處理什麼和怎樣處理,在Params屬性中描述這些參數。所描述的輸入參數的順序是很重要的,它由服務器上的存儲過程來確定。在設計時,最容易和最安全的方法是激活TStoredProc參數編輯器,編輯輸入參數。參數編輯器以正確的次序列出輸入參數,讓你給它們賦值。
要激活TStoredProc的參數編輯器:
① 選擇TStoredProc部件。
② 按鼠標右鍵激活加速菜單(Speed Menu)。
③ 選擇Define Parameters。
參數名列表框顯示過程的所有輸入,輸出和結果參數。有關輸入、輸出參數的信息從服務器中獲得。對於某些服務器而方,參數信息是不可訪問的,如Sybase,在這種情況下,列表框是空的,因此必須自己按過程要求的順序增加輸入輸出參數。
參數類型復選框中描述所選的參數是輸入、輸出,還是結果參數。如果服務器支持參數可以既是輸入又是輸出。如果在列表框中增添參數,就必須設置參數類型。
數據類型復選框,列出列表框中所選參數的數據類型。如果給列表框真善美參數,必須設置數據類型。
在值編輯框中給輸入參數賦值。
如果服務器不傳遞存儲過程信息給Delphi,則可以用Add按鈕給存儲過程增添參數。Delete按鈕則是將增添的參數刪除,Clear按鈕將清除列表框中所有參數。
設置完參數後,選擇OK按鈕。
3. 在運行時建立參數和參數值
在運行時建立參數,可直接訪問Params屬性。Params屬性是參數字符串的數組。例如,下列代碼將編輯框的文本賦給數組的第一個字串:
StaredProc1.Params[0].Asstring := Edit1.Text
也能夠用ParamsByName方法通過名字訪問參數:
StoredProc1.ParamsByName('Company') Asstring := Edit1.Text;
4. 准備和執行存儲過程
要使用存儲過程還必須准備並執行它。可以有兩種方式准備一個存儲過程:
● 在設計時,通過選擇參數編輯器的OK按鈕
● 在運行時,通過調用TStoredProc的Prepare方法
例如,下面的代碼准備存儲過程的執行:
StoredProc1.Prepare;
要執行准備好的存儲過程,調用TStroedProc部件的ExecProc方法。下列代碼演示了准備和執行存儲過程:
StoredProc1.Params[0] Asstring := Edit1.Text;
StoredProc1.prepare;
StoredProc1.ExecProc;
當你執行一個存儲過程,它返回輸出參數或結果集,有兩種可能的返回類型:單個返回,如單值或值集,和一群結果集,返回很多值。
5. 訪問輸出參數和結果集
存儲過程在輸出參數數組中返回值。如果服務器支持返回值可以是單個結果或者結果集。
在運行時訪問存儲過程的輸出參數,可以索引Params屬性或者用ParamByName方法訪問這些值。下列表達式都用輸出參數設置了編輯框的值:
Edit1.Text := StoredProc1.Params[6].AsString;
Edit1.Text := StoredProc1.ParamsByName('Contact').AsString;
如果存儲過程返回結果集,則用標准數據相關控制訪問和顯示值會更有用。
在某些服務器上如Sybase,存儲過程能象查詢語句那樣返回結果集,應用程序可以使用數據相關控制一顯示這些存儲過程的輸出。
用數據相關控制顯示存儲過程返回結果的方法如下:
① 將DataSource部件放在數據模塊上。
② 將DataSource部件的DataSet屬性設置為接收數據的TStoredProc部件的名字。
③ 將數據相關控制的DataSource屬性設為DataSource部件的名字。
這樣,當用於TStoredProc部件和Active屬性為True時,數據相關控制就能顯示從存儲過程返回的結果。
18.3.4 從開發平台到服務器的向上適化