|
五、StoredProcedure 在討論StoredProcedure之前,我還要對(duì)Command對(duì)象的Execute方法的作用進(jìn)行一下闡述,一般來說使用Command的Execute方法有三個(gè)目的。1、用于進(jìn)行一些簡(jiǎn)單的處理,例如刪除一條記錄: comm.CommandType=AdCmdText comm.CommandText="Delect From employee Where Job_ID=1" comm.execute 這樣的工作不需要返回什么東西。2、用于進(jìn)行一些復(fù)雜的處理,例如進(jìn)行一個(gè)Transact的設(shè)計(jì),這類一般都是和StoredProcedure一同工作的,而且有輸出參數(shù)和輸入的參數(shù),這也是我們本章的討論主題。3、用于返回一個(gè)RecordSet對(duì)象,用于其它的處理,例如: comm.CommandType=AdCmdText comm.CommandText="Delect From employee Where Job_ID=1" set rs=comm.execute dim i while not rs.EOF for i=0 to rs.fileds.count-1 response.write rs.fileds.item(i).value&"," next response.write "<br>" rs.MoveNext wend 好了,還是讓我們從新回到StoredProcedure的討論上來。StoredProcedure是什么呢?它是一個(gè)預(yù)先存儲(chǔ)的數(shù)據(jù)庫(kù)執(zhí)行動(dòng)作集,在SQL的管理結(jié)構(gòu)中,對(duì)于一個(gè)數(shù)據(jù)庫(kù)下有幾個(gè)部分,一個(gè)是數(shù)據(jù)表的集合、一個(gè)就是StoredProcedure的集合。將兩者結(jié)合可以完成很多強(qiáng)大的功能。StoredProcedure其實(shí)是對(duì)傳統(tǒng)的SQL語句的一種擴(kuò)展,主要是在參數(shù)的輸入與輸出上。下面我大致的介紹一下StoredProcedure的語法結(jié)構(gòu)和與Command對(duì)象的參數(shù)的傳遞問題。 StoredProcedure的標(biāo)準(zhǔn)寫法:(在SQL Server上用Query Analyzer執(zhí)行) Create Procedure Procedure_Name Define Parameter As SQL Structure 上 面的語法結(jié)構(gòu)中,Procedure_Name為存儲(chǔ)結(jié)構(gòu)的的名字,也是你將在Command中引用的名字。然后是定義輸出和輸入的參數(shù)。最后是一個(gè)SQL結(jié)構(gòu)化語句。下面是一個(gè)StoredProcedure的例子,它無需輸入的參數(shù),也沒有輸出。 Create Procedure Del_User
As Delect From Employee Where Job_ID=1 如果我們要?jiǎng)h除指定的 Job_ID該怎么辦呢?,這時(shí)我們需要給這個(gè)StoredProcedure輸入的參數(shù)。 Create Procedure Del_User1 @intID int As Delect From Employee Where Job_Id = @intID 好了,這里的@intJob就是一個(gè)輸入的參數(shù),它可以從外部接受輸入的值,下面是給它輸入的asp程序: set conn=Server.CreateObject("ADODB.Connection") set comm=Server.CreateObject("ADODB.Command") conn.ConnectionString="Driver={SQL Server};Server=ser;"& _ "uid=sa;pass=;database=employee " conn.open comm.ActiveConnection=conn comm.CommandType=adCmdStoredProc comm.CommandType="Del_User1" "這里的名字就是前面在SQL Server中定義過的StoredProcedure的名字。 "下面就是參數(shù)的輸入 param=comm.CreateParameter("ID",adInt,adParamInput,4) "這里的adParamInput定義是最重要的。 Param.Value=1 "這里的值可以輸入你想要的值,也可以用Request來獲得 Comm.Parameters.Append param Comm.Execute 這樣我們就可以向StoredProcedure傳遞參數(shù)了。有時(shí)在一個(gè)StoredProcedure中,還存在有輸出的參數(shù),下面是一個(gè)例子它返回一個(gè)Job_ID確定的Fri_Name的值 Create Procedure Get_fName @intID int @fName varChar Output "說明為輸出的參數(shù) As Select @fName = Fri_Name Where Job_ID = @intID 它相應(yīng)的asp程序也要改寫為下面的形式 set conn=Server.CreateObject("ADODB.Connection") set comm=Server.CreateObject("ADODB.Command") conn.ConnectionString="Driver={SQL Server};Server=ser;"&_ "uid=sa;psss=;database=employee" conn.open comm.ActiveConnection=conn comm.CommandType=adCmdStoredProc comm.CommandType="Get_fName" "這里的名字就是前面定義過的StoredProcedure的名字。 "下面就是參數(shù)的輸入 param=comm.CreateParameter("ID",adInt,adParamInput,4) "這里的adParamInput定義是最重要的。 Param.Value=2 "這里的值可以輸入你想要的值,也可以用Request來獲得 Comm.Parameters.Append param param=comm.CreateParameter("fName",adVarchar,adParamOutput,255,"") "這里的adParamOutput定義是最重要的。說明它是一個(gè)輸出的參數(shù),默認(rèn)的值 為一空的字符串 comm.Parameters.Append param Comm.Execute Response.Write "Job_Id為"¶m(0)&"的員工的首姓為"¶m(1) 我給大家簡(jiǎn)單介紹了一下StoredProcedure的基本概念,但StoredProcedure比較復(fù)雜,如果你想進(jìn)一步的深入,必須對(duì)SQL Server的結(jié)構(gòu)體系有全面的了解。另外,我們并沒有在上面的里子中體會(huì)到StoredProcedure的優(yōu)勢(shì),很多人會(huì)認(rèn)為那還不如用普通的方法,其實(shí)在構(gòu)建很多企業(yè)級(jí)的應(yīng)用時(shí)才能夠體會(huì)到用StoredProcedure的強(qiáng)大和必要性,這里我舉一個(gè)簡(jiǎn)單的例子。一個(gè)網(wǎng)絡(luò)銀行的數(shù)據(jù)庫(kù)(onLoan)中有兩個(gè)相關(guān)的表Loan表和LoanHistory表,loan表用于記錄貸款的信息,而每一筆貸款的記錄在Loan表中登記后都必須在LoanHistory表中登記,因?yàn)槎ㄆ诘慕Y(jié)算都是使用LoanHistory表的。你也許會(huì)說那很好辦啊。用兩個(gè)Insert Into語句分別向兩個(gè)表中插入記錄不就行了嗎!但要注意的是在這個(gè)應(yīng)用中,若記錄在任何的一個(gè)表中插入失敗都必須將整個(gè)的過程給取消(也就是一個(gè)事務(wù)的取消),那么若僅簡(jiǎn)單的使用兩個(gè)Insert Into語句的話,若是在第一個(gè)語句執(zhí)行完畢后,在第二個(gè)語句尚未完成時(shí)就發(fā)生了故障,這時(shí)第一個(gè)語句產(chǎn)生的效果是沒法消除的了。如果我們將這整個(gè)的過程定義為一個(gè)事務(wù),事務(wù)沒有完整的結(jié)束就Roll Back所有的影響不就達(dá)到了要求嗎?這在SQL Server中可以用Begin Transaction和Commit Transaction來完成的,例子如下: Create StoredProcedure insert_loan As Begin transaction Inset into Loan (Loan_ID,Loan_Data,Loan_amount) Values(?,?,?) Inset into Loan (Loan_ID,Loan_Data,Loan_amount,Loan_Describle) Values(?,?,?,?) Commit Transaction 好了,這看上去好象沒有什么不同吧,但需要注意的是我們現(xiàn)在將兩個(gè)Insert into語句作為了一個(gè)的事務(wù)來處理,只有兩個(gè)Insert into語句都完成的話才是一個(gè)整體的事務(wù)結(jié)束,那么它才會(huì)去作用這個(gè)數(shù)據(jù)庫(kù)中的兩個(gè)表,若在事務(wù)中發(fā)生了故障的話,則所有的影響將取消(Roll Back)。好了,這樣的處理是只有在SQL Server中用StoredProcedure才能完成的。ANSI的SQL當(dāng)然就不行了。這里講的大家可能不太明白,你可以參看SQL Server的手冊(cè)來作更多的了解。 下面我們來看最后的一個(gè)對(duì)象─RecordSet對(duì)象,也是屬性和方法最多的一個(gè)了。我們使用的頻率也是最高的一個(gè),在這之后,我還想談?wù)凙DO與ORACLE的一些問題。
|