WebComputing━ADO總結報告5

來源:互聯網
上載者:User
ado|web 五、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的一些問題。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。