小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Delphi與SQL Server存儲(chǔ)過(guò)程編程詳解

 容心居 2020-02-07
 Delphi與SQL Server存儲(chǔ)過(guò)程編程詳解

 



前言  
    經(jīng)常有很多初學(xué)者問(wèn)到在delphi中如何調(diào)用SQL Server的存儲(chǔ)過(guò)程?問(wèn)題其實(shí)很好解決,但問(wèn)得多了,也就不愿答了。下面我將用實(shí)例進(jìn)行說(shuō)明,從在SQL Server中創(chuàng)建存儲(chǔ)過(guò)程到調(diào)用的完整實(shí)例。 
 
    首先,打開(kāi)sql server管理器,在pubs數(shù)據(jù)庫(kù)中建一個(gè)測(cè)試表,表名為test,字段有id,name,和desc,全部為字符型,如果你不知道建表,那么打開(kāi)sql查詢(xún)分析器,貼上以下的代碼,然后按執(zhí)行,就會(huì)自動(dòng)生成test表. 
use pubs 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
drop table [dbo].[test] 
GO 
 
CREATE TABLE [dbo].[test] ( 
 [id] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL , 
 [name] [char] (12) COLLATE Chinese_PRC_CI_AS NULL , 
 [descrip] [char] (30) COLLATE Chinese_PRC_CI_AS NULL  
) ON [PRIMARY] 
GO 
 
        然后,我們來(lái)創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,其功能為在test中插入一條新記錄.創(chuàng)建存儲(chǔ)過(guò)程的代碼如下,同樣的,你也可以復(fù)制到查詢(xún)分析器里直接執(zhí)行就可以: 
CREATE PROCEDURE myInsert  
@id char(10) , 
@name varchar(12),  
@descrip varchar(30) 
 
AS 
begin 
 
insert into test (id,name,descrip) values (@id,@name,@descrip) 
 
if @@rowcount=0 
begin 
  raiserror('error',16,1) 
  rollback transaction 
end 
end 
GO 
 
        接下來(lái),新建一個(gè)工程文件,在form1上放置如下控件,并設(shè)置屬性(括號(hào)內(nèi)): 
一個(gè)ADOConnection1: TADOConnection; 
      (LoginPrompt:=false; 
       connectionstring:=Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=pubs;Data Source=(local);) 

一個(gè)ADOStoredProc1: TADOStoredProc;屬性為: 
      (connection:=adoconnection1; 
       procedurename:=myinsert;//上面我們創(chuàng)建的那個(gè)) 

一個(gè)ADOTable1: TADOTable;屬性為: 
      (connection:=adoconnection1; 
      tablename:=test;    //上面我們創(chuàng)建的那個(gè)) 

一個(gè)Datasource1,屬性為: 
     (dataset:=Tadotable;) 

一個(gè) DBGrid1: TDBGrid;屬性為 
     (datasource:=datasource1;) 

一個(gè)Button1,在其Onclick中寫(xiě)到: 
  with adoStoredproc1 do 
  begin 
    Parameters.ParamByName('@id').Value := '2'; 
    parameters.ParamByName('@name').Value := 'myname'; 
    parameters.ParamByName('@descrip').Value :='nosubject'; 
    ExecProc; 
  end; 
  Adotable1.Close; 
  adotable1.Open; 
 
delphi調(diào)用sql存儲(chǔ)過(guò)程,并獲取結(jié)果 
adostoredproc1.Close; 
adostoredproc1.ProcedureName:=’sp_thchl’; 
adostoredproc1.Parameters.Clear;
 adostoredproc1.Parameters.CreateParameter(’out’,ftInteger,pdoutput,1,1); 
adostoredproc1.ExecProc; 
edit1.Text :=adostoredproc1.Parameters[0].Value;

 

Delphi、MS SQL Server開(kāi)發(fā)環(huán)境下存儲(chǔ)過(guò)程的使用     
一、概述
Delphi + MS SQL Server是目前最為流行的管理信息系統(tǒng)開(kāi)發(fā)環(huán)境和工具。Delphi的強(qiáng)大數(shù)據(jù)庫(kù)操作控件極大地減輕了開(kāi)發(fā)人員的工作量,在這些控件中,最常用的有TQuery、TTable、TADOQuery、TADOTable、TADODataSete等,這些控件執(zhí)行查詢(xún)操作時(shí)有一個(gè)共同的特點(diǎn),即將所有數(shù)據(jù)庫(kù)記錄從服務(wù)器取回客戶(hù)端,再根據(jù)查詢(xún)的條件進(jìn)行篩選。很明顯,如果有大量的數(shù)據(jù)在服務(wù)器與客戶(hù)端之間傳遞,就會(huì)降低程序執(zhí)行的速度,影響應(yīng)用程序的性能。針對(duì)這種情況,MS SQL Server數(shù)據(jù)庫(kù)和Delphi開(kāi)發(fā)工具都提供了存儲(chǔ)過(guò)程來(lái)解決這類(lèi)問(wèn)題。存儲(chǔ)過(guò)程是一段在服務(wù)器上執(zhí)行的程序,它在服務(wù)器端對(duì)數(shù)據(jù)庫(kù)記錄進(jìn)行處理,再把結(jié)果返回到客戶(hù)端。通過(guò)使用存儲(chǔ)過(guò)程,一方面可以利用服務(wù)器強(qiáng)大的計(jì)算能力和速度,另一方面避免把大量的數(shù)據(jù)從服務(wù)器下載到客戶(hù)端,減少網(wǎng)絡(luò)上傳輸量,服務(wù)器只需將計(jì)算結(jié)果傳給客戶(hù)端,其效率之高是非常明顯的。
二、創(chuàng)建存儲(chǔ)過(guò)程
在MS SQL Server上的存儲(chǔ)過(guò)程可分為二類(lèi),一類(lèi)是類(lèi)似于select 查詢(xún),用于檢索數(shù)據(jù),檢索到的數(shù)據(jù)能夠以數(shù)據(jù)集的形式返回給客戶(hù)端,如
CREATE procedure proc1
@dw char(20)
as
select dwdm from cchdwdm where dw=@dw
該存儲(chǔ)過(guò)程有一個(gè)輸入?yún)?shù) @dwdm,以數(shù)據(jù)集的形式返回結(jié)果。
另一類(lèi)存儲(chǔ)過(guò)程是通過(guò)輸出參數(shù)返回信息或不返回信息,或只執(zhí)行一個(gè)動(dòng)作。如:
CREATE procedure proc2
@m1 smallint,
@m2 smallint
@result int OUTPUT
as
select @result=@m1*@m2
該存儲(chǔ)過(guò)程有二個(gè)輸入?yún)?shù)@m1、@m2,還有一個(gè)輸出參數(shù)@result。 
按照創(chuàng)建存儲(chǔ)過(guò)程的時(shí)機(jī)來(lái)劃分,創(chuàng)建存儲(chǔ)過(guò)程也有二種方式,一是利用MS SQL Server的Enterprise Manager中的SQL Server Query Analyzer工具,此方法較簡(jiǎn)單,只要輸入存儲(chǔ)過(guò)程語(yǔ)句并保存即可。
創(chuàng)建存儲(chǔ)過(guò)程的另一種方式是利用Delphi的控件,如TQuery、TADOQuery,通過(guò)使用SQL語(yǔ)句在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建存儲(chǔ)過(guò)程。如下例所示。
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;

三、存儲(chǔ)過(guò)程的參數(shù)
存儲(chǔ)過(guò)程一般有四種參數(shù)類(lèi)型:
輸入?yún)?shù),由客戶(hù)程序向存儲(chǔ)過(guò)程傳遞
輸出參數(shù),由存儲(chǔ)過(guò)程向客戶(hù)傳遞
輸入/輸出參數(shù),可雙向傳遞
狀態(tài)參數(shù),由存儲(chǔ)過(guò)程向客戶(hù)返回錯(cuò)誤信息
通過(guò)使用Delphi控件TADOStoredProc或TStoredProc來(lái)設(shè)置或獲取存儲(chǔ)過(guò)程的參數(shù),如:
ADOStoredProc1.parameters.parambyname('@name').value:='張三';

四、在Delphi中使用存儲(chǔ)過(guò)程的方法
在Delphi中使用存儲(chǔ)過(guò)程有以下幾個(gè)步驟:
1、把TADOStoredProc或TStoredProc放到窗體上。
2、設(shè)置參數(shù)連接到MS SQL Server數(shù)據(jù)庫(kù)。
3、設(shè)置ProcedureName參數(shù),指定存儲(chǔ)過(guò)程名,也可以在程序運(yùn)行期設(shè)置。
4、單擊TParameters邊上的省略號(hào)按鈕,如果設(shè)置正確,則可看到所有的輸入輸出參數(shù)。
5、在代碼中設(shè)置存儲(chǔ)過(guò)程的輸入?yún)?shù)、執(zhí)行存儲(chǔ)過(guò)程并獲取返回的數(shù)據(jù)。
通過(guò)調(diào)用TADOStoredProc控件的parambyname方法,設(shè)置好所有的輸入?yún)?shù),再調(diào)用open方法執(zhí)行存儲(chǔ)過(guò)程。如果存儲(chǔ)過(guò)程返回參數(shù),同樣用parambyname方法獲取參數(shù)值,如果返回?cái)?shù)據(jù)集,則用訪問(wèn)數(shù)據(jù)集的TFields的方法獲取各記錄。如以下代碼所示:

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多