用存储过程实现ASP对数据库访问

一、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) or (@@rowcount=0)  
set @stop=0 
else 
continue 
end 
set @dwmcresult=rtrim(@result)

充分合理地利用存储过程,可以提高服务器吞吐能力,笔者利用存储过程来从近20个表中获取数据组合成一个通用的表,产生近2万条记录,而所需时间约7秒钟,如果这种操作借助于较合理的动态网页可以将服务器开发提高到一个高度,充分利用存储过程,可以减轻网页设计带来的繁重处理,而使所编写的代码得到共享和合理的利用,并将代码藏于服务器的数据库内部,使得一些技术得到的保密,这也是存储过程的一大特色,希望读者能从中得到启益。

发表评论