用存儲(chǔ)過(guò)程完成ASP對(duì)數(shù)據(jù)庫(kù)訪問(wèn)
發(fā)表時(shí)間:2024-02-02 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]一、ADO概述ActiveX 數(shù)據(jù)對(duì)象 (ADO) 是一種既易于使用又可擴(kuò)充的技術(shù),用來(lái)將數(shù)據(jù)庫(kù)訪問(wèn)添加到您的 Web 頁(yè)可以使用 ADO 編寫(xiě)簡(jiǎn)潔和可升級(jí)的腳本以連接到與 OLE DB 兼容的數(shù)據(jù)源,如數(shù)據(jù)庫(kù)、電子表格、順序數(shù)據(jù)文件或電子郵件目錄。OLE DB 是一個(gè)系統(tǒng)級(jí)的編程接口,它提供一套...
ActiveX 數(shù)據(jù)對(duì)象 (ADO) 是一種既易于使用又可擴(kuò)充的技術(shù),用來(lái)將數(shù)據(jù)庫(kù)訪問(wèn)添加到您的 Web 頁(yè)可以使用 ADO 編寫(xiě)簡(jiǎn)潔和可升級(jí)的腳本以連接到與 OLE DB 兼容的數(shù)據(jù)源,如數(shù)據(jù)庫(kù)、電子表格、順序數(shù)據(jù)文件或電子郵件目錄。OLE DB 是一個(gè)系統(tǒng)級(jí)的編程接口,它提供一套標(biāo)準(zhǔn)的 COM 接口,用來(lái)展示數(shù)據(jù)庫(kù)管理系統(tǒng)的功能。使用 ADO 的對(duì)象模型,您可以輕松地(使用 VBScript 或 JScript 等腳本語(yǔ)言)訪問(wèn)這些接口并將數(shù)據(jù)庫(kù)功能添加到您的 Web 應(yīng)用程序中。另外,您還可以使用 ADO 訪問(wèn)與開(kāi)放式數(shù)據(jù)庫(kù)互連 (ODBC) 兼容的數(shù)據(jù)庫(kù)。 |
如果您是一位對(duì)數(shù)據(jù)庫(kù)互連知識(shí)有一定了解的腳本編寫(xiě)者,您將會(huì)發(fā)現(xiàn) ADO 的命令語(yǔ)法很簡(jiǎn)單,而且很容易使用。如果您是一位經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員,您將會(huì)非常欣賞 ADO 提供的這種可升級(jí)的對(duì)各種數(shù)據(jù)源的高性能訪問(wèn)。 |
二、訪問(wèn)數(shù)據(jù)庫(kù)的一般方法 |
一般的網(wǎng)頁(yè)訪問(wèn)中訪問(wèn)數(shù)據(jù)庫(kù)是按照下列步驟進(jìn)行的,首先建立一個(gè)ADODB.Connection 接口的對(duì)象,接著在這一個(gè)對(duì)象上綁定相應(yīng)的數(shù)據(jù)源(可以用有名數(shù)據(jù)源和無(wú)名數(shù)據(jù)源),根據(jù)需要建立或者不建立記錄集,然后在該數(shù)據(jù)源上鏈接用執(zhí)行或打開(kāi)的方法來(lái)對(duì)相應(yīng)的表進(jìn)行操作。 |
Asp訪問(wèn)數(shù)據(jù)庫(kù)的一般方法: |
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") |
set ORS=oConn.execute(“select * from test”) |
以上介紹了無(wú)名鏈接的OLEDB的使用方法,如果是有名鏈接,設(shè)為數(shù)據(jù)源test,用戶名和口令均為空,則只需要改寫(xiě)一下上述語(yǔ)句oConn.open “test”,””,”” |
上面簡(jiǎn)要介紹了一下對(duì)于網(wǎng)頁(yè)中涉及到數(shù)據(jù)庫(kù)訪問(wèn)的一般方法,這些已經(jīng)是很成熟的,也是很有用的,如果在實(shí)際中對(duì)于某些數(shù)據(jù)的存取過(guò)于復(fù)雜,需要近10條SQL語(yǔ)句才能寫(xiě)完,那么這種方法就有點(diǎn)欠缺,另外有些時(shí)候需要使用相同的處理過(guò)程,而在不同的網(wǎng)頁(yè)中使用,而這用存儲(chǔ)過(guò)程則是最有利的,還有一個(gè)最大特點(diǎn)是存儲(chǔ)過(guò)程對(duì)于技術(shù)的保密性相對(duì)高些,它存儲(chǔ)于遠(yuǎn)端服務(wù)器的數(shù)據(jù)庫(kù)內(nèi)。 |
在ADO中提供了對(duì)存儲(chǔ)過(guò)程的訪問(wèn),它需要用到command對(duì)象,在這個(gè)對(duì)象上用戶可以直接執(zhí)行SQL服務(wù)器的存儲(chǔ)過(guò)程,而命令中所需要的參數(shù)可以借助于其屬性Pamaters來(lái)進(jìn)行處理。 |
注意 一個(gè) Command 對(duì)象要想有效,必須和一個(gè) Connection 對(duì)象相關(guān)聯(lián),方法是Command 對(duì)象的 ActiveConnection 屬性就被設(shè)置到這個(gè) Connection 對(duì)象。如果一個(gè) Connection 對(duì)象不能被標(biāo)識(shí),在您將它與一個(gè)連接關(guān)聯(lián)之前,Command 對(duì)象是無(wú)效的。 |
Set oConn = Server.CreateObject("ADODB.Connection") |
set oCmd = Server.CreateObject("ADODB.Command") |
set ors1=Server.CreateObject("ADODB.RecordSet") |
' 打開(kāi)鏈接,使用用戶標(biāo)識(shí)SA,口令為空,連接為本地服務(wù)器上的數(shù)據(jù)庫(kù) |
strConn="Provider=SQLOLEDB;User ID=sa;Initial Catalog=pubs;Data Source="& Request.ServerVariables("SERVER_NAME") |
'如果連接一個(gè)遠(yuǎn)端的數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)地址為:10.82.88.105,用戶為tmp,口令為123, |
‘ strConn="Provider=SQLOLEDB;User ID=tmp;pwd=123;Initial Catalog=tjbb;Data Source="& "10.82.88.110" |
‘將建立的鏈接添加到命令的活動(dòng)鏈接屬性中 |
Set oCmd.ActiveConnection = oConn |
' 設(shè)置調(diào)用存儲(chǔ)過(guò)程byroyalty和參數(shù),參數(shù)由?引入 |
oCmd.CommandText = "{call byroyalty(?)}" |
oCmd.Parameters.Append oCmd.CreateParameter("@Percentage", adInteger, adParamInput) |
‘在asp中上述輸入?yún)?shù)的使用也可不用參數(shù)屬性來(lái)實(shí)現(xiàn)直接用VB中的&來(lái)形成命令文本中對(duì)應(yīng)的數(shù)據(jù)即可 |
‘參數(shù)的使用在輸出時(shí)是特別有用的 |
ors1.activeconnection=oconn |
‘該命令對(duì)象中也可應(yīng)用一般的SQL語(yǔ)句使用Source和open屬性,其中source指出數(shù)據(jù)源 |
ors1.source ="select * from [tmptable] where 年份=2000 and 月份=1" |
ors1.cursortype=adopenstatic |
四、在SQL中的存儲(chǔ)過(guò)程簡(jiǎn)介 |
利用SQL的語(yǔ)言可以編寫(xiě)對(duì)于數(shù)據(jù)庫(kù)訪問(wèn)的存儲(chǔ)過(guò)程,其語(yǔ)法如下: |
CREATE PROC[EDURE] procedure_name [;number] |
{@parameter data_type} [VARYING] [= default] [OUTPUT] |
[ ]內(nèi)的內(nèi)容是可選項(xiàng),而()內(nèi)的內(nèi)容是必選項(xiàng), |
例: 若用戶想建立一個(gè)刪除表tmp中的記錄的存儲(chǔ)過(guò)程Select_delete可寫(xiě)為: |
Create Proc select_del As |
例:用戶想查詢tmp表中某年的數(shù)據(jù)的存儲(chǔ)過(guò)程 |
create proc select_query @year int as |
select * from tmp where year=@year |
在這里@year是存儲(chǔ)過(guò)程的參數(shù) |
例:該存儲(chǔ)過(guò)程是從某結(jié)點(diǎn)n開(kāi)始找到最上層的父親結(jié)點(diǎn),這種經(jīng)常用到的過(guò)程可以由存儲(chǔ)過(guò)程來(lái)?yè)?dān)當(dāng),在網(wǎng)頁(yè)中重復(fù)使用達(dá)到共享。 |
空:表示該結(jié)點(diǎn)為頂層結(jié)點(diǎn) |
fjdid(父結(jié)點(diǎn)編號(hào)) |
結(jié)點(diǎn)n 非空:表示該結(jié)點(diǎn)的父親結(jié)點(diǎn)號(hào) |
CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output |
declare @result varchar(80) |
declare @dwmc varchar(80) |
select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold |
while (@stop=1) and (@dwid<>0) |
select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold |
set @result=@dwmc+@result |
if (@dwid=0) or (@@rowcount=0) |
set @dwmcresult=rtrim(@result) |
充分合理地利用存儲(chǔ)過(guò)程,可以提高服務(wù)器吞吐能力,筆者利用存儲(chǔ)過(guò)程來(lái)從近20個(gè)表中獲取數(shù)據(jù)組合成一個(gè)通用的表,產(chǎn)生近2萬(wàn)條記錄,而所需時(shí)間約7秒鐘,如果這種操作借助于較合理的動(dòng)態(tài)網(wǎng)頁(yè)可以將服務(wù)器開(kāi)發(fā)提高到一個(gè)高度,充分利用存儲(chǔ)過(guò)程,可以減輕網(wǎng)頁(yè)設(shè)計(jì)帶來(lái)的繁重處理,而使所編寫(xiě)的代碼得到共享和合理的利用,并將代碼藏于服務(wù)器的數(shù)據(jù)庫(kù)內(nèi)部,使得一些技術(shù)得到的保密,這也是存儲(chǔ)過(guò)程的一大特色,希望讀者能從中得到啟益。 |