asp与存储过程
上一篇 / 下一篇 2007-07-11 14:47:03 / 个人分类:ASP
存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
2]DT6G$E9K0 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个:
'Fr b#w2F2U7nU4c0 第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。
G9s!Ty6g?0 第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。
Z8d_ e }+v {"zXv0 第三、有利于SQL语句的重用。51Testing软件测试网|8`(@8_Ii:t
#t sX#aZV2|2`0 在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类:
H
~-ziiezs0 1. 只返回单一记录集的存储过程51Testing软件测试网^8M6lr:F:Pd,H
假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明):
/*SP1*/
)R'T5_Gaz0 CREATE PROCEDURE dbo.getUserList51Testing软件测试网_o `/]g
C4}2@r
as51Testing软件测试网#eeV?3[M;RS-S+e/K
set nocount on51Testing软件测试网&?
_$Nt7B]x([
begin51Testing软件测试网i,iRr%K1c sh(VR
select * from dbo.[userinfo]
7Wr!o`"l&O0 end
3i9H9\BG
_2C0 go
!zLcH3De0 以上存储过程取得userinfo表中的所有记录,返回一个记录集。通过command对象调用该存储过程的ASP代码如下:51Testing软件测试网Y2h!}%M,P9A,p
a5dF,T:Bff(\0 '**通过Command对象调用存储过程**
pd:?SK-zOmB0 DIM MyComm,MyRst51Testing软件测试网(^@NM$am
Set MyComm = Server.CreateObject("ADODB.Command")51Testing软件测试网Qv#ila
MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串51Testing软件测试网5a+|7}r)|"~)F?T,\
MyComm.CommandText = "getUserList" '指定存储过程名
[uQ p KDe0 MyComm.CommandType = 4 '表明这是一个存储过程
7{*o.Q;oY utU0 MyComm.Prepared = true '要求将SQL命令先行编译51Testing软件测试网Gxa,p5C
Set MyRst = MyComm.Execute
:A:n.J3|
j T%N ]0 Set MyComm = Nothing
存储过程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。51Testing软件测试网}{+pkH,AT`K
在以上代码中,CommandType属性表明请求的类型,取值及说明如下:51Testing软件测试网5y?q3N&^q
-1 表明CommandText参数的类型无法确定51Testing软件测试网i$j9m\P;d
1 表明CommandText是一般的命令类型51Testing软件测试网8d j5Jo(j1L5[Z p$N s
2 表明CommandText参数是一个存在的表名称
BL i
A}E&@0 4 表明CommandText参数是一个存储过程的名称51Testing软件测试网F!y_KDn
T~g^%K`0 还可以通过Connection对象或Recordset对象调用存储过程,方法分别如下:51Testing软件测试网xr7K"pG Q)~q)l
'**通过Connection对象调用存储过程**51Testing软件测试网f#F1x#SZ.Lh1S
DIM MyConn,MyRst
*q0`MA4ri
c9kk0 Set MyConn = Server.CreateObject("ADODB.Connection")
P]N_b:i0 MyConn.open MyConStr 'MyConStr是数据库连接字串51Testing软件测试网(@m+XuYTgR
Set MyRst = MyConn.Execute("getUserList",0,4) '最后一个参断含义同CommandType51Testing软件测试网kZ(FJ1BP
Set MyConn = Nothing51Testing软件测试网:AG#b/C[}%m
Kj6t5d%?^
l\0 '**通过Recordset对象调用存储过程**51Testing软件测试网h(Q4z~S/o~*i's
DIM MyRst51Testing软件测试网,Y-fl1w:P
Set MyRst = Server.CreateObject("ADODB.Recordset")51Testing软件测试网*P9PZ1]!O1EFD
MyRst.open "getUserList",MyConStr,0,1,4
9D*Z&T+g4N$S0n7rC0 'MyConStr是数据库连接字串,最后一个参断含义与CommandType相同51Testing软件测试网:jF)j(G/A[
51Testing软件测试网2fN?6o OV
2. 没有输入输出的存储过程
D/]sU{)U0 请看以下存储过程:51Testing软件测试网4UM`)hs9sA
/*SP2*/
7i,@M7XJ0 CREATE PROCEDURE dbo.delUserAll51Testing软件测试网e)p]3p5i|R
as
`'a%piMx$M0 set nocount on
,y%qX qKI;v0 begin
p
H3R'J-O]@quK0 delete from dbo.[userinfo]
$Jhu&d8U&HIH0 end
!GKb!~AaL0 go51Testing软件测试网3z _G;s,W)^(z-B"T
'p U8vD0N ?}0 该存储过程删去userinfo表中的所有记录,没有任何输入及输出,调用方法与上面讲过的基本相同,只是不用取得记录集:51Testing软件测试网d-|*nyu/\7~
51Testing软件测试网 ztar$qJSQ ? '**通过Command对象调用存储过程**51Testing软件测试网[#b)Rt1P{;} F7Mps
DIM MyComm51Testing软件测试网-P3y-c j;qOk
Set MyComm = Server.CreateObject("ADODB.Command")51Testing软件测试网!en^'jvt
MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串51Testing软件测试网p0YZ)O:h/`e
MyComm.CommandText = "delUserAll" '指定存储过程名51Testing软件测试网L6HO(J-KN,nj
MyComm.CommandType = 4 '表明这是一个存储过程
`%cq \-hp2j0 MyComm.Prepared = true '要求将SQL命令先行编译51Testing软件测试网'{ g4PT!d\S
MyComm.Execute '此处不必再取得记录集
:dzZxyWgF0 Set MyComm = Nothing
0m![ Bw6J"N9`0 当然也可通过Connection对象或Recordset对象调用此类存储过程,不过建立Recordset对象是为了取得记录集,在没有返回记录集的情况下,还是利用Command对象吧。
)z!^h!^be0
sF/B-ONc{*\#m v051Testing软件测试网IT'jY[IigR
@
3. 有返回值的存储过程51Testing软件测试网B*^0fGM"\C N\
在进行类似SP2的操作时,应充分利用SQL Server强大的事务处理功能,以维护数据的一致性。并且,我们可能需要存储过程返回执行情况,为此,将SP2修改如下:51Testing软件测试网!UVz^8O,qE1~2J
r)Ag!CnAd0 /*SP3*/
K8c"G%C+B6B
e]!M0 CREATE PROCEDURE dbo.delUserAll
GgYl4gnL3_h?0 as
UQg9A$LXA0 set nocount on51Testing软件测试网D`R8?tx"[rr
begin
S
J]wl@#lLr0 BEGIN TRANSACTION
-i[5eM;|Q7id!tV0 delete from dbo.[userinfo]