Delphi ADOStoredProc 存儲過程用法


一、概述
Delphi   +   MS   SQL   Server
是目前最為流行的管理信息系統開發環境和工具。Delphi的強大數據庫操作控件極大地減輕了開發人員的工作量,在這些控件中,最常用的有TQueryTTableTADOQueryTADOTableTADODataSete等,這些控件執行查詢操作時有一個共同的特點,即將所有數據庫記錄從服務器取回客戶端,再根據查詢的條件進行篩選。很明顯,如果有大量的數據在服務器與客戶端之間傳遞,就會降低程序執行的速度,影響應用程序的性能。針對這種情況,MS   SQL   Server數據庫和Delphi開發工具都提供了存儲過程來解決這類問題。存儲過程是一段在服務器上執行的程序,它在服務器端對數據庫記錄進行處理,再把結果返回到客戶端。通過使用存儲過程,一方面可以利用服務器強大的計算能力和速度,另一方面避免把大量的數據從服務器下載到客戶端,減少網絡上傳輸量,服務器只需將計算結果傳給客戶端,其效率之高是非常明顯的。
二、創建存儲過程
MS   SQL   Server上的存儲過程可分為二類,一類是類似於select   查詢,用於檢索數據,檢索到的數據能夠以數據集的形式返回給客戶端,如
CREATE   procedure   proc1
@dw   char(20)
as
select   dwdm   from   cchdwdm   where   dw=@dw
該存儲過程有一個輸入參數   @dwdm,以數據集的形式返回結果。
另一類存儲過程是通過輸出參數返回信息或不返回信息,或只執行一個動作。如:
CREATE   procedure   proc2
@m1   smallint,
@m2   smallint
@result   int   OUTPUT
as
select   @result=@m1*@m2
該存儲過程有二個輸入參數@m1@m2,還有一個輸出參數@result   
按照創建存儲過程的時機來划分,創建存儲過程也有二種方式,一是利用MS   SQL   ServerEnterprise   Manager中的SQL   Server   Query   Analyzer工具,此方法較簡單,只要輸入存儲過程語句並保存即可。
創建存儲過程的另一種方式是利用Delphi的控件,如TQueryTADOQuery,通過使用SQL語句在運行時動態地創建存儲過程。如下例所示。
with   query1   do
begin
paramcheck   :=   false;
with   SQL   do
begin
clear;
add(’create   procedure   proc1’);
add(’@dw   char(20)’);
add(’as’);
add(’select   dwdm   from   cchdwdm   where   dw=@dw’);
end
execsql;
end;

三、存儲過程的參數
存儲過程一般有四種參數類型:
輸入參數,由客戶程序向存儲過程傳遞
輸出參數,由存儲過程向客戶傳遞
輸入/輸出參數,可雙向傳遞
狀態參數,由存儲過程向客戶返回錯誤信息
通過使用Delphi控件TADOStoredProcTStoredProc來設置或獲取存儲過程的參數,如:
ADOStoredProc1.parameters.parambyname(’@name’).value:=’
張三’;

四、在Delphi中使用存儲過程的方法
Delphi中使用存儲過程有以下幾個步驟:
1
、把TADOStoredProcTStoredProc放到窗體上。
2
、設置參數連接到MS   SQL   Server數據庫。
3
、設置ProcedureName參數,指定存儲過程名,也可以在程序運行期設置。
4
、單擊TParameters邊上的省略號按鈕,如果設置正確,則可看到所有的輸入輸出參數。
5
、在代碼中設置存儲過程的輸入參數、執行存儲過程並獲取返回的數據。
通過調用TADOStoredProc控件的parambyname方法,設置好所有的輸入參數,再調用open方法執行存儲過程。如果存儲過程返回參數,同樣用parambyname方法獲取參數值,如果返回數據集,則用訪問數據集的TFields的方法獲取各記錄。如以下代碼所示:

ADOStoredProc1.close;
ADOStoredProc1.parameters.parambyname(’@dwmc’).value:=’
某某單位’;   
ADOStoredProc1.prepared:=true;
ADOStoredProc1.open;
label1.caption:=   ADOStoredProc1.fields[0].asstring;

 

貼段別人寫的ADOStoredProc1應用代碼,存儲過程以中文命名的,雖然有些不規范,原理盡在其中,包含存儲過程的返回值獲取,記錄集的獲取,參數傳遞。有些用ADOStoredProc進行操作時,要動態創建輸入輸出參數,其實用 ADOStoredProc1.Parameters.Refresh;將參數進行刷新一下就可以了。

procedure TForm1.Button1Click(Sender: TObject);
begin  //
根據動態賦參數序號賦值
 ADOStoredProc1.Close;
 DataSource1.DataSet:=ADOStoredProc1;
 ADOStoredProc1.ProcedureName:='
成績查找';
 ADOStoredProc1.Parameters.Refresh;
 ADOStoredProc1.Parameters[1].Value:=200301001;
 ADOStoredProc1.Parameters[2].Value:=4;
 ADOStoredProc1.Parameters[3].Value:='SQL
數據庫';
 ADOStoredProc1.Open;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin  //
根據動態賦參數名稱賦值
 ADOStoredProc1.Close;
 DataSource1.DataSet:=ADOStoredProc1;
 ADOStoredProc1.ProcedureName:='
成績查找';
 ADOStoredProc1.Parameters.Refresh;
 ADOStoredProc1.Parameters.ParamByName('@
學號').Value:=200301001;
 ADOStoredProc1.Parameters.ParamByName('@
學期').Value:=4;
 ADOStoredProc1.Parameters.ParamByName('@
課程名稱').Value:='SQL數據庫';
 ADOStoredProc1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin //
提取存儲過程返回值
 ADOStoredProc1.Close;
 ADOStoredProc1.ProcedureName:='
帶返回值的成績查找';
 ADOStoredProc1.Parameters.Refresh;
 ADOStoredProc1.Parameters.ParamByName('@
學號').Value:=200301001;
 ADOStoredProc1.Parameters.ParamByName('@
學期').Value:=4;
 ADOStoredProc1.Parameters.ParamByName('@
課程名稱').Value:='SQL數據庫';
 ADOStoredProc1.Parameters.ParamByName('@
結果').Value:=null;
 ADOStoredProc1.ExecProc;
 Edit1.Text:=IntToStr(ADOStoredProc1.Parameters.ParamByName('@
結果').Value);
end;

procedure TForm1.Button3Click(Sender: TObject);
var i:integer;//
提取存儲過程返回的多個結果集的方法,
begin //
返回第一個結果集
 DataSource1.DataSet:=ADODataSet1;
 if Button3.Caption='
返回第一個結果集' then
 begin
   ADOStoredProc1.Close;
   ADOStoredProc1.ProcedureName:='
學生';
   ADOStoredProc1.Open;
   ADODataSet1.Recordset:=ADOStoredProc1.Recordset;
   Button3.Caption:='
返回第二個結果集';
 end else
 begin
   ADODataSet1.Recordset:=ADOStoredProc1.NextRecordset(i);
   DataSource1.DataSet:=ADODataSet1;
   Button3.Caption:='
返回第一個結果集';
 end;
end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM