ASP网页编程之ASP挪用带有输出参数和输入参数的存储过...
asp可以轻松地实现对页面内容的动态控制,根据不同的浏览者,显示不同的页面内容。而浏览者一点觉察不出来,就像为他专门制作的页面一样。使用各种各样的组件,asp可以完成无比强大的功能。存储历程 前往值实际上是一种特别的输入参数。在年夜多半情形下,我们用到的是同时有输出及输入参数的存储历程,好比我们想获得用户信息表中,某ID用户的用户名,这时候候,有一个输出参数----用户ID,和一个输入参数----用户名。完成这一功效的存储历程以下:<br><br><tablestyle="WIDTH:475px;HEIGHT:220px"borderColor=#ccccccwidth=475align=centerbgColor=#e3e3e3border=1><tr><td>/*SP4*/<br>CREATEPROCEDUREdbo.getUserName<br>@UserIDint,<br>@UserNamevarchar(40)output<br>as<br>setnocounton<br>begin<br>if@UserIDisnullreturn<br>select@UserName=username<br>fromdbo.<br>whereuserid=@UserID<br>return<br>end<br>go</td></tr></table><br> 挪用该存储历程的ASP代码以下:<br><br><tablestyle="WIDTH:507px;HEIGHT:242px"borderColor=#ccccccwidth=507align=centerbgColor=#e3e3e3border=1><tr><td>**挪用带有输出输入参数的存储历程**<br>DIMMyComm,UserID,UserName<br>UserID=1<br>SetMyComm=Server.CreateObject("ADODB.Command")<br>MyComm.ActiveConnection=MyConStrMyConStr是数据库毗连字串<br>MyComm.CommandText="getUserName"指定存储历程名<br>MyComm.CommandType=4标明这是一个存储历程<br>MyComm.Prepared=true请求将SQL命令先行编译<br>声明参数<br>MyComm.Parameters.appendMyComm.CreateParameter("@UserID",3,1,4,UserID)<br>MyComm.Parameters.appendMyComm.CreateParameter("@UserName",200,2,40)<br>MyComm.Execute<br>获得出参<br>UserName=MyComm(1)<br>SetMyComm=Nothing</td></tr></table><br> 在以上代码中,能够看到,与声明前往值分歧,声明输出参数时必要5个参数,声明输入参数时必要4个参数。声明输出参数时5个参数分离为:参数名、参数数据范例、参数范例、数据长度、参数值。声明输入参数时,没有最初一个参数:参数值。<br><br> 必要出格注重的是:在声明参数时,按次必定要与存储过程当中界说的按次不异,并且各参数的数据范例、长度也要与存储过程当中界说的不异。<br><br> 假如存储历程有多个参数,ASP代码会显得烦琐,可使用with命令简化代码:<br><br><tablestyle="WIDTH:473px;HEIGHT:243px"borderColor=#ccccccwidth=473align=centerbgColor=#e3e3e3border=1><tr><td>**挪用带有输出输入参数的存储历程(简化代码)**<br>DIMMyComm,UserID,UserName<br>UserID=1<br>SetMyComm=Server.CreateObject("ADODB.Command")<br>withMyComm<br> .ActiveConnection=MyConStrMyConStr是数据库毗连字串<br> .CommandText="getUserName"指定存储历程名<br> .CommandType=4标明这是一个存储历程<br> .Prepared=true请求将SQL命令先行编译<br> .Parameters.append.CreateParameter("@UserID",3,1,4,UserID)<br> .Parameters.append.CreateParameter("@UserName",200,2,40)<br> .Execute<br>endwith<br>UserName=MyComm(1)<br>SetMyComm=Nothing</td></tr></table><br> 假设我们要获得ID为1到10,10位用户的用户名,是否是要创立10次Command工具呢?不是的。假如必要屡次挪用统一存储历程,只需改动输出参数,就会失掉分歧的输入:<br><br><tablestyle="WIDTH:489px;HEIGHT:372px"borderColor=#ccccccwidth=489align=centerbgColor=#e3e3e3border=1><tr><td>**屡次挪用统一存储历程**<br>DIMMyComm,UserID,UserName<br>UserName=""<br>SetMyComm=Server.CreateObject("ADODB.Command")<br>forUserID=1to10<br> withMyComm<br> .ActiveConnection=MyConStrMyConStr是数据库毗连字串<br> .CommandText="getUserName"指定存储历程名<br> .CommandType=4标明这是一个存储历程<br> .Prepared=true请求将SQL命令先行编译<br> ifUserID=1then<br> .Parameters.append.CreateParameter("@UserID",3,1,4,UserID)<br> .Parameters.append.CreateParameter("@UserName",200,2,40)<br> .Execute<br> else<br> 从头给进参赋值(此时参数值不产生变更的进参和出参不用从头声明)<br> .Parameters("@UserID")=UserID<br> .Execute<br> endif<br> endwith<br> UserName=UserName+MyComm(1)+","大概你喜好用数组存储<br>next<br>SetMyComm=Nothing</td></tr></table><br> 经由过程以上代码能够看出:反复挪用统一存储历程时,只需为值产生改动的输出参数从头赋值便可,这一办法在有多个输出输入参数,且每次挪用时只要一个输出参数的值产生变更时,能够年夜年夜削减代码量。<br><P> <b>5.同时具有前往值、输出参数、输入参数的存储历程<br></b><br> 后面说过,在挪用存储历程时,声明参数的按次要与存储过程当中界说的按次不异。另有一点要出格注重:假如存储历程同时具有前往值和输出、输入参数,前往值要开始声明。<br><br> 为了演示这类情形下的挪用办法,我们改良一下下面的例子。仍是获得ID为1的用户的用户名,可是有大概该用户不存在(该用户已删除,而userid是自增加的字段)。存储历程依据用户存在与否,前往分歧的值。此时,存储历程和ASP代码以下:<br><br></P><P><tablestyle="WIDTH:479px;HEIGHT:654px"borderColor=#ccccccwidth=479align=centerbgColor=#e3e3e3border=1><tr><td>/*SP5*/<br>CREATEPROCEDUREdbo.getUserName<br>--为了加深对"按次"的印象,将以下两参数的界说按次倒置一下<br>@UserNamevarchar(40)output,<br>@UserIDint<br>as<br>setnocounton<br>begin<br>if@UserIDisnullreturn<br>select@UserName=username<br>fromdbo.<br>whereuserid=@UserID<br>if@@rowcount>0<br>return1<br>else<br>return0<br>return<br>end<br>go<br><br>**挪用同时具有前往值、输出参数、输入参数的存储历程**<br>DIMMyComm,UserID,UserName<br>UserID=1<br>SetMyComm=Server.CreateObject("ADODB.Command")<br>withMyComm<br>.ActiveConnection=MyConStrMyConStr是数据库毗连字串<br>.CommandText="getUserName"指定存储历程名<br>.CommandType=4标明这是一个存储历程<br>.Prepared=true请求将SQL命令先行编译<br>前往值要开始被声明<br>.Parameters.Append.CreateParameter("RETURN",2,4)<br>以下两参数的声明按次也做响应倒置<br>.Parameters.append.CreateParameter("@UserName",200,2,40)<br>.Parameters.append.CreateParameter("@UserID",3,1,4,UserID)<br>.Execute<br>endwith<br>ifMyComm(0)=1then<br>UserName=MyComm(1)<br>else<br>UserName="该用户不存在"<br>endif<br>SetMyComm=Nothing</td></tr></table></P><P><br> <b>6.同时前往参数和纪录集的存储历程<br></b><br> 偶然候,我们必要存储历程同时前往参数和纪录集,好比在使用存储历程分页时,要同时前往纪录集和数据总量等参数。以下给出一个举行分页处置的存储历程:<br><br></P><P><tablestyle="WIDTH:481px;HEIGHT:728px"borderColor=#ccccccwidth=481align=centerbgColor=#e3e3e3border=1><tr><td>/*SP6*/<br>CREATEPROCEDUREdbo.getUserList<br>@iPageCountintOUTPUT,--总页数<br>@iPageint,--以后页号<br>@iPageSizeint--每页纪录数<br>as<br>setnocounton<br>begin<br>--创立一时表<br>createtable#t(IDintIDENTITY,--自增字段<br>useridint,<br>usernamevarchar(40))<br>--向一时表中写进数据<br>insertinto#t<br>selectuserid,usernamefromdbo.<br>orderbyuserid<br><br>--获得纪录总数<br>declare@iRecordCountint<br>set@iRecordCount=@@rowcount<br><br>--断定总页数<br>IF@iRecordCount%@iPageSize=0<br>SET@iPageCount=CEILING(@iRecordCount/@iPageSize)<br>ELSE<br>SET@iPageCount=CEILING(@iRecordCount/@iPageSize)+1<br><br>--若哀求的页号年夜于总页数,则显现最初一页<br>IF@iPage>@iPageCount<br>SELECT@iPage=@iPageCount<br><br>--断定以后页的委曲纪录<br>DECLARE@iStartint--startrecord<br>DECLARE@iEndint--endrecord<br>SELECT@iStart=(@iPage-1)*@iPageSize<br>SELECT@iEnd=@iStart+@iPageSize+1<br><br>--取以后页纪录<br>select*from#twhereID>@iStartandID<@iEnd<br><br>--删除一时表<br>DROPTABLE#t<br><br>--前往纪录总数<br>return@iRecordCount<br>end<br>go</td></tr></table></P><P><br> 在下面的存储过程当中,输出以后页号及每页纪录数,前往以后页的纪录集,总页数及纪录总数。为了更具典范性,将纪录总数以前往值的情势前往。以下是挪用该存储历程的ASP代码(详细的分页操纵略往):<br><br></P><P><tablestyle="WIDTH:403px;HEIGHT:716px"borderColor=#ccccccwidth=403align=centerbgColor=#e3e3e3border=1><tr><td>**挪用分页存储历程**<br>DIMpagenow,pagesize,pagecount,recordcount<br>DIMMyComm,MyRst<br>pagenow=Request("pn")<br>自界说函数用于考证天然数<br>ifCheckNar(pagenow)=falsethenpagenow=1<br>pagesize=20<br>SetMyComm=Server.CreateObject("ADODB.Command")<br>withMyComm<br>.ActiveConnection=MyConStrMyConStr是数据库毗连字串<br>.CommandText="getUserList"指定存储历程名<br>.CommandType=4标明这是一个存储历程<br>.Prepared=true请求将SQL命令先行编译<br>前往值(纪录总量)<br>.Parameters.Append.CreateParameter("RETURN",2,4)<br>出参(总页数)<br>.Parameters.Append.CreateParameter("@iPageCount",3,2)<br>进参(以后页号)<br>.Parameters.append.CreateParameter("@iPage",3,1,4,pagenow)<br>进参(每页纪录数)<br>.Parameters.append.CreateParameter("@iPageSize",3,1,4,pagesize)<br>SetMyRst=.Execute<br>endwith<br>ifMyRst.state=0then未取到数据,MyRst封闭<br>recordcount=-1<br>else<br>MyRst.close注重:若要获得参数值,需先封闭纪录集工具<br>recordcount=MyComm(0)<br>pagecount=MyComm(1)<br>ifcint(pagenow)>=cint(pagecount)thenpagenow=pagecount<br>endif<br>SetMyComm=Nothing<br><br>以下显现纪录<br>ifrecordcount=0then<br>Response.Write"无纪录"<br>elseifrecordcount>0then<br>MyRst.open<br>dountilMyRst.EOF<br>......<br>loop<br>以下显现分页信息<br>......<br>elserecordcount=-1<br>Response.Write"参数毛病"<br>endif</td></tr></table></P><P><br> 关于以上代码,只要一点必要申明:同时前往纪录集和参数时,若要获得参数,需先将纪录集封闭,利用纪录集时再将其翻开。</P>楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。 用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。 以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题: 另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件) 以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。 没有坚实的理论做基础,那么我们连踏入社会第一步的资本都没有,特别对于计算机专业的学生学好专业知识是置关重要的。在这里我侧重讲一下如何学习ASP,从平时的学习过程中。 ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。
页:
[1]