ASP 3.0高级编程(四十二)
程序员文章站
2023-10-27 20:43:46
5. 返回值
对函数返回值的处理不同于存储过程返回值的处理,这常常导致混淆。在函数中,经常是返回一个布尔值来表明函数运行的成功与否。
if somefunctionname()...
5. 返回值
对函数返回值的处理不同于存储过程返回值的处理,这常常导致混淆。在函数中,经常是返回一个布尔值来表明函数运行的成功与否。
if somefunctionname() = true then
function succeeded
但在调用一个存储过程时,却不能使用同样的方法,因为存储是用execute方法运行的,同时返回一个记录集。
set rsauthors = cmdauthors.execute
如果得不到一个返回值,如何确定是否已正确执行存储过程?当发生错误时,会报告错误,这样就可使用前一章提供的错误处理代码来处理错误。但对于一些非致命的逻辑错误怎么办?
例如,考虑向employee表添加一个新职员的情形。你可能不想防止两个职员同名的情况,但想注明这个情况。那么,可以使用一个返回值以表明是否已有同名的职员存在。存储过程如下:
create procedure usp_addemployee
@emp_id char(9),
@fname varchar(20),
@minit char(1),
@lname varchar(30),
@job_id smallint,
@job_lvl tinyint,
@pub_id char(4),
@hire_date datetime
as
begin
declare @exists int -- return value
-- see if an employee with the same name exists
if exists(select *
from employee
where fname = @fname
and minit = @minit
and lname = @lname)
select @exists = 1
else
select @exists = 0
insert into employee (emp_id, fname, minit, lname,
job_id, job_lvl, pub_id, hire_date)
values (@emp_id, @fname, @minit, @lname, @job_id,
@job_lvl, @pub_id, @hire_date)
return @exists
end
该过程首先检查是否有同名的职员存在,并据此设定相应的变量exists,若存在同名,就设为1,否则为0。然后将该职员加到表中,同时把exists的值作为返回值返回。
注意尽管返回了一个值,但并未将其声明为存储过程的参数。
调用该过程的asp代码如下:
<!-- #include file="../include/connection." -->
<%
dim cmdemployee
dim lngrecs
dim lngadded
set cmdemployee = server.createobject("adodb.command")
set the properties of the command
with cmdemployee
.activeconnection = strconn
.commandtext = "usp_addemployee"
.commandtype = adcmdstoredproc
create the parameters
notice that the return value is the first parameter
.parameters.append .createparameter ("return_value", adinteger, _
adparamreturnvalue)
.parameters.append .createparameter ("@emp_id", adchar, adparaminput, 9)
.parameters.append .createparameter ("@fname", advarwchar, adparaminput, 20)
.parameters.append .createparameter ("@minit", adchar, adparaminput, 1)
.parameters.append .createparameter ("@lname", advarwchar, adparaminput, 30)
.parameters.append .createparameter ("@job_id", adsmallint, adparaminput)
.parameters.append .createparameter ("@job_lvl", adunsignedtinyint, adparaminput)
.parameters.append .createparameter ("@pub_id", adchar, adparaminput, 4)
.parameters.append .createparameter ("@hire_date", addbtimestamp, _
adparaminput, 8)
set the parameter values
.parameters("@emp_id") = request.form("txtempid")
.parameters("@fname") = request.form("txtfirstname")
.parameters("@minit") = request.form("txtinitial")
.parameters("@lname") = request.form("txtlastname")
.parameters("@job_id") = request.form("lstjobs")
.parameters("@job_lvl") = request.form("txtjoblevel")
.parameters("@pub_id") = request.form("lstpublisher")
.parameters("@hire_date") = request.form("txthiredate")
run the stored procedure
.execute lngrecs, , adexecutenorecords
extract the return value
lngadded = .parameters("return_value")
end with
response.write "new employee added.<p>"
if lngadded = 1 then
response.write "an employee with the same name already exists."
end if
set cmdemployee = nothing
%>
需要重点注意,返回值应当作为集合中第一个参数被创建。即使返回值并不作为一个参数出现在存储过程中,总是parameters集合中的第一个parameters。
因此,特别强调一点:
存储过程的返回值必须声明为parameters集合中第一个参数,同时参数的direction值必须为adparamreturnvalue。
使用返回值
现在定义一个初始窗体,如图9-
对函数返回值的处理不同于存储过程返回值的处理,这常常导致混淆。在函数中,经常是返回一个布尔值来表明函数运行的成功与否。
if somefunctionname() = true then
function succeeded
但在调用一个存储过程时,却不能使用同样的方法,因为存储是用execute方法运行的,同时返回一个记录集。
set rsauthors = cmdauthors.execute
如果得不到一个返回值,如何确定是否已正确执行存储过程?当发生错误时,会报告错误,这样就可使用前一章提供的错误处理代码来处理错误。但对于一些非致命的逻辑错误怎么办?
例如,考虑向employee表添加一个新职员的情形。你可能不想防止两个职员同名的情况,但想注明这个情况。那么,可以使用一个返回值以表明是否已有同名的职员存在。存储过程如下:
create procedure usp_addemployee
@emp_id char(9),
@fname varchar(20),
@minit char(1),
@lname varchar(30),
@job_id smallint,
@job_lvl tinyint,
@pub_id char(4),
@hire_date datetime
as
begin
declare @exists int -- return value
-- see if an employee with the same name exists
if exists(select *
from employee
where fname = @fname
and minit = @minit
and lname = @lname)
select @exists = 1
else
select @exists = 0
insert into employee (emp_id, fname, minit, lname,
job_id, job_lvl, pub_id, hire_date)
values (@emp_id, @fname, @minit, @lname, @job_id,
@job_lvl, @pub_id, @hire_date)
return @exists
end
该过程首先检查是否有同名的职员存在,并据此设定相应的变量exists,若存在同名,就设为1,否则为0。然后将该职员加到表中,同时把exists的值作为返回值返回。
注意尽管返回了一个值,但并未将其声明为存储过程的参数。
调用该过程的asp代码如下:
<!-- #include file="../include/connection." -->
<%
dim cmdemployee
dim lngrecs
dim lngadded
set cmdemployee = server.createobject("adodb.command")
set the properties of the command
with cmdemployee
.activeconnection = strconn
.commandtext = "usp_addemployee"
.commandtype = adcmdstoredproc
create the parameters
notice that the return value is the first parameter
.parameters.append .createparameter ("return_value", adinteger, _
adparamreturnvalue)
.parameters.append .createparameter ("@emp_id", adchar, adparaminput, 9)
.parameters.append .createparameter ("@fname", advarwchar, adparaminput, 20)
.parameters.append .createparameter ("@minit", adchar, adparaminput, 1)
.parameters.append .createparameter ("@lname", advarwchar, adparaminput, 30)
.parameters.append .createparameter ("@job_id", adsmallint, adparaminput)
.parameters.append .createparameter ("@job_lvl", adunsignedtinyint, adparaminput)
.parameters.append .createparameter ("@pub_id", adchar, adparaminput, 4)
.parameters.append .createparameter ("@hire_date", addbtimestamp, _
adparaminput, 8)
set the parameter values
.parameters("@emp_id") = request.form("txtempid")
.parameters("@fname") = request.form("txtfirstname")
.parameters("@minit") = request.form("txtinitial")
.parameters("@lname") = request.form("txtlastname")
.parameters("@job_id") = request.form("lstjobs")
.parameters("@job_lvl") = request.form("txtjoblevel")
.parameters("@pub_id") = request.form("lstpublisher")
.parameters("@hire_date") = request.form("txthiredate")
run the stored procedure
.execute lngrecs, , adexecutenorecords
extract the return value
lngadded = .parameters("return_value")
end with
response.write "new employee added.<p>"
if lngadded = 1 then
response.write "an employee with the same name already exists."
end if
set cmdemployee = nothing
%>
需要重点注意,返回值应当作为集合中第一个参数被创建。即使返回值并不作为一个参数出现在存储过程中,总是parameters集合中的第一个parameters。
因此,特别强调一点:
存储过程的返回值必须声明为parameters集合中第一个参数,同时参数的direction值必须为adparamreturnvalue。
使用返回值
现在定义一个初始窗体,如图9-
上一篇: python中装饰器的原理
下一篇: 快速掌握用python写并行程序