用預存程序實現ASP對資料庫訪問
作者:Eve Cole
更新時間:2009-06-24 17:21:43
一、ADO概述
ActiveX 資料物件(ADO) 是一種既易於使用又可擴充的技術,用來將資料庫存取新增至您的Web 頁可使用ADO 編寫簡潔且可升級的腳本以連接至與OLE DB 相容的資料來源,如資料庫、電子表格、順序資料檔或電子郵件目錄。 OLE DB 是一個系統級的程式設計接口,它提供一套標準的COM 接口,用來展示資料庫管理系統的功能。使用ADO 的物件模型,您可以輕鬆地(使用VBScript 或JScript 等腳本語言)存取這些介面並將資料庫功能新增至您的Web 應用程式。另外,您也可以使用ADO 存取與開放式資料庫互連(ODBC) 相容的資料庫。
如果您是一位對資料庫互連知識有一定了解的腳本編寫者,您將會發現ADO 的命令語法很簡單,而且很容易使用。如果您是一位經驗豐富的開發人員,您將會非常欣賞ADO 提供的這種可升級的對各種資料來源的高效能存取。
二、存取資料庫的一般方法一般的網頁存取中存取資料庫是按照下列步驟進行的,首先建立一個ADODB.Connection 介面的對象,接著在這一個對像上綁定相應的資料來源(可以用有名資料來源和無名資料來源),根據需要建立或不建立記錄集,然後在該資料來源上連結執行或開啟的方法來對對應的表進行操作。
Asp存取資料庫的一般方法:
<
Set oConn=Server.CreateObject(“ADODB.Connection”)
Set oRS=Server.CreateObject(“ADODB.RecordSet”)
set strConn="Provider=SQLOLEDB;User ID=sa; Initial Catalog=Pubs;Data Source=" &request.ServerVariables("SERVER_NAME")
oConn.open strConn
set ORS=oConn.execute(“select * from test”)
>
以上介紹了無名鏈接的OLEDB的使用方法,如果是有名鏈接,設為數據源test,用戶名和口令均為空,則只需要改寫一下上述語句oConn.open “test”,””,””
上面簡要介紹了一下對於網頁中涉及到資料庫存取的一般方法,這些已經是很成熟的,也是很有用的,如果在實際中對於某些資料的存取過於複雜,需要近10條SQL語句才能寫完,那麼這種方法就有點欠缺,另外有些時候需要使用相同的處理過程,而在不同的網頁中使用,而這用存儲過程則是最有利的,還有一個最大特點是存儲過程對於技術的保密性相對高些,它儲存於遠端伺服器的資料庫內。
三、預存程序在ASP中的使用在ADO中提供了對預存程序的訪問,它需要用到command對象,在這個對像上用戶可以直接執行SQL伺服器的預存過程,而命令中所需要的參數可以藉助於其屬性Pamaters來進行處理。
注意一個Command 物件想要有效,必須和一個Connection 物件相關聯,方法是Command 物件的ActiveConnection 屬性就被設定到這個Connection 物件。如果一個Connection 物件不能被標識,在您將它與一個連線關聯之前,Command 物件是無效的。
< Dim oConn
Dim strConn
Dim oCmd
Dim oRs,ors1
dim aa
dim sql
Set oConn = Server.CreateObject("ADODB.Connection")
set oCmd = Server.CreateObject("ADODB.Command")
set ors1=Server.CreateObject("ADODB.RecordSet")
' 開啟鏈接,使用使用者標識SA,口令為空,連接為本地伺服器上的資料庫
strConn="Provider=SQLOLEDB;User ID=sa;Initial Catalog=pubs;Data Source="& Request.ServerVariables("SERVER_NAME")
'若連接遠端的資料庫,資料庫位址為:10.82.88.105,使用者為tmp,口令為123,
'則可用下面的方法' strConn="Provider=SQLOLEDB;User ID=tmp;pwd=123;Initial Catalog=tjbb;Data Source="& "10.82.88.110"
oConn.Open strConn
'將建立的連結加入到指令的活動連結屬性中
Set oCmd.ActiveConnection = oConn
' 設定呼叫預存程序byroyalty和參數,參數由?引入
oCmd.CommandText = "{call byroyalty(?)}"
oCmd.Parameters.Append oCmd.CreateParameter("@Percentage", adInteger, adParamInput)
' 提供輸入的參數
oCmd("@Percentage") = 75
'在asp中上述輸入參數的使用也可不用參數屬性來實現直接用VB中的&來形成命令文本中對應的數據即可'參數的使用在輸出時是特別有用的
Set oRs = oCmd.Execute
ors1.activeconnection=oconn
'該指令物件中也可應用一般的SQL語句使用Source和open屬性,其中source指出資料來源
ors1.source ="select * from [tmptable] where 年份=2000 and 月份=1"
ors1.cursortype=adopenstatic
ors1.open
>
四、在SQL中的預存程序簡介利用SQL的語言可以編寫對於資料庫存取的預存過程,其語法如下:
CREATE PROC[EDURE] procedure_name [;number]
[
{@parameter data_type} [VARYING] [= default] [OUTPUT]
]
[,...n]
[WITH
{
RECOMPILE
| ENCRYPTION
| RECOMPILE, ENCRYPTION
}
]
[FOR REPLICATION]
AS
sql_statement [...n]
[ ]內的內容是可選項,而()內的內容是必選項,
例: 若使用者想要建立一個刪除表tmp中的記錄的預存程序Select_delete可寫為:
Create Proc select_del As
Delete tmp
例:使用者想查詢tmp表中某年的資料的預存程序
create proc select_query @year int as
select * from tmp where year=@year
這裡@year是預存程序的參數範例:該預存程序是從某結點n開始找到最上層的父親結點,這種常用到的過程可以由預存程序來擔當,在網頁中重複使用達到共享。
空:表示該結點為頂層結點
fjdid(父結點編號)
結點n 非空:表示該結點的父親結點號
dwmc(單位名稱)
CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output
as
declare @stop int
declare @result varchar(80)
declare @dwmc varchar(80)
declare @dwid int
set nocount on
set @stop=1
set @dwmc=""
select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold
set @result=rtrim(@dwmc)
if @dwid=0
set @stop=0
while (@stop=1) and (@dwid<>0)
begin
set @dwidold=@dwid
select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold
if @@rowcount=0
set @dwmc=""
else
set @result=@dwmc+@result
if (@dwid=0) 或 (@@rowcount=0)
set @stop=0
else
continue
end
set @dwmcresult=rtrim(@result)
充分合理地利用預存程序,可以提高伺服器吞吐能力,筆者利用預存程序來從近20個表中取得資料組合成一個通用的表,產生近2萬筆記錄,而所需時間約7秒鐘,如果這種操作借助於較合理的動態網頁可以將伺服器開發提高到一個高度,充分利用預存過程,可以減輕網頁設計帶來的繁重處理,而使所編寫的程式碼得到共享和合理的利用,並將程式碼藏於伺服器的資料庫內部,使得一些技術得到的保密,這也是預存過程的一大特色,希望讀者能從中得到啟益。