存储过程及ASP调用存储过程实现分页(三)
2、有返回值、输入参数和输出参数的储存过程。
我们再去留意下存储过程的语法中有怎么一个参数:[OUTPUT],它表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。在实际应用中,通常我们是同时有返回值、输入参数和输出参数的存储过程。比如我们想取得班级表里某位同学的家庭地址,这时我们就应该输入该同学的“学号”(输入参数)及要显示的“家庭地址”(输出参数)和要验证该学号是否存在(返回值)。
下面就拿我们创建的用户表testUser来做例子。其功能是输入一个用户名查询他的电子邮件,同时验证输入的用户是否存在(比如存在返回1,否则返回0之类)并返回相应的值。
①存储过程testPROC2代码:
/*==============
第2个存储过程:即有返回值,输入参数和输出参数。
●RETURN 语句无条件终止查询、存储过程或批处理。存储过程或批处理中 RETURN 语句后面的语句都不执行。
●return:除非特别指明,所有系统存储过程返回 0 值表示成功,返回非零值则表示失败。
●本存储过程的return都是特别的说明,所以其返回值都是有相应的意义。
●下面的返回值0、1、2假如去掉的话,即如果 RETURN 未指定值,则存储过程返回 0。在程序调用且正常运行的情况下获取“返回值”的值都是返回 0 。
==============*/
Use Johnny
Go
CREATE PROC testPROC2
@userName varchar(20), --声明变量@userName
@userEmail varchar(50) OUTPUT --声明变量@userEmail,且是输出参数。
AS
set nocount on
begin
IF @userName is null OR @userName='' --当输入参数为空或is null时
begin
set @userEmail='请输入要查询的用户名!' --符合条件给输出参数赋值,以便提示
return 0 --输入参数为空时,“返回值”我们这里设置为 0(当然可以设置其他的数字)。
end
ELSE
IF exists(SELECT uEmail FROM testUser WHERE uName=@userName) --如果输入参数存在时
begin
SELECT @userEmail=uEmail FROM testUser WHERE uName=@userName --输出参数赋值
return 1 --验证输入的参数(用户名),存在时“返回值”我们这里设置为 1。
end
ELSE
begin
set @userEmail='不存在此用户名!' ----如果输入参数 不 存在时,提示
return 2 --输入的参数(用户名)不 存在时“返回值”我们这里设置为 2。
end
end
执行下。
②ASP代码:现在我们在ASP中对testPROC2这个的存储过程进行调用代码(绿色部分):
dim cmd,userName,userEmail
userName=Trim(request.Form("uName")) '输入参数
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = connstr
cmd.CommandText = "dbo.testPROC2"
cmd.CommandType = 4
cmd.CommandTimeout = 0
cmd.Prepared = true
cmd.Parameters.Append cmd.CreateParameter("@RETURN_VALUE", 3, 4)
cmd.Parameters.Append cmd.CreateParameter("@userName", 200, 1,20,userName)
cmd.Parameters.Append cmd.CreateParameter("@userEmail", 200, 2,50)
cmd.Execute()
'返回值
flag=cmd(0)
'输出参数 类
userEmail=cmd(2) '或userEmail=cmd("@userEmail")或userEmail=cmd.Parameters(1) 其读取顺序时从0开始。
set cmd=nothing
response.Write("<form id=""form1"" name=""form1"" method=""post"" action=""test2.asp"">")
response.Write("<input name=""uName"" type=""text"" id=""uName"" />")
response.Write("<input type=""submit"" name=""Submit"" value=""查询"" /></form>")
if request.Form("Submit")<>"" then
response.Write("你的“输入参数”是:【"&userName&"】<br />查询结果:<br />“输出参数”是:【"&userEmail&"】<br />“返回值”是:【"&flag&"】")response.End()
end if
运行结果:
说明:
上面图中的3种结果正好与我们的存储过程里预设的功能相同,当然第3种情况我们一般会在客户端设置让它一定要输入信息,而不是没有任何输入(或空格)的情况就点查询按钮。
这个也常用在验证登陆系统中,比如登陆的帐号无效(不存在时)其返回值为0,有(存在)其返回值为1等等。好了,现在开始讲解上面的代码的意思了。
在ASP中要取得返回值,需要利用Parameters集合来声明参数(具体的请参考ADO):
cmd.Parameters.Append cmd.CreateParameter("@RETURN_VALUE", 3, 4)
cmd.Parameters.Append cmd.CreateParameter("@userName", 200, 1,20,userName)
cmd.Parameters.Append cmd.CreateParameter("@userEmail", 200, 2,50)
代码中有这3行(返回值,必须最先出现)。括号里的参数什么意思呢?含义如下:
cmd.Parameters.Append cmd.CreateParameter("@RETURN_VALUE", 3, 4)
第一个参数@RETURN_VALUE为参数名,这个名字可以任意取(如取:JOHNNY),但一般取跟存储过程中的参数一样容易理解,而且参数多时对应起来容易。从字意上看它就是返回值。
第二个参数3表示:参数的数据类型。既然是数据类型那肯定有好几种了,是的,这里列了个对应表:
adBigInt: 20 ;
adBinary : 128 ;
adBoolean: 11 ;
adChar: 129 ;
adDBTimeStamp: 135 ;
adEmpty: 0 ;
adInteger: 3 ;
adSmallInt: 2 ;
adTinyInt: 16 ;
adVarChar: 200 ;
根据这个表我们就知道这个3是什么意思了。它就是整型数据类型。对于返回值,它只能取且-1到-99为保留值。
第三个参数4表示参数的类型。它的取值范围是0 ~ 4分别是:
0 : 类型无法确定;1: 输入参数;2: 输入参数;3:输入或输出参数;4: 返回值
所以我们可以看出这里的4表示它是返回值。
现在说
cmd.Parameters.Append cmd.CreateParameter("@userName", 200, 1,20,userName)
cmd.Parameters.Append cmd.CreateParameter("@userEmail", 200, 2,50)
这个,我们看到这2行正是我们testPROC2存储过程中对应的参数,可以知道输入参数@userName是需要5个参数的。
分别是:参数名称、参数数据类型、参数的类型、数据长度、参数值
而输出参数@userEmail只要4个参数,少了最后的参数值。这样就明白了这些参数的含义了吧,呵呵~~,不明白?!不会吧,我那尽量说得通俗易懂些:)
注意:这里参数的顺序一定要跟创建存储过程中声明参数顺序一致,同时如果存储过程同时具有返回值以及输入、输出参数,则返回值要最先声明。
下面是错误的:
cmd.Parameters.Append cmd.CreateParameter("@userEmail", 200, 2,50)
cmd.Parameters.Append cmd.CreateParameter("@userName", 200, 1,20,userName)
cmd.Parameters.Append cmd.CreateParameter("@RETURN_VALUE", 3, 4)
下面我们来说下有返回输出参数和记录集的存储过程
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |