ASP 3.0高级编程(四十二)

编程|高级

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.asp" -->
<%
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。
[1] [2] [3] 下一页  

时间: 2024-11-03 04:22:09

ASP 3.0高级编程(四十二)的相关文章

ASP 3.0高级编程(十二)

编程|高级 4.2.3 服务器端包含指令的例子本节提供了一些示例页面,可以用来对各种服务器端包含语句进行实验.打开示例网页的子目录Chapter04,显示"SSI Directives and the ASP Server Object"主页(即子目录Chapter04中的Default.asp),如图4-3所示: 图4-3 示例网页本书的所有示例都可以从我们的Web网站下载.读者将在示例的子目录Chapter04中发现本章其余部分的所有示例页面.1. 使用SSI/CGI处理指令单击链

ASP 3.0高级编程(十四)

编程|高级 4.3.3 执行其他的网页ASP 3.0和IIS 5.0的新特性之一就是引入了可编程的服务器端重定向(server-side redirection)的概念.这意味着,可以把一个网页的控制和执行转到另外一个网页,而不需要在客户端使用Response.Rdedirect方法.1. 客户端重定向带来的问题ASP编程人员通常使用Response.Redirect语句把一个页面载入到当前正在执行的网页.然而,许多人没有意识到这条语句不会自动地使服务器立即装入和执行新的网页.其真正做的是把一个

ASP 3.0高级编程(十五)

编程|高级 4.3.4 Server对象的错误处理ASP没有错误处理机制一直受到批评.在VBScript中,有一个On Error Resume Next语句,它使脚本解释器忽略运行期错误并继续脚本代码的执行.接着该脚本可以检查Err.Number属性的值,判别是否出现了错误.如果出现错误,返回一个非零值.在ASP 3.0中,也可以使用On Error Goto 0"转回到"缺省的错误处理.在ASP 2.0中实际也进行这种处理,但是没有相应文档说明.在Jscript中,有一个新的错误处

ASP 3.0高级编程(十八)

编程|高级 5.2.5 引用对象类型库在早先的ASP版本中,在脚本中使用对象或组件时,组件内定义的公共常数(如果有的话)在ASP里将不再有效.这意味着我们需要自己声明它们(或等价物)并指定相应的值.例如,当在早期版本的ASP中使用ActiveX数据库对象(ADO)组件时(将在第8章进行详细的研究),不得不用记录集的Open方法加入预定义常数声明.例如:Const adOpenKeyset = &H0001Const adLockPessimistic = &H0003Const adCmd

ASP 3.0高级编程(十)

编程|高级 (1) 遍历Contents集合的代码为了遍历Contents集合,可使用一个For Each ... Next结构.集合中的每一项可以是一个简单的Variant类型变量.一个Variant数组或者一个对象的引用.因为需要对每种类型的值进行不同的处理,所以就不得不对每一个进行检查来判别其类型.在VBScript中可使用VarType函数完成这个工作.这里使用IsObject和IsArray函数代替:For Each objItem in Application.ContentsIf

ASP 3.0高级编程(十九)

编程|高级 5.3.2 Dictionary对象示例本书提供了一系列示例文件可用来试验脚本运行时间库的各种属性.本章代码的缺省页面提供了一系列可使用的VBScript示例链接.有些示例对JScript同样有效.这些示例存放在Chapter05目录下相应的子目录里,显示的界面如图5-2所示: 图5-2 ASP脚本运行期对象示例页面要查看Dictionary对象的运行,在菜单页面点击第一个链接,打开名叫show_dictionary.asp的页面.这个页面显示了我们提供的Dictionary对象的内

ASP 3.0高级编程(十六)

编程|高级 4.3.5 获取Server对象的路径信息在对存储在Web网站上的文件进行操作时,需要获得文件的实际的物理路径,而不是使用虚拟路径或URL,尽管在其他网页中能用它们正常地定位文件.下一章中有一个例子,它使用FileSystemObject对Web站点的InetPub\WWWRoot文件夹中的文件进行读写.当创建自己的定制组件或者使用商业化的组件对文件系统进行访问时,经常需要为其提供一个文件的物理路径.Server对象的MapPath方法可以从Request.ServerVariabl

ASP 3.0高级编程(二十八)

编程|高级 6.2.11 Logging Utility组件Logging Utility组件是ASP 3.0的新组件,提供了访问日志文件的方法,这个日志文件是由服务器支持的用于Web和FTP网站的IIS创建的.1. Logging Utility组件的成员Logging Utility组件提供了六种方法,能读取日志文件的内容.把新记录写进已存在的日志文件中.这些方法和上一章讨论的FileSystemObject对象的方法有相似性,如表6-9所示:表6-9 Logging Utility组件的方

ASP 3.0高级编程(二十九)

编程|高级 6.3.2 SA-FileUP组件在很多Web网站上,一个常规要求是,服务器接受客户机发送的文件的能力如何?在IIS 4.0里,Microsoft提供了一个名为Posting Acceptor组件完成这项工作,IIS 5.0和ASP 3.0的标准安装中没有该组件,如果安装Site Server Express的话,则需要包含这一组件.可以从Microsoft Web网站http://www.microsoft.com/windows/software/webpost/post_acc

ASP 3.0高级编程(三十二)

编程|高级 7.2.4 客户端脚本错误到目前为止,我们已了解了来自ASP的错误.然而ASP也经常用于创建包含客户端脚本的网页.如果包含客户端代码的<SCRIPT>元素没有被设置成RUNAT="SERVER"属性,ASP将不考虑服务器,而把网页信息不加改变地传送到客户端.因此,如果打开了一个ASP网页,并且显示的是一个浏览器错误对话框,就不应该在服务器端寻找ASP程序代码的错误.浏览器看不到ASP程序代码,所以不能识别任何错误,如果有一个对话框出现在客户端,那么在客户端代码中