五、StoredProcedure 在討論StoredProcedure之前,我還要對Command對象的Execute方法的作用進行一下闡述,一般來說使用Command的Execute方法有三個目的。1、用于進行一些簡單的處理,例如刪除一條記錄: comm.CommandType=AdCmdText comm.CommandText="Delect From employee Where Job_ID=1" comm.execute 這樣的工作不需要返回什么東西。2、用于進行一些復雜的處理,例如進行一個Transact的設計,這類一般都是和StoredProcedure一同工作的,而且有輸出參數和輸入的參數,這也是我們本章的討論主題。3、用于返回一個RecordSet對象,用于其它的處理,例如: 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是什么呢?它是一個預先存儲的數據庫執行動作集,在SQL的管理結構中,對于一個數據庫下有幾個部分,一個是數據表的集合、一個就是StoredProcedure的集合。將兩者結合可以完成很多強大的功能。StoredProcedure其實是對傳統的SQL語句的一種擴展,主要是在參數的輸入與輸出上。下面我大致的介紹一下StoredProcedure的語法結構和與Command對象的參數的傳遞問題。 StoredProcedure的標準寫法:(在SQL Server上用Query Analyzer執行) Create Procedure Procedure_Name Define Parameter As SQL Structure 上 面的語法結構中,Procedure_Name為存儲結構的的名字,也是你將在Command中引用的名字。然后是定義輸出和輸入的參數。最后是一個SQL結構化語句。下面是一個StoredProcedure的例子,它無需輸入的參數,也沒有輸出。 Create Procedure Del_User
As Delect From Employee Where Job_ID=1 如果我們要刪除指定的 Job_ID該怎么辦呢?,這時我們需要給這個StoredProcedure輸入的參數。 Create Procedure Del_User1 @intID int As Delect From Employee Where Job_Id = @intID 好了,這里的@intJob就是一個輸入的參數,它可以從外部接受輸入的值,下面是給它輸入的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的名字。 "下面就是參數的輸入 param=comm.CreateParameter("ID",adInt,adParamInput,4) "這里的adParamInput定義是最重要的。 Param.Value=1 "這里的值可以輸入你想要的值,也可以用Request來獲得 Comm.Parameters.Append param Comm.Execute 這樣我們就可以向StoredProcedure傳遞參數了。有時在一個StoredProcedure中,還存在有輸出的參數,下面是一個例子它返回一個Job_ID確定的Fri_Name的值 Create Procedure Get_fName @intID int @fName varChar Output "說明為輸出的參數 As Select @fName = Fri_Name Where Job_ID = @intID 它相應的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的名字。 "下面就是參數的輸入 param=comm.CreateParameter("ID",adInt,adParamInput,4) "這里的adParamInput定義是最重要的。 Param.Value=2 "這里的值可以輸入你想要的值,也可以用Request來獲得 Comm.Parameters.Append param param=comm.CreateParameter("fName",adVarchar,adParamOutput,255,"") "這里的adParamOutput定義是最重要的。說明它是一個輸出的參數,默認的值 為一空的字符串 comm.Parameters.Append param Comm.Execute Response.Write "Job_Id為"¶m(0)&"的員工的首姓為"¶m(1) 我給大家簡單介紹了一下StoredProcedure的基本概念,但StoredProcedure比較復雜,如果你想進一步的深入,必須對SQL Server的結構體系有全面的了解。另外,我們并沒有在上面的里子中體會到StoredProcedure的優勢,很多人會認為那還不如用普通的方法,其實在構建很多企業級的應用時才能夠體會到用StoredProcedure的強大和必要性,這里我舉一個簡單的例子。一個網絡銀行的數據庫(onLoan)中有兩個相關的表Loan表和LoanHistory表,loan表用于記錄貸款的信息,而每一筆貸款的記錄在Loan表中登記后都必須在LoanHistory表中登記,因為定期的結算都是使用LoanHistory表的。你也許會說那很好辦啊。用兩個Insert Into語句分別向兩個表中插入記錄不就行了嗎!但要注意的是在這個應用中,若記錄在任何的一個表中插入失敗都必須將整個的過程給取消(也就是一個事務的取消),那么若僅簡單的使用兩個Insert Into語句的話,若是在第一個語句執行完畢后,在第二個語句尚未完成時就發生了故障,這時第一個語句產生的效果是沒法消除的了。如果我們將這整個的過程定義為一個事務,事務沒有完整的結束就Roll Back所有的影響不就達到了要求嗎?這在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 好了,這看上去好象沒有什么不同吧,但需要注意的是我們現在將兩個Insert into語句作為了一個的事務來處理,只有兩個Insert into語句都完成的話才是一個整體的事務結束,那么它才會去作用這個數據庫中的兩個表,若在事務中發生了故障的話,則所有的影響將取消(Roll Back)。好了,這樣的處理是只有在SQL Server中用StoredProcedure才能完成的。ANSI的SQL當然就不行了。這里講的大家可能不太明白,你可以參看SQL Server的手冊來作更多的了解。 下面我們來看最后的一個對象─RecordSet對象,也是屬性和方法最多的一個了。我們使用的頻率也是最高的一個,在這之后,我還想談談ADO與ORACLE的一些問題。
|