欢迎光临
我们一直在努力

WebComputing━ADO总结报告5

建站超值云服务器,限时71元/月

五、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为"&para;m(0)&"的员工的首姓为"&para;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的一些问题。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » WebComputing━ADO总结报告5
分享到: 更多 (0)