<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[中软网博客 - B/S开发]]></title>
  <subtitle type="html"><![CDATA[专注软件开发技术 报道行业资讯信息]]></subtitle>
  <id>http://www.cnsdn.com.cn/blog/</id> 
  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.cnsdn.com.cn/blog/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.4.1022">PJBlog2</generator> 
  <updated>2007-09-11T06:10:36+08:00</updated> 

  <entry>
	  <title type="html"><![CDATA[asp中利用数组实现数据库记录的批量录入方法 ]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-09-11T06:10:36+08:00</updated>
	  <published>2007-09-11T06:10:36+08:00</published>
		  <summary type="html"><![CDATA[包括两个文件<br/>1。allneeddj.asp：实现表单的生成<br/>2. allneeddjresult.asp 处理表单批量录入<br/>3.hbedu.mdb :数据库文件<br/>其数据库结构如下<br/>provinceid:省份编号 数值型<br/>dytaocount:打样套数 数值型<br/>papertaocount:纸样套数 数值型<br/>cpcontent:出片内容 数值型<br/>filename:文件名 文本型<br/>beizhu:备注 备注型<br/><br/>本例子中以10条记录，每条记录6个字段说明.<br/><br/>1。allneeddj.asp<br/><br/>&lt;html&gt;<br/><br/>&lt;head&gt;<br/>&lt;meta http-equiv=&#34;Content-Language&#34; content=&#34;zh-cn&#34;&gt;<br/>&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=gb2312&#34;&gt;<br/>&lt;meta name=&#34;GENERATOR&#34; content=&#34;Microsoft FrontPage 4.0&#34;&gt;<br/>&lt;meta name=&#34;ProgId&#34; content=&#34;FrontPage.Editor.Document&#34;&gt;<br/>&lt;title&gt;需求登记&lt;/title&gt;<br/>&lt;/head&gt;<br/><br/>&lt;body&gt;<br/>&lt;%<br/>set conn=server.cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>conn.Open &#34;driver={Microsoft Access Driver (*.mdb)};dbq=&#34; &amp; _<br/>Server.MapPath(&#34;hbedu.mdb&#34;)<br/>%&gt;<br/>&lt;form method=&#34;POST&#34; action=&#34;allneeddjresult.asp&#34;&gt;<br/>&lt;table border=&#34;1&#34; width=&#34;700&#34; bordercolorlight=&#34;#FFFFFF&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr align=&#34;center&#34;&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td width=&#34;660&#34; colspan=&#34;6&#34;&gt;需求登记&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;tr&gt;<br/>&lt;td width=&#34;54&#34; align=&#34;center&#34;&gt;省份&lt;/td&gt;<br/>&lt;td width=&#34;66&#34; align=&#34;center&#34;&gt;打样张数&lt;/td&gt;<br/>&lt;td width=&#34;66&#34; align=&#34;center&#34;&gt;纸样张数&lt;/td&gt;<br/>&lt;td width=&#34;66&#34; align=&#34;center&#34;&gt;出片内容&lt;/td&gt;<br/>&lt;td width=&#34;80&#34; align=&#34;center&#34;&gt;文件名&lt;/td&gt;<br/>&lt;td width=&#34;328&#34; align=&#34;center&#34;&gt;备注&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;%<br/>rem 通过循环动态生成不同名称表单域<br/>for i=1 to 10 <br/>%&gt;<br/>&lt;%<br/>set rs=server.cr&#101;ateobject(&#34;adodb.recordset&#34;)<br/>sql=&#34;sel&#101;ct * from provinceinfo &#34;<br/>rs.open sql,conn,1,1<br/><br/><br/><br/><br/>set rs1=server.cr&#101;ateobject(&#34;adodb.recordset&#34;)<br/>sql1=&#34;sel&#101;ct * from filename &#34;<br/>rs1.open sql1,conn,1,1<br/>%&gt;<br/>&lt;tr&gt;<br/>&lt;td width=&#34;54&#34;&gt;&lt;sel&#101;ct name=&#34;&lt;% response.write&#34;data1&#34;&amp;i %&gt;&#34; size=&#34;1&#34;&gt;<br/>&lt;%<br/>do while not rs.eof<br/>if province=cstr(rs(&#34;id&#34;)) then<br/>sel=&#34;sel&#101;cted&#34;<br/>else<br/>sel=&#34;&#34;<br/>end if <br/>response.write &#34;&lt;option &#34; &amp; sel &amp; &#34; value=&#39;&#34;+CStr(rs(&#34;id&#34;))+&#34;&#39;&gt;&#34;+rs(&#34;province&#34;)+&#34;&lt;/option&gt;&#34;+chr(13)+chr(10)<br/>rs.movenext<br/>loop<br/>set rs=nothing<br/>%&gt; &lt;/sel&#101;ct&gt;&lt;/td&gt;<br/>&lt;td width=&#34;66&#34;&gt;&lt;input type=&#34;text&#34; name=&#34;&lt;% response.write&#34;data2&#34;&amp;i %&gt;&#34; size=&#34;8&#34;&gt;&lt;/td&gt;<br/>&lt;td width=&#34;66&#34;&gt;&lt;input type=&#34;text&#34; name=&#34;&lt;% response.write&#34;data3&#34;&amp;i %&gt;&#34; size=&#34;8&#34;&gt;&lt;/td&gt;<br/>&lt;td width=&#34;66&#34;&gt;&lt;sel&#101;ct size=&#34;1&#34; name=&#34;&lt;% response.write&#34;data4&#34;&amp;i %&gt;&#34;&gt;<br/>&lt;option value=&#34;1&#34;&gt;改动部分&lt;/option&gt;<br/>&lt;option value=&#34;2&#34;&gt;全部内容&lt;/option&gt;<br/>&lt;/sel&#101;ct&gt;&lt;/td&gt;<br/>&lt;td width=&#34;80&#34;&gt;&lt;sel&#101;ct name=&#34;&lt;% response.write&#34;data5&#34;&amp;i %&gt;&#34; size=&#34;1&#34;&gt;<br/>&lt;%<br/>do while not rs1.eof<br/>if filename=cstr(rs1(&#34;filename&#34;)) then<br/>sel=&#34;sel&#101;cted&#34;<br/>else<br/>sel=&#34;&#34;<br/>end if <br/>response.write &#34;&lt;option &#34; &amp; sel &amp; &#34; value=&#39;&#34;+CStr(rs1(&#34;filename&#34;))+&#34;&#39;&gt;&#34;+rs1(&#34;filename&#34;)+&#34;&lt;/option&gt;&#34;+chr(13)+chr(10)<br/>rs1.movenext<br/>loop<br/><br/>set rs1=nothing<br/>%&gt; &lt;/sel&#101;ct&gt;　&lt;/td&gt;<br/>&lt;td width=&#34;328&#34;&gt;&lt;textarea rows=&#34;2&#34; name=&#34;&lt;% response.write&#34;data6&#34;&amp;i %&gt;&#34; cols=&#34;46&#34;&gt;&lt;/textarea&gt;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;% next %&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr align=&#34;center&#34;&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td width=&#34;660&#34; colspan=&#34;6&#34;&gt;<br/>&lt;input type=&#34;submit&#34; value=&#34;提交&#34; name=&#34;B1&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;/table&gt;<br/>&lt;/form&gt;<br/><br/>&lt;/body&gt;<br/><br/>&lt;/html&gt;<br/><br/>2.allneeddjresult.asp<br/><br/>&lt;%<br/>rem 定义二维数组存放从表单获取的值<br/>dim data(10,6)<br/>for i= 1 to 6<br/>for j= 1 to 10<br/>mydata=&#34;data&#34;+cstr(i)+cstr(j)<br/>data(j,i)=request.form(mydata)<br/>next<br/>next<br/>%&gt;<br/><br/>&lt;%<br/>rem 输出表单输入的值<br/>for i= 1 to 10<br/>for j= 1 to 6<br/>response.write data(i,j)<br/>next<br/>response.write&#34;&#34;<br/>next<br/>&#39;response.end<br/>%&gt;<br/>&lt;% <br/>dim conn,rs<br/>Set conn = Server.Cr&#101;ateObject(&#34;ADODB.Connection&#34;)<br/>conn.Open &#34;driver={Microsoft Access Driver (*.mdb)};dbq=&#34; &amp; _<br/>Server.MapPath(&#34;hbedu.mdb&#34;)<br/><br/><br/>for i= 1 to 10<br/>rem 循环批量入库<br/><br/>Set rs=SERVER.Cr&#101;ateObject(&#34;ADODB.Recordset&#34;)<br/>rs.Open &#34;hbedu&#34;,conn,1,3<br/>rs.AddNew<br/>rs(&#34;beizhu&#34;)=data(i,6)<br/>rs(&#34;filename&#34;)=data(i,5)<br/>rs(&#34;cpcontent&#34;)=data(i,4)<br/>rs(&#34;papertaocount&#34;)=data(i,3)<br/>rs(&#34;dytaocount&#34;)=data(i,2)<br/>rs(&#34;provinceid&#34;)=data(i,1)<br/>rs.Up&#100;ate<br/>rs.close<br/>set rs=nothing<br/>response.write&#34;ok&#34;<br/>next<br/>%&gt;<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2177" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2177</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ASP数据库语法总结]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-09-10T08:09:28+08:00</updated>
	  <published>2007-09-10T08:09:28+08:00</published>
		  <summary type="html"><![CDATA[经常使用到有关数据库的操作。包括连接代码、SQL命令等等，又不曾刻意去记忆它们（我本人是不愿意去记这东东），所以常常在用到的时候又去查书本，翻来翻去。一些比较少用的数据库还不一定能顺利找到，所以现在把它们全归纳到这里，提供大家参考。（个人水平有限，有缺陷之处，欢迎大家指正。）<br/><br/>&lt;一&gt;。数据库的连接方法：<br/><br/>1.Access数据库的DSN-less连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adoconn.Open&#34;Driver={Microsoft Access Driver(*.mdb)};DBQ=&#34;&amp; _<br/>Server.MapPath(&#34;数据库所在路径&#34;)<br/><br/>2.Access OLE DB连接方法：<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Provider=Microsoft.Jet.OLEDB.4.0;&#34;&amp; _<br/>&#34;Data Source=&#34; &amp; Server.MapPath(&#34;数据库所在路径&#34;)<br/><br/>3.SQL server连接方法：<br/><br/>set adocon=server.cr&#101;ateobject(&#34;adodb.recordset&#34;)<br/>adocon.Open&#34;Driver={SQL Server};Server=(Local);UID=***;PWD=***;&#34;&amp; _<br/>&#34;database=数据库名;&#34;<br/><br/>4.SQL server OLE DB连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;provider=SQLOLEDB.1;Data Source=RITANT4;&#34;&amp; _<br/>&#34;user ID=***;Password=***;&#34;&amp; _<br/>&#34;inital Catalog=数据库名&#34;<br/><br/>5.Oracle 连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Driver={microsoft odbc for o&#114;acle};server=oraclesever.world;uid=admin;pwd=pass;&#34;<br/><br/>6.Oracle OLE DB 连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;&#34;<br/><br/>7.dBase 连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;&#34;<br/><br/>8.mySQL 连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;&#34;<br/><br/>9.Visual Foxpro 连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;&#34;<br/><br/>10.MS text 连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;&#34;&amp;_<br/>&#34;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;&#34;<br/><br/>11.MS text OLE DB 连接方法:<br/><br/>set adocon=Server.Cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open&#34;Provider=microsof.jet.oledb.4.0;data source=your_path;&#34;&amp;_<br/>&#34;Extended Properties&#39;text;FMT=Delimited&#39;&#34;<br/><br/>&lt;二&gt;。常用的四种SQL命令：<br/><br/>1.查询数据记录(Sel&#101;ct)<br/>语法：Sel&#101;ct 字段串行 From table Wh&#101;re 字段=内容<br/>例子：想从book表中找出作者为&#34;cancer&#34;的所有记录，SQL语句便如下：<br/>sel&#101;ct * from book wh&#101;re author=’cancer’<br/>&#34;*&#34;是取出book表所有的字段，如查询的字段值为数字，则其后的&#34;内容&#34;便无须加上单引号，<br/><br/>如是日期，则在Access中用(#)包括，而在SQL server中则用(’)包括，<br/>如:<br/><br/>sel&#101;ct * from book wh&#101;re id=1<br/>sel&#101;ct * from book wh&#101;re pub_date=#2002-1-7# (Access)<br/>sel&#101;ct * from book wh&#101;re pub_date=’2002-1-7’ (SQL Server)<br/><br/>提示：<br/>日期函数to_date不是标准sql文，不是所有的数据库适用，所以大家在使用的时候要参考数据库具体语法<br/><br/>另外如果是查询传入的变量，则如下：<br/><br/>strau=request.form(&#34;author&#34;)<br/>strsql=&#34;sel&#101;ct * from book wh&#101;re author=’&#34;&amp;strau&amp;&#34;’&#34;<br/><br/>如果查询的是数字，则：<br/><br/>intID=request.form(&#34;id&#34;)<br/>strsql=&#34;sel&#101;ct * from book wh&#101;re id=&#34;&amp;intID<br/><br/>在很多数据库中，如：oracle，上面的语句是可以写成：<br/>strsql=&#34;sel&#101;ct * from book wh&#101;re id=&#39;&#34;&amp;intID&amp;&#34;&#39;&#34;的。<br/>但是字符型一定不能按照数字格式写，需要注意。<br/><br/>2.添加记录(Ins&#101;rt)<br/>语法：Ins&#101;rt into table(field1,field2,....) Values (value1,value2,....)<br/>例子：添加一作者是&#34;cancer&#34;的记录入book表:<br/>ins&#101;rt into book (bookno,author,bookname) values (’CF001’,’cancer’,’Cancer无组件上传程序’)<br/>同样，如果用到变量就如下：<br/><br/>strno=request.form(&#34;bookno&#34;)<br/>strau=request.form(&#34;author&#34;)<br/>strname=request.form(&#34;bookname&#34;)<br/>strsql=&#34;ins&#101;rt into book (bookno,author,bookname) values (’&#34;&amp;strno&amp;&#34;’,’&#34;&amp;strau&amp;&#34;’,’&#34;&amp;strname&amp;&#34;’)&#34;<br/><br/>3.用Recordset对象的Addnew插入数据的方法:<br/>语法：<br/><br/>rs.addnew<br/>rs(&#34;field1&#34;).value=value1<br/>rs(&#34;field2&#34;).value=value2<br/>...<br/>rs.up&#100;ate<br/><br/>4.修改数据记录(Up&#100;ate)<br/>语法：up&#100;ate table set field1=value1,field2=value2,...wh&#101;re fieldx=valuex<br/>例子：up&#100;ate book set author=’babycrazy’ wh&#101;re bookno=’CF001’<br/>如果用到变量就如下：<br/><br/>strno=request.form(&#34;bookno&#34;)<br/>strau=request.form(&#34;author&#34;)<br/>strsql=&#34;up&#100;ate book set author=’&#34;&amp;strau&amp;&#34;’ wh&#101;re bookno=’&#34;&amp;strno&#34;’&#34;<br/><br/>5.Recordset对象的Up&#100;ate方法:<br/>语法：<br/><br/>rs(&#34;field1&#34;).value=value1<br/>rs(&#34;field2&#34;).value=value2<br/>...<br/>rs.up&#100;ate<br/><br/>注意：使用语法3和语法5的时候，一定要注意字段的类型（尤其是日期型）一致，否则出错的几率非常的高。<br/><br/><br/>例子：<br/><br/>strno=request.form(&#34;bookno&#34;)<br/>strau=request.form(&#34;author&#34;)<br/>set adocon=server.cr&#101;ateobject(&#34;adodb.connection&#34;)<br/>adocon.open &#34;Driver={Microsoft Access Driver(*.mdb)};DBQ=&#34; &amp; _<br/>Server.Mappath=(&#34;/cancer/cancer.mdb&#34;)<br/>strsql=&#34;sel&#101;ct * from book wh&#101;re bookno=’&#34;&amp;strno&amp;&#34;’&#34;<br/>set rs=server.cr&#101;ateobject(&#34;adodb.recordset&#34;)<br/>rs.open strsql,adconn,1,3<br/>if not rs.eof then ’如果有此记录的话<br/>rs(&#34;author&#34;).value=strau<br/>rs.up&#100;ate<br/>end if<br/>rs.close<br/>set rs=nothing<br/>adocon.close<br/>set adocon=nothing<br/><br/>6.删除一条记录(Del&#101;te)<br/>语法：Del&#101;te table wh&#101;re field=value<br/>例子：删除book表中作者是cancer的记录<br/><br/>del&#101;te book wh&#101;re author=’cancer’<br/><br/>(注意：如果book表中author字段的值为cancer的记录有多条，将会删除所有author为cancer的记录)<br/><br/>好了，学会了用这些操作，大家在用asp操作数据库的时候，该是没有什么问题了。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2176" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2176</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ASP与存储过程]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-09-06T05:56:43+08:00</updated>
	  <published>2007-09-06T05:56:43+08:00</published>
		  <summary type="html"><![CDATA[ASP与存储过程(Stored Procedures)的文章不少，但是我怀疑作者们是否真正实践过。我在初学时查阅过大量相关资料，发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用，这些资料也许是有帮助的，但仅限于此，因为它们根本就是千篇一律，互相抄袭，稍微复杂点的应用，就全都语焉不详了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;现在，我基本上通过调用存储过程访问SQL Server，以下的文字虽不敢保证绝对正确，但都是实践的总结，希望对大家能有帮助。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。<br/>&nbsp;&nbsp;&nbsp;&nbsp;定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句，只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程，就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个：<br/>&nbsp;&nbsp;&nbsp;&nbsp;第一、大大提高效率。存储过程本身的执行速度非常快，而且，调用存储过程可以大大减少同数据库的交互次数。<br/>&nbsp;&nbsp;&nbsp;&nbsp;第二、提高安全性。假如将SQL语句混合在ASP代码中，一旦代码失密，同时也就意味着库结构失密。<br/>&nbsp;&nbsp;&nbsp;&nbsp;第三、有利于SQL语句的重用。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;在ASP中，一般通过command对象调用存储过程，根据不同情况，本文也介绍其它调用方法。为了方便说明，根据存储过程的输入输出，作以下简单分类：<br/>&nbsp;&nbsp;&nbsp;&nbsp;1. 只返回单一记录集的存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;假设有以下存储过程(本文的目的不在于讲述T-SQL语法，所以存储过程只给出代码，不作说明)：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/*SP1*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate PROCEDURE dbo.getUserList<br/>&nbsp;&nbsp;&nbsp;&nbsp;as<br/>&nbsp;&nbsp;&nbsp;&nbsp;set nocount on<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel&#101;ct * from dbo.[userinfo]<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;go<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;以上存储过程取得userinfo表中的所有记录，返回一个记录集。通过command对象调用该存储过程的ASP代码如下:<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**通过Command对象调用存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,MyRst<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;getUserList&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyRst = MyComm.Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;存储过程取得的记录集赋给MyRst，接下来，可以对MyRst进行操作。<br/>&nbsp;&nbsp;&nbsp;&nbsp;在以上代码中，CommandType属性表明请求的类型，取值及说明如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp; 表明CommandText参数的类型无法确定<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;表明CommandText是一般的命令类型<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;表明CommandText参数是一个存在的表名称<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;表明CommandText参数是一个存储过程的名称<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;还可以通过Connection对象或Recordset对象调用存储过程，方法分别如下：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**通过Connection对象调用存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyConn,MyRst<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyConn = Server.Cr&#101;ateObject(&#34;ADODB.Connection&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyConn.open MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyRst&nbsp;&nbsp;= MyConn.Execute(&#34;getUserList&#34;,0,4)&nbsp;&nbsp;&#39;最后一个参断含义同CommandType<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyConn = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**通过Recordset对象调用存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyRst<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyRst = Server.Cr&#101;ateObject(&#34;ADODB.Recordset&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyRst.open &#34;getUserList&#34;,MyConStr,0,1,4<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串,最后一个参断含义与CommandType相同<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;2. 没有输入输出的存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;请看以下存储过程：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/*SP2*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate PROCEDURE dbo.delUserAll<br/>&nbsp;&nbsp;&nbsp;&nbsp;as<br/>&nbsp;&nbsp;&nbsp;&nbsp;set nocount on<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del&#101;te from dbo.[userinfo]<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;go<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;该存储过程删去userinfo表中的所有记录，没有任何输入及输出，调用方法与上面讲过的基本相同，只是不用取得记录集：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**通过Command对象调用存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;delUserAll&#34;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Execute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;此处不必再取得记录集<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;当然也可通过Connection对象或Recordset对象调用此类存储过程，不过建立Recordset对象是为了取得记录集，在没有返回记录集的情况下，还是利用Command对象吧。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;3. 有返回值的存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;在进行类似SP2的操作时，应充分利用SQL Server强大的事务处理功能，以维护数据的一致性。并且，我们可能需要存储过程返回执行情况，为此，将SP2修改如下：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/*SP3*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate PROCEDURE dbo.delUserAll<br/>&nbsp;&nbsp;&nbsp;&nbsp;as<br/>&nbsp;&nbsp;&nbsp;&nbsp;set nocount on<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN TRANSACTION<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del&#101;te from dbo.[userinfo]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @@error=0 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMIT TRANSACTION<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK TRANSACTION<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;go<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;以上存储过程，在del&#101;te顺利执行时，返回1，否则返回0，并进行回滚操作。为了在ASP中取得返回值，需要利用Parameters集合来声明参数：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**调用带有返回值的存储过程并取得返回值**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,MyPara<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;delUserAll&#34;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;声明返回值<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set Mypara = MyComm.Cr&#101;ateParameter(&#34;RETURN&#34;,2,4)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.Append MyPara<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;取得返回值<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM retValue<br/>&nbsp;&nbsp;&nbsp;&nbsp;retValue = MyComm(0)&nbsp;&nbsp;&nbsp;&nbsp;&#39;或retValue = MyComm.Parameters(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;在MyComm.Cr&#101;ateParameter(&#34;RETURN&#34;,2,4)中，各参数的含义如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;第一个参数(&#34;RETURE&#34;)为参数名。参数名可以任意设定，但一般应与存储过程中声明的参数名相同。此处是返回值，我习惯上设为&#34;RETURE&#34;；<br/>&nbsp;&nbsp;&nbsp;&nbsp;第二个参数(2)，表明该参数的数据类型，具体的类型代码请参阅ADO参考，以下给出常用的类型代码：<br/>&nbsp;&nbsp;&nbsp;&nbsp;adBigInt: 20 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adBinary : 128 ; <br/>&nbsp;&nbsp;&nbsp;&nbsp;adBoolean: 11 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adChar: 129 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adDBTimeStamp: 135 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adEmpty: 0 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adInteger: 3 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adSmallInt: 2 ; <br/>&nbsp;&nbsp;&nbsp;&nbsp;adTinyInt: 16 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adVarChar: 200 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;对于返回值，只能取整形，且-1到-99为保留值；<br/>&nbsp;&nbsp;&nbsp;&nbsp;第三个参数(4)，表明参数的性质，此处4表明这是一个返回值。此参数取值的说明如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;0 : 类型无法确定； 1: 输入参数；2: 输入参数；3：输入或输出参数；4: 返回值<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;以上给出的ASP代码，应该说是完整的代码，也即最复杂的代码，其实<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;Set Mypara = MyComm.Cr&#101;ateParameter(&#34;RETURN&#34;,2,4)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.Append MyPara<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;可以简化为<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.Append MyComm.Cr&#101;ateParameter(&#34;RETURN&#34;,2,4)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;甚至还可以继续简化，稍后会做说明。<br/>&nbsp;&nbsp;&nbsp;&nbsp;对于带参数的存储过程，只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用，但我没有试成过)。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;4. 有输入参数和输出参数的存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;返回值其实是一种特殊的输出参数。在大多数情况下，我们用到的是同时有输入及输出参数的存储过程，比如我们想取得用户信息表中，某ID用户的用户名，这时候，有一个输入参数----用户ID，和一个输出参数----用户名。实现这一功能的存储过程如下：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/*SP4*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate PROCEDURE dbo.getUserName<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @UserID int,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @UserName varchar(40) output<br/>&nbsp;&nbsp;&nbsp;&nbsp;as<br/>&nbsp;&nbsp;&nbsp;&nbsp;set nocount on<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @UserID is null return<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel&#101;ct @UserName=username <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from dbo.[userinfo] <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wh&#101;re userid=@UserID<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;go<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;调用该存储过程的ASP代码如下：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**调用带有输入输出参数的存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,UserID,UserName<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserID = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;getUserName&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;声明参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.append MyComm.Cr&#101;ateParameter(&#34;@UserID&#34;,3,1,4,UserID)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.append MyComm.Cr&#101;ateParameter(&#34;@UserName&#34;,200,2,40)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;取得出参<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserName = MyComm(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在以上代码中，可以看到，与声明返回值不同，声明输入参数时需要5个参数，声明输出参数时需要4个参数。声明输入参数时5个参数分别为：参数名、参数数据类型、参数类型、数据长度、参数值。声明输出参数时，没有最后一个参数：参数值。<br/>&nbsp;&nbsp;&nbsp;&nbsp;需要特别注意的是：在声明参数时，顺序一定要与存储过程中定义的顺序相同，而且各参数的数据类型、长度也要与存储过程中定义的相同。<br/>&nbsp;&nbsp;&nbsp;&nbsp;如果存储过程有多个参数，ASP代码会显得繁琐，可以使用with命令简化代码：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**调用带有输入输出参数的存储过程(简化代码)**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,UserID,UserName<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserID = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;with MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;getUserName&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@UserID&#34;,3,1,4,UserID)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@UserName&#34;,200,2,40)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;end with<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserName = MyComm(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;假如我们要取得ID为1到10，10位用户的用户名，是不是要创建10次Command对象呢？不是的。如果需要多次调用同一存储过程，只需改变输入参数，就会得到不同的输出：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**多次调用同一存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,UserID,UserName<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserName = &#34;&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;for UserID = 1 to 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;getUserName&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if UserID = 1 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@UserID&#34;,3,1,4,UserID)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@UserName&#34;,200,2,40)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;重新给入参赋值(此时参数值不发生变化的入参以及出参不必重新声明)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters(&#34;@UserID&#34;) = UserID<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end with<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserName = UserName + MyComm(1) + &#34;,&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#39;也许你喜欢用数组存储<br/>&nbsp;&nbsp;&nbsp;&nbsp;next<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;通过以上代码可以看出：重复调用同一存储过程时，只需为值发生改变的输入参数重新赋值即可，这一方法在有多个输入输出参数，且每次调用时只有一个输入参数的值发生变化时，可以大大减少代码量。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;5. 同时具有返回值、输入参数、输出参数的存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;前面说过，在调用存储过程时，声明参数的顺序要与存储过程中定义的顺序相同。还有一点要特别注意：如果存储过程同时具有返回值以及输入、输出参数，返回值要最先声明。<br/>&nbsp;&nbsp;&nbsp;&nbsp;为了演示这种情况下的调用方法，我们改善一下上面的例子。还是取得ID为1的用户的用户名，但是有可能该用户不存在(该用户已删除，而userid是自增长的字段)。存储过程根据用户存在与否，返回不同的值。此时，存储过程和ASP代码如下：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/*SP5*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate PROCEDURE dbo.getUserName<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --为了加深对&#34;顺序&#34;的印象，将以下两参数的定义顺序颠倒一下<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @UserName varchar(40) output,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @UserID int<br/>&nbsp;&nbsp;&nbsp;&nbsp;as<br/>&nbsp;&nbsp;&nbsp;&nbsp;set nocount on<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @UserID is null return<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel&#101;ct @UserName=username <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from dbo.[userinfo] <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wh&#101;re userid=@UserID<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @@rowcount&gt;0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;go<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**调用同时具有返回值、输入参数、输出参数的存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,UserID,UserName<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserID = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;with MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;getUserName&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;返回值要最先被声明<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.Append .Cr&#101;ateParameter(&#34;RETURN&#34;,2,4)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;以下两参数的声明顺序也做相应颠倒<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@UserName&#34;,200,2,40)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@UserID&#34;,3,1,4,UserID)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;end with<br/>&nbsp;&nbsp;&nbsp;&nbsp;if MyComm(0) = 1 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserName = MyComm(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserName = &#34;该用户不存在&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end if<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;6. 同时返回参数和记录集的存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;有时候，我们需要存储过程同时返回参数和记录集，比如在利用存储过程分页时，要同时返回记录集以及数据总量等参数。以下给出一个进行分页处理的存储过程：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/*SP6*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate PROCEDURE dbo.getUserList<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @iPageCount int OUTPUT,&nbsp;&nbsp; --总页数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @iPage int,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --当前页号<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @iPageSize int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--每页记录数<br/>&nbsp;&nbsp;&nbsp;&nbsp;as<br/>&nbsp;&nbsp;&nbsp;&nbsp;set nocount on<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --创建临时表 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cr&#101;ate table #t (ID int IDENTITY,&nbsp;&nbsp; --自增字段<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userid int,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username varchar(40))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --向临时表中写入数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ins&#101;rt into #t <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel&#101;ct userid,username from dbo.[UserInfo]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o&#114;der by userid<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --取得记录总数 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @iRecordCount int<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @iRecordCount = @@rowcount<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --确定总页数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @iRecordCount%@iPageSize=0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET @iPageCount=CEILING(@iRecordCount/@iPageSize)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --若请求的页号大于总页数，则显示最后一页<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @iPage &gt; @iPageCount<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sel&#101;ct @iPage = @iPageCount<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --确定当前页的始末记录<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE @iStart int&nbsp;&nbsp;&nbsp;&nbsp;--start record<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE @iEnd int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--end record<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sel&#101;ct @iStart = (@iPage - 1) * @iPageSize<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sel&#101;ct @iEnd = @iStart + @iPageSize + 1<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --取当前页记录&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel&#101;ct * from #t wh&#101;re ID&gt;@iStart and ID&lt;@iEnd<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --删除临时表<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dro&#112; TABLE #t<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --返回记录总数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return @iRecordCount<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;go<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在上面的存储过程中，输入当前页号及每页记录数，返回当前页的记录集，总页数及记录总数。为了更具典型性，将记录总数以返回值的形式返回。以下是调用该存储过程的ASP代码(具体的分页操作略去):<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**调用分页存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM pagenow,pagesize,pagecount,recordcount<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,MyRst<br/>&nbsp;&nbsp;&nbsp;&nbsp;pagenow = Request(&#34;pn&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;自定义函数用于验证自然数<br/>&nbsp;&nbsp;&nbsp;&nbsp;if CheckNar(pagenow) = false then pagenow = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;pagesize = 20<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;with MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;getUserList&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;返回值(记录总量) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.Append .Cr&#101;ateParameter(&#34;RETURN&#34;,2,4)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;出参(总页数)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.Append .Cr&#101;ateParameter(&#34;@iPageCount&#34;,3,2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;入参(当前页号)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@iPage&#34;,3,1,4,pagenow)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;入参(每页记录数)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@iPageSize&#34;,3,1,4,pagesize)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set MyRst = .Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;end with<br/>&nbsp;&nbsp;&nbsp;&nbsp;if MyRst.state = 0 then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;未取到数据，MyRst关闭<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordcount = -1<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyRst.close&nbsp;&nbsp;&nbsp;&nbsp;&#39;注意：若要取得参数值，需先关闭记录集对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordcount = MyComm(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pagecount&nbsp;&nbsp; = MyComm(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if cint(pagenow)&gt;=cint(pagecount) then pagenow=pagecount<br/>&nbsp;&nbsp;&nbsp;&nbsp;end if<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;以下显示记录<br/>&nbsp;&nbsp;&nbsp;&nbsp;if recordcount = 0 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write &#34;无记录&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;elseif recordcount &gt; 0 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyRst.open<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do until MyRst.EOF<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;以下显示分页信息<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br/>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&#39;recordcount=-1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write &#34;参数错误&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end if<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;对于以上代码，只有一点需要说明：同时返回记录集和参数时，若要取得参数，需先将记录集关闭，使用记录集时再将其打开。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;7. 返回多个记录集的存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;本文最先介绍的是返回记录集的存储过程。有时候，需要一个存储过程返回多个记录集，在ASP中，如何同时取得这些记录集呢？为了说明这一问题，在userinfo表中增加两个字段：usertel及usermail，并设定只有登录用户可以查看这两项内容。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/*SP7*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;Cr&#101;ate PROCEDURE dbo.getUserInfo<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @userid int,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @checklogin bit<br/>&nbsp;&nbsp;&nbsp;&nbsp;as<br/>&nbsp;&nbsp;&nbsp;&nbsp;set nocount on<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @userid is null o&#114; @checklogin is null return<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel&#101;ct username<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from dbo.[usrinfo]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wh&#101;re userid=@userid<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --若为登录用户，取usertel及usermail<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if @checklogin=1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel&#101;ct usertel,usermail<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from dbo.[userinfo]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wh&#101;re userid=@userid<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;go<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;以下是ASP代码：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;**调用返回多个记录集的存储过程**<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM checklg,UserID,UserName,UserTel,UserMail<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm,MyRst<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserID = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;checklogin()为自定义函数，判断访问者是否登录<br/>&nbsp;&nbsp;&nbsp;&nbsp;checklg = checklogin()<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;with MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ActiveConnection = MyConStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;MyConStr是数据库连接字串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandText&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#34;getUserInfo&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#39;指定存储过程名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .CommandType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;表明这是一个存储过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Prepared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;要求将SQL命令先行编译<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@userid&#34;,3,1,4,UserID)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Parameters.append .Cr&#101;ateParameter(&#34;@checklogin&#34;,11,1,1,checklg)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set MyRst = .Execute<br/>&nbsp;&nbsp;&nbsp;&nbsp;end with<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;从第一个记录集中取值<br/>&nbsp;&nbsp;&nbsp;&nbsp;UserName = MyRst(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;从第二个记录集中取值<br/>&nbsp;&nbsp;&nbsp;&nbsp;if not MyRst is Nothing then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set MyRst = MyRst.NextRecordset()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserTel&nbsp;&nbsp;= MyRst(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserMail = MyRst(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;end if<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyRst = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;以上代码中，利用Recordset对象的NextRecordset方法，取得了存储过程返回的多个记录集。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;至此，针对ASP调用存储过程的各种情况，本文已做了较为全面的说明。最后说一下在一个ASP程序中，调用多个存储过程的不同方法。<br/>&nbsp;&nbsp;&nbsp;&nbsp;在一个ASP程序中，调用多个存储过程至少有以下三种方法是可行的：<br/>&nbsp;&nbsp;&nbsp;&nbsp;1. 创建多个Command对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;调用存储过程一<br/>&nbsp;&nbsp;&nbsp;&nbsp;......<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;调用存储过程二<br/>&nbsp;&nbsp;&nbsp;&nbsp;......<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;......<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;2. 只创建一个Command对象，结束一次调用时，清除其参数<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;调用存储过程一<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;清除参数(假设有三个参数)<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.del&#101;te 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.del&#101;te 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.del&#101;te 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;调用存储过程二并清除参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;......<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;此时要注意：清除参数的顺序与参数声明的顺序相反，原因嘛，我也不知道。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;3. 利用Parameters数据集合的Refresh方法重置Parameter对象<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;DIM MyComm<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Server.Cr&#101;ateObject(&#34;ADODB.Command&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;调用存储过程一<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;重置Parameters数据集合中包含的所有Parameter对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;MyComm.Parameters.Refresh<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;调用存储过程二<br/>&nbsp;&nbsp;&nbsp;&nbsp;.....<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set MyComm = Nothing<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;一般认为，重复创建对象是效率较低的一种方法，但是经测试(测试工具为Microsoft Application Center Test)，结果出人意料：<br/>&nbsp;&nbsp;&nbsp;&nbsp;方法2 &gt;= 方法1 &gt;&gt; 方法3<br/>&nbsp;&nbsp;&nbsp;&nbsp;方法2的运行速度大于等于方法1(最多可高4%左右)，这两种方法的运行速度远大于方法3(最多竟高达130%)，所以建议在参数多时，采用方法1，在参数较少时，采用方法2。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;花了一天的时间，终于把我对于在ASP中调用存储过程的一些粗浅的经验形成了文字。这其中，有些是我只知其果而不明其因的，有些可能是错误的，但是，这些都是经过我亲身实践的。各位看官批判地接受吧。有不同意见，希望一定向我指明，先谢了<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2172" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2172</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[jsp+javabean实现分页]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-08-31T02:28:58+08:00</updated>
	  <published>2007-08-31T02:28:58+08:00</published>
		  <summary type="html"><![CDATA[　　此分页程序用到三个文件test.jsp和Pagination.java和DBConnect.java,和一个简单数据库test的表test，测试用的web发布服务器为resin-2.1.6)其中test用于显示分页结果,DBConnect.java用于连接mysql数据库，Pagination.java用于封装分页程序,而且DBConnect.java和Pagination.java放在WEB-INF下的classes(注意，如果没有的话就新建一个),数据库用的是mysql．<br/><br/>1、cr&#101;ate database test ----------建立数据库test<br/>&nbsp;&nbsp;cr&#101;ate table test(id int not null,name varchar(25));---------建立数据表test有两个字段,id和name类型分别是整形 和 字符型(有关mysql的操作请注意本站的数据库方面)<br/><br/>2、DBConnect.java<br/><br/>import java.sql.*;<br/>public class DBConnect{<br/>&nbsp;&nbsp; String sDBDriver=&#34;org.gjt.mm.mysql.Driver&#34;;//设置驱动变量(jdbc的驱动程序放在WEB-INF下的lib目录下)<br/>&nbsp;&nbsp; String sConnStr=&#34;jdbc:mysql://127.0.0.1:3306/test?user=root&amp;password=&#34;;//创建连接,数据库名test，连接mysql的用户名是root,密码为空(如果你的mysql有用户名和密码请填上你的用户名和密码) <br/>&nbsp;&nbsp; Connection conn=null;<br/>&nbsp;&nbsp; ResultSet rs=null;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; public DBConnect(){<br/>&nbsp;&nbsp; try{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(sDBDriver);// 创建数据库驱动<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(java.lang.ClassNotFoundException e){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#34;Jdbc_conn():&#34;+e.getMessage());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; // 数据更新，本文只用到查询。<br/>&nbsp;&nbsp; public void executeUp&#100;ate(String sql)throws Exception{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql=new String(sql.getBytes(&#34;GBK&#34;),&#34;ISO8859_1&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn=DriverManager.getConnection(sConnStr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt=conn.cr&#101;ateStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.executeUp&#100;ate(sql);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException ex){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#34;sql.executeUp&#100;ate:&#34;+ex.getMessage());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; // 查询<br/>&nbsp;&nbsp; public ResultSet executeQuery(String sql)throws Exception{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs=null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql=new String(sql.getBytes(&#34;GBK&#34;),&#34;ISO8859_1&#34;);// 字符的转换<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn=DriverManager.getConnection(sConnStr);// 创建连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt=conn.cr&#101;ateStatement();// 数据操作对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs=stmt.executeQuery(sql);//执行sql<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();// 关闭连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.close();// 关闭对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException ex){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#34;sql.executeQuery:&#34;+ex.getMessage());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs;<br/>&nbsp;&nbsp; }<br/>}<br/><br/>用Pagination.java封装分页类，在test.jsp里显示<br/>2、Pagination.java--------封装分页的类<br/>import java.sql.*;<br/>import javax.servlet.*;// 引入servlet包<br/>import javax.servlet.http.*;<br/>import java.math.*;<br/><br/>public class&nbsp;&nbsp;Pagination{<br/>&nbsp;&nbsp; private String strPage = null;// page参数变量<br/>&nbsp;&nbsp; private int curPages;// page参数内部的值<br/>&nbsp;&nbsp; private int m_rows; // 设置每页显示的页数<br/>&nbsp;&nbsp; private int pages;// 总页数<br/>&nbsp;&nbsp; // 取得test.jsp里的test.jsp?page=&lt;%=curPages-1%&gt;或是page=&lt;%=curPages+1%&gt;的值给变量strPage<br/>&nbsp;&nbsp; public String strPage(HttpServletRequest request, String page){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strPage = request.getParameter(page);// request对象取得page的值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(Exception e){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#34;delcolumn&#34;+e.getMessage());&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return strPage;// 返回这个值。<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; // 页面数<br/>&nbsp;&nbsp; public int curPages(String strPage){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(strPage == null){// 默认没有就设置是第一页<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curPages = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curPages = Integer.parseInt(strPage);// 取得strPage的整数值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(curPages &lt; 1)// 如果小于1,同样返回是第一页<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curPages = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(&#34;curPages&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return curPages;// 返回页面数<br/>&nbsp;&nbsp; } <br/>&nbsp;&nbsp; // 设置每页要显示的记录数<br/>&nbsp;&nbsp; public void setRows(int rows){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_rows=rows;<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; // 取得页数<br/>&nbsp;&nbsp; public int getPages(int rowcounts){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int test;// 变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test=rowcounts%m_rows;// 取得余数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(test==0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pages = rowcounts/m_rows;// 每页显示的整数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pages=rowcounts/m_rows+1;// 不是的话就加一<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pages;// 返回页数<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; // 结果集的返回<br/>&nbsp;&nbsp; public ResultSet getPageSet(ResultSet rs,int curPages){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(curPages==1){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs;// 如果是就一页的话，就返回这个rs<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i=1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next()){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i+1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&gt;((curPages-1)*m_rows))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;// 退出<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs;// 从退出开始将结果集返回<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(e.getMessage());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs;<br/>&nbsp;&nbsp; }<br/>}<br/><br/>3.test.jsp --------显示页面<br/>&lt;%@ page contentType=&#34;text/html;charset=gb2312&#34;%&gt;<br/>&lt;%@ page import=&#34;java.sql.*&#34;%&gt;<br/>&lt;jsp:useBean id=&#34;m_pages&#34; scope=&#34;page&#34; class=&#34;Pagination&#34;/&gt;<br/>&lt;jsp:useBean id=&#34;sql&#34; scope=&#34;page&#34; class=&#34;DBConnect&#34;/&gt;<br/>&lt;%<br/>&nbsp;&nbsp; int curPages = Pagination.curPages(Pagination.strPage(request,&#34;page&#34;));//Pagination.strPage(request,&#34;page&#34;)取page值传递给curPages()方法<br/>&nbsp;&nbsp; Pagination.setRows(10);//设置每页显示10条<br/>%&gt;<br/><br/>&lt;%<br/>&nbsp;&nbsp; ResultSet rs_count=sql.executeQuery(&#34;sel&#101;ct count(*) as t from test&#34;);//传递进数据库处理的javabean<br/>&nbsp;&nbsp; rs_count.next();<br/>&nbsp;&nbsp; int resultconts=rs_count.getInt(&#34;t&#34;);//取得总的数据数<br/>&nbsp;&nbsp; int totalPages = Pagination.getPages(resultconts);//取出总页数<br/>&nbsp;&nbsp; ResultSet rs=m_pages.getPageSet(sql.executeQuery(&#34;sel&#101;ct * from test&#34;),curPages);//获取指针的结果集参数是(结果集，页数)<br/>%&gt;<br/>&nbsp;&nbsp; &lt;p&gt;分类表&lt;/p&gt;<br/>&nbsp;&nbsp; &lt;table border=&#34;1&#34;&gt; <br/>&nbsp;&nbsp; &lt;tr&gt;<br/>&nbsp;&nbsp; &lt;td&gt;1&lt;/td&gt;<br/>&nbsp;&nbsp; &lt;td&gt;2&lt;/td&gt;<br/>&nbsp;&nbsp; &lt;td&gt;3&lt;/td&gt;<br/>&nbsp;&nbsp; &lt;/tr&gt;<br/>&nbsp;&nbsp; &lt;%int i=1;%&gt;<br/>&nbsp;&nbsp; &lt;%while (rt.next()){%&gt;<br/>&nbsp;&nbsp; &lt;tr&gt;<br/>&nbsp;&nbsp; &lt;td&gt;&lt;%=rt.getString(&#34;id&#34;)%&gt;　&lt;/td&gt;<br/>&nbsp;&nbsp; &lt;td&gt;&lt;%=rt.getString(&#34;name&#34;)%&gt; 　&lt;/td&gt;<br/>&nbsp;&nbsp; &lt;/tr&gt;<br/>&nbsp;&nbsp; &lt;%<br/>&nbsp;&nbsp; i=i+1;<br/>&nbsp;&nbsp; if(i&gt;10)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; %&gt;<br/>&nbsp;&nbsp; &lt;/table&gt;<br/>&nbsp;&nbsp; &lt;p align=&#34;center&#34;&gt;&lt;%if(curPages&gt;1){%&gt;&lt;a href=&#34;testBean.jsp?page=&lt;%=curPages-1%&gt;&#34;&gt;上一页&lt;/a&gt;&lt;%}%&gt;&lt;%if(curPages&lt;totalPages){%&gt;&lt;a href=&#34;testBean.jsp?page=&lt;%=curPages+1%&gt;&#34;&gt;下一页&lt;/a&gt;&lt;%}%&gt;&lt;/p&gt;<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2166" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2166</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[jsp主次数据显示]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-08-30T10:27:09+08:00</updated>
	  <published>2007-08-30T10:27:09+08:00</published>
		  <summary type="html"><![CDATA[好久没发文章了，今天终于把一个烦了我很多天的问题解决了，好爽，在这里我要感谢PhD(jspjava)这位朋友，这个问题是关于jsp编历两极数据库的问题<br/><br/><br/><br/>这个代码只是读取数据库里面的第一条记录，我要先读一个表A，另外一个表的数据要根据这个表A读出来的字段才能读取数据，也就是while里面还有while，数据库里有很多条记录，但是只是显示第一条。我起初的代码如下：<br/><br/>Connection con;<br/>Statement sql,sql2;<br/>ResultSet rs,rs1;<br/>int param,num;<br/>String param2;<br/>try{ Class.forName(&#34;sun.jdbc.odbc.JdbcOdbcDriver&#34;);<br/>&nbsp;&nbsp; }<br/>catch(ClassNotFoundException e) {}<br/>try{con=DriverManager.getConnection(&#34;jdbc:odbc:student&#34;,&#34;&#34;,&#34;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp; sql=con.cr&#101;ateStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp; rs=sql.executeQuery(&#34;sel&#101;ct * from student_credit_record o&#114;der by student_id&#34;);<br/>&nbsp;&nbsp;while(rs.next())<br/>&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp; param=rs.getInt(&#34;student_id&#34;);<br/>&nbsp;&nbsp;param2=rs.getString(2);<br/>&nbsp;&nbsp;String student_sex=rs.getString(3);<br/>&nbsp;&nbsp;int credit_degree=rs.getInt(&#34;credit_degree&#34;);<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; out.print(&#34;&lt;tr&gt;&#34;);<br/>&nbsp;&nbsp;out.print(&#34;&lt;td&gt;&lt;font color=#990033&gt;&lt;a href=stu_info.jsp?id=&#34;+param+&#34;&gt;&#34;+param2+&#34;&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&#34;);<br/>&nbsp;&nbsp;out.print(&#34;&lt;td&gt;&#34;+param+&#34;&lt;/td&gt;&#34;);<br/>&nbsp;&nbsp;out.print(&#34;&lt;td&gt;&#34;+student_sex+&#34;&lt;/td&gt;&#34;);<br/>&nbsp;&nbsp;out.print(&#34;&lt;td&gt;&lt;font color=#990033&gt;&#34;+credit_degree+&#34;&lt;/font&gt;&lt;/td&gt;&#34;);<br/>&nbsp;&nbsp;sql2=con.cr&#101;ateStatement();<br/>&nbsp;&nbsp;String sqlstring=&#34;sel&#101;ct count(*) from bad_record wh&#101;re student_id=&#34;+param;<br/>&nbsp;&nbsp;&nbsp;&nbsp; rs1=sql2.executeQuery(sqlstring);<br/>&nbsp;&nbsp;while(rs1.next())<br/>&nbsp;&nbsp;{&nbsp;&nbsp;//将游标移动到第一条记录,这里总共也才一条记录<br/>&nbsp;&nbsp;&nbsp;&nbsp;num=rs1.getInt(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;out.print(&#34;&lt;td&gt;&#34;+num+&#34;(条)&#34;+&#34;&lt;/td&gt;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;//out.print(&#34;&lt;td&gt;&#34;+&#34;2&#34;+&#34;&lt;/td&gt;&#34;);<br/>&nbsp;&nbsp;out.print(&#34;&lt;td&gt;&lt;a href=stu_modify.jsp?id=&#34;+param+&#34;&amp;nid=&#34;+param2+&#34;&gt;&#34;+&#34;修改&#34;+&#34;&lt;/a&gt;&#34;+&#34;|&#34;+&#34;&lt;a href=stu_del.jsp?id=&#34;+param+&#34;&amp;nid=&#34;+param2+&#34;&gt;&#34;+&#34;删除&#34;+&#34;&lt;/a&gt;&lt;/td&gt;&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp; out.print(&#34;&lt;/tr&gt;&#34;); <br/>&nbsp;&nbsp;<br/> }<br/>&nbsp;&nbsp;con.close();<br/> } <br/>&nbsp;&nbsp;catch(SQLException e6) <br/>&nbsp;&nbsp;{<br/> // out.print(e6);<br/>&nbsp;&nbsp;}<br/><br/>最后这个朋友帮我解决的办法是：要定义两个statement 一个sql，另一个sql2<br/>这样就可以运行程序了，csdn上很多人都还不知道这个问题呢（jsp这个方面）<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2165" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2165</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ajax技术学习网址]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-08-08T04:06:17+08:00</updated>
	  <published>2007-08-08T04:06:17+08:00</published>
		  <summary type="html"><![CDATA[一.资源类网站&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国内最大的共享式电子书下载站点含-ajax相关下载（电子书教程/源码）<br/>1,国内网站 <br/>1)Ajax中国(推荐) <br/>一个专业的ajax技术网站,分类清晰,有大量的电子版教程,以及AJAX源码下载! <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a> <br/><br/>2)ajaxcn.org <br/>李琨老师的blog。李琨:《ajax实战》译者. <br/><a href="http://www.ajaxcn.org" target="_blank">http://www.ajaxcn.org</a> <br/>----------------------------------------- <br/>2,国外网站 <br/>1)、Ajax 的诞生 <br/>Ajax: A New Approach to Web Applications <br/><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target="_blank"><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target="_blank">http://www.adaptivepath.com/publications/essays/archives/000385.php</a></a> <br/><br/>2)、AJAX Matters <br/><a href="http://www.ajaxmatters.com" target="_blank">http://www.ajaxmatters.com</a> <br/>关于 Ajax 技术一个信息量非常大的网站，有点像 Ajax 世界中的 TSS。 <br/><br/>3)、AJAX Patterns <br/>与 AJAX 设计模式相关的资源。 <br/><a href="http://www.ajaxpatterns.org" target="_blank">http://www.ajaxpatterns.org</a> <br/><a href="http://www.softwareas.com/ajax-patterns" target="_blank"><a href="http://www.softwareas.com/ajax-patterns" target="_blank">http://www.softwareas.com/ajax-patterns</a></a> <br/><br/>4)、<a href="http://www.ajaxian.com" target="_blank">http://www.ajaxian.com</a> <br/><br/>-------------------------------------------------------------------------------- <br/><br/>二.热门文章 <br/><br/>1.什么是AJAX <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/net/20060510.html <br/>2.ajax技术简介 <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/basic/200604654.html <br/>3.ajax.net <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/basic/200604556.html <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/tech/200605589.html <br/><a href="http://weblogs.asp.net/mschwarz/archive/2005/04/11/399893.aspx" target="_blank">http://weblogs.asp.net/mschwarz/archive/2005/04/11/399893.aspx</a>(英文) <br/><br/>-------------------------------------------------------------------------------- <br/><br/>三.ajax相关下载（电子书教程/源码） <br/>1.Ajax基础教程电子版 <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/bookdown/200604950.htm <br/>2.《AJAX实战》ajax in action电子版 <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/bookdown/200604366.htm <br/>3.AJAX开发简略 <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/bookdown/20060538.htm <br/>---------------------------- <br/>4.AJAX版CD管理系统 (jsp) <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/codedown/200604327.htm <br/>5.Alexa 查询系统 (Xmlhttp + Ajax) <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/codedown/200604982.htm <br/>6.ASP.NET+AJAX解决网页打开等待问题 <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/codedown/200604166.htm <br/>7.Ajax技术简介 (ajax demo) <br/><a href="http://www.okajax.com" target="_blank">http://www.okajax.com</a>/info/codedown/200604576.htm <br/><br/>-------------------------------------------------------------------------------- <br/><br/>四.ajax相关图书 <br/>1.《Ajax实战》(目前Ajax领域最为全面深入的一本著作) <br/><a href="http://www.china-pub.com/computers/common/info.asp?id=28433" target="_blank">http://www.china-pub.com/computers/common/info.asp?id=28433</a> <br/>2.《Ajax基础教程》（亚马逊计算机榜首图书，国内第1本Ajax图书） <br/><a href="http://www.china-pub.com/computers/common/info.asp?id=28432" target="_blank">http://www.china-pub.com/computers/common/info.asp?id=28432</a> <br/>3.《Ajax 修炼之道-Web 2.0 入门》（Ajax从小工到专家的首选图书） <br/><a href="http://www.china-pub.com/computers/common/info.asp?id=29430" target="_blank">http://www.china-pub.com/computers/common/info.asp?id=29430</a> <br/>4.《征服Ajax+Lucene构建搜索引擎》 <br/><a href="http://www.china-pub.com/computers/common/info.asp?id=29996" target="_blank">http://www.china-pub.com/computers/common/info.asp?id=29996</a> <br/>5.《征服Ajax--Web 2.0快速入门与项目实践（.net）》 <br/><a href="http://www.china-pub.com/computers/common/info.asp?id=29995" target="_blank">http://www.china-pub.com/computers/common/info.asp?id=29995</a> <br/>6.《Ajax开发精要--概念、案例与框架》 <br/><a href="http://www.china-pub.com/computers/common/info.asp?id=30006" target="_blank">http://www.china-pub.com/computers/common/info.asp?id=30006</a> <br/>[Page] <br/><br/><br/>-------------------------------------------------------------------------------- <br/><br/>五.部分技术文章 <br/><a href="http://www.dragonson.com/doc/ajax.html" target="_blank">http://www.dragonson.com/doc/ajax.html</a> <br/>Ajax内部交流文档 <br/><a href="http://info96.k12studio.com/~nio/comments.php?id=242_0_1_0_C" target="_blank">http://info96.k12studio.com/~nio/comments.php?id=242_0_1_0_C</a> <br/>简单地对 Ajax 进行描述介绍 <br/><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target="_blank"><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target="_blank">http://www.adaptivepath.com/publications/essays/archives/000385.php</a></a> <br/>Ajax: A New Approach to Web Applications <br/><a href="http://jibbering.com/2002/4/httprequest.html" target="_blank">http://jibbering.com/2002/4/httprequest.html</a> <br/>Using the XML HTTP Request object <br/><a href="http://developer.apple.com/internet/webcontent/xmlhttpreq.html" target="_blank">http://developer.apple.com/internet/webcontent/xmlhttpreq.html</a> <br/>Dynamic HTML and XML: The XMLHttpRequest Object <br/><a href="http://del.icio.us/popular/ajax" target="_blank">http://del.icio.us/popular/ajax</a> <br/>del.icio.us / popular / ajax <br/><a href="http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples" target="_blank">http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples</a> <br/>XMLHttpRequest &amp; Ajax Working Examples <br/><a href="http://www.xml.com/lpt/a/2005/02/09/xml-http-request.html" target="_blank">http://www.xml.com/lpt/a/2005/02/09/xml-http-request.html</a> <br/>Very Dynamic Web Interfaces <br/><a href="http://www.standards-schmandards.com/index.php?2005/03/01/16-ajax-and-accessibility" target="_blank">http://www.standards-schmandards.com/index.php?2005/03/01/16-ajax-and-accessibility</a> <br/>AJAX and Accessibility <br/><a href="http://www.xml.com/lpt/a/2005/05/11/ajax-error.html" target="_blank">http://www.xml.com/lpt/a/2005/05/11/ajax-error.html</a> <br/>Errors and AJAX <br/><a href="http://www.softwareas.com/ajax-patterns" target="_blank"><a href="http://www.softwareas.com/ajax-patterns" target="_blank">http://www.softwareas.com/ajax-patterns</a></a> <br/>AJAX Patterns: Design Patterns for AJAX Usability <br/><a href="http://www.backbase.com/download/Whitepaper%20Backbase%20AJAX%20and%20Beyond.pdf" target="_blank">http://www.backbase.com/download/Whitepaper%20Backbase%20AJAX%20and%20Beyond.pdf</a> <br/>Whitepaper Backbase AJAX and Beyond <br/><a href="http://www.ajaxpatterns.org" target="_blank">http://www.ajaxpatterns.org</a>/index.php?title=Main_Page <br/>AJAX patterns <br/><a href="http://www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html" target="_blank">http://www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html</a> <br/>A Simpler Ajax Path <br/> <br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2157" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2157</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[IIS错误代码大汇总 ]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-08-06T04:05:03+08:00</updated>
	  <published>2007-08-06T04:05:03+08:00</published>
		  <summary type="html"><![CDATA[400 无法解析此请求。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 401.1 未经授权：访问由于凭据无效被拒绝。<br/>　　401.2 未经授权: 访问由于服务器配置倾向使用替代身份验证方法而被拒绝。<br/>　　401.3 未经授权：访问由于 ACL 对所请求资源的设置被拒绝。<br/>　　401.4 未经授权：Web 服务器上安装的筛选器授权失败。<br/>　　401.5 未经授权：ISAPI/CGI 应用程序授权失败。<br/>　　401.7 未经授权：由于 Web 服务器上的 URL 授权策略而拒绝访问。<br/>　　403 禁止访问：访问被拒绝。<br/>　　403.1 禁止访问：执行访问被拒绝。<br/>　　403.2 禁止访问：读取访问被拒绝。<br/>　　403.3 禁止访问：写入访问被拒绝。<br/>　　403.4 禁止访问：需要使用 SSL 查看该资源。<br/>　　403.5 禁止访问：需要使用 SSL 128 查看该资源。<br/>　　403.6 禁止访问：客户端的 IP 地址被拒绝。<br/>　　403.7 禁止访问：需要 SSL 客户端证书。<br/>　　403.8 禁止访问：客户端的 DNS 名称被拒绝。<br/>　　403.9 禁止访问：太多客户端试图连接到 Web 服务器。<br/>　　403.10 禁止访问：Web 服务器配置为拒绝执行访问。<br/>　　403.11 禁止访问：密码已更改。<br/>　　403.12 禁止访问：服务器证书映射器拒绝了客户端证书访问。<br/>　　403.13 禁止访问：客户端证书已在 Web 服务器上吊销。<br/>　　403.14 禁止访问：在 Web 服务器上已拒绝目录列表。<br/>　　403.15 禁止访问：Web 服务器已超过客户端访问许可证限制。<br/>　　403.16 禁止访问：客户端证书格式错误或未被 Web 服务器信任。<br/>　　403.17 禁止访问：客户端证书已经到期或者尚未生效。<br/>　　403.18 禁止访问：无法在当前应用程序池中执行请求的 URL。<br/>　　403.19 禁止访问：无法在该应用程序池中为客户端执行 CGI。<br/>　　403.20 禁止访问：Passport 登录失败。<br/>　　404 找不到文件或目录。<br/>404.1 文件或目录未找到：网站无法在所请求的端口访问。<br/>404.2 文件或目录无法找到：锁定策略禁止该请求。<br/>404.3 文件或目录无法找到：MIME 映射策略禁止该请求。<br/>405 用于访问该页的 HTTP 动作未被许可。<br/>　　406 客户端浏览器不接受所请求页面的 MIME 类型。<br/>　　407 Web 服务器需要初始的代理验证。<br/>　　410 文件已删除。<br/>　　412 客户端设置的前提条件在 Web 服务器上评估时失败。<br/>　　414 请求 URL 太大，因此在 Web 服务器上不接受该 URL。<br/>　　500 服务器内部错误。<br/>　　500.11 服务器错误：Web 服务器上的应用程序正在关闭。<br/>　　500.12 服务器错误：Web 服务器上的应用程序正在重新启动。<br/>　　500.13 服务器错误：Web 服务器太忙。<br/>　　500.14 服务器错误：服务器上的无效应用程序配置。<br/>　　500.15 服务器错误：不允许直接请求 GLOBAL.ASA。<br/>　　500.16 服务器错误：UNC 授权凭据不正确。<br/>　　500.17 服务器错误：URL 授权存储无法找到。<br/>　　500.18 服务器错误：URL 授权存储无法打开。<br/>　　500.19 服务器错误：该文件的数据在配置数据库中配置不正确。<br/>　　500.20 服务器错误：URL 授权域无法找到。<br/>　　500 100 内部服务器错误：ASP 错误。<br/>　　501 标题值指定的配置没有执行。<br/>　　502 Web 服务器作为网关或代理服务器时收到无效的响应。<br/>　　WIN2003 SERVER IIS6.0 ASP 错误解析 <br/>事件 ID 描述<br/>　　0100 内存不足。无法分配所需的内存。<br/>　　0101 意外错误。函数返回 |。<br/>　　0102 要求字符串输入。函数需要字符串输入。<br/>　　0103 要求数字输入。函数需要数字输入。<br/>　　0104 不允许操作。<br/>　　0105 索引超出范围。数组索引超出范围。<br/>　　0106 类型不匹配。遇到未处理的数据类型。<br/>　　0107 数据大小太大。请求中发送的数据大小超出允许的限制。<br/>　　0108 创建对象失败。创建对象 &#39;%s&#39; 时出错。<br/>　　0109 成员未找到。<br/>　　0110 未知的名称。<br/>　　0111 未知的界面。<br/>　　0112 参数丢失。<br/>　　0113 脚本超时。超过了脚本运行的最长时间。可以通过为 Server.ScriptTimeout 属性指定一个新值或在 IIS 管理工具中修改值来更改此限制。<br/>　　0114 对象不可用于自由线程。应用程序对象仅接受自由线程对象；而对象 &#39;%s&#39; 不可用于自由线程。<br/>　　0115 意外错误。外部对象中发生一个可捕捉的错误 (%X)。脚本无法继续运行。<br/>　　0116 脚本分隔符结束标记丢失。脚本块缺少脚本结束标记 (%&gt;)。<br/>　　0117 脚本结束标记丢失。脚本块缺少脚本结束标记 () 或标记结束符号 (&gt;)。<br/>　　0118 对象的结束标记丢失。对象块缺少对象结束标记 () 或标记结束符号 (&gt;)。<br/>　　0119 Classid 或 Progid 属性丢失。对象实例 &#39;|&#39; 在对象标记中需要有效的 Classid 或 Progid。<br/>　　0120 Runat 属性无效。脚本标记或对象标记的 Runat 属性只能有 &#39;Server&#39; 值。<br/>　　0121 对象标记中的范围无效。对象实例 &#39;|&#39; 的作用范围不能是 Application 或 Session。要创建有 Session 或 Application 作用范围的对象实例，请将在 Global.asa 文件中加入 Object 标记。<br/>　　0122 对象标记中的范围无效。对象实例 &#39;|&#39; 必须有 Application 或 Session 作用范围。这将应用于所有在 Global.asa 文件内创建的对象。<br/>　　0123 缺少 Id 属性。缺少 Object 标记所需的 Id 属性。<br/>　　0124 Language 属性丢失。缺少 Object 标记所需的 Language 属性。<br/>　　0125 属性结束标记丢失。&#39;|&#39; 属性的值没有结束分隔符。<br/>　　0126 未找到 Include 文件。未找到 Include 文件 &#39;|&#39;。<br/>　　0127 HTML 注释的结束标记丢失。HTML 注释或在服务器端的包含文件缺少结束标记 (--&gt;)。<br/>　　0128 File 或 Virtual 属性丢失。Include 文件名必须用 File 或 Virtual 属性指定。<br/>　　0129 未知的脚本语言。服务器上找不到脚本语言 &#39;|&#39;。<br/>　　0130 File 属性无效。File 属性 &#39;|&#39; 不能以斜杠或反斜杠开始。<br/>　　0131 不允许的父路径。Include 文件 &#39;|&#39; 不能包含 &#39;..&#39; 来表示父目录。<br/>　　0132 编译错误。无法处理 Active Server Page &#39;|&#39;。<br/>　　0133 ClassID 属性无效。对象标记有一个无效的 ClassID &#39;|&#39;。<br/>　　0134 ProgID 属性无效。对象有一个无效的 ProgID &#39;|&#39;。<br/>0178 Server.Cr&#101;ateObject 访问错误。检查权限时调用 Server.Cr&#101;ateObject 失败。对此对象的访问被拒绝。<br/>0179 应用程序初始化错误。初始化 Application 对象时发生错误。<br/>0180 禁止的对象使用。Application 对象中不能保存内部对象。<br/>　　0181 线程模型无效。使用单元线程模型的对象不能存储在 Application 对象中。<br/>　　0182 对象信息丢失。Application 对象中不能保存信息不全的对象。需要此对象的线程模型信息。<br/>　　0183 空 Cookie 项。不能保存空项 Cookie。<br/>　　0184 Cookie 名称丢失。必须为 Cookie 指定名称。<br/>　　0185 默认属性丢失。未找到对象的默认属性。<br/>　　0186 证书分析错误。<br/>　　0187 对象添加冲突。无法将对象添加到应用程序。应用程序被另一个要求添加对象的请求锁定。<br/>　　0188 禁止的对象使用。无法将用对象标记创建的对象添加到会话内部。<br/>　　0189 禁止的对象使用。无法将用对象标记创建的对象添加到应用程序内部。<br/>　　0190 意外错误。释放外部对象时发生可捕获错误。<br/>　　0191 意外错误。外部对象的 OnStartPage 方法中发生可捕获错误。<br/>　　0192 意外错误。外部对象的 OnEndPage 方法中发生可捕获错误。<br/>　　0193 OnStartPage 失败。外部对象的 OnStartPage 方法中出错。<br/>　　0194 OnEndPage 失败。外部对象的 OnEndPage 方法中出错。<br/>　　0195 无效的服务器方法调用。Session_OnEnd 和 Application_OnEnd 期间不能调用 Server 对象的此方法。<br/>　　0196 无法启动进程外组件。只能使用 InProc 服务器组件。若要使用 LocalServer 组件，必须设置 AspAllowOutOfProcComponents 配置数据库设置。请参阅帮助文件，了解重要注意事项。<br/>　　0197 禁止的对象使用。不能将有单元模型行为的对象添加到应用程序内部对象。<br/>　　0198 服务器正在关闭。不能处理请求。<br/>　　0199 禁止的对象使用。不能将 JScript 对象添加到会话。<br/>　　0200 超出 &#39;Expires&#39; 属性范围。为 &#39;Expires&#39; 指定的日期和时间在 1980 年 1 月 1 日之前或在 2038 年 1 月 19 日 3:14:07 GMT 之后。<br/>　　0201 默认脚本语言无效。为此应用程序指定的默认脚本语言无效。<br/>0202 代码页丢失。代码页属性丢失。<br/>　　0203 代码页无效。指定的代码页属性无效。<br/>　　0204 CodePage 值无效。指定的 CodePage 值无效。<br/>　　0205 更改通知。创建更改通知事件失败。<br/>　　0206 不能调用 BinaryRead。使用 Request.Form 集合后不能调用 BinaryRead。<br/>　　0207 不能使用 Request.Form。调用 BinaryRead 后不能使用 Request.Form 集合。<br/>　　0208 不能使用通用 Request 集合。调用 BinaryRead 后不能使用通用 Request 集合。<br/>　　0209 TRANSACTION 属性的值非法。TRANSACTION 属性只能是 REQUIRED、REQUIRES_NEW、SUPPORTED 或 NOT_SUPPORTED。<br/>　　0210 方法未实施。此方法尚未实施。<br/>　　0211 对象超出范围。引用内置的 ASP 对象，此操作已不再有效。<br/>　　0212 无法清除缓冲区。客户端调试启用时，Response.Flush 之后不能有 Response.Clear。<br/>　　0214 路径参数无效。Path 参数超出允许的最大长度。<br/>　　0215 ENABLESESSIONSTATE 属性的值非法。ENABLESESSIONSTATE 属性的值只能是 TRUE 或 FALSE。<br/>　　0216 MSDTC 服务未运行。如果未运行 MSDTC 服务，则不能运行事务性网页。<br/>　　0217 对象标记中的范围无效。对象的作用范围必须是 Page、Session 或 Application。<br/>　　0218 LCID 丢失。LCID 属性丢失。<br/>　　0219 LCID 无效。指定的 LCID 不可用。<br/>　　0220 不允许请求 GLOBAL.ASA。不允许请求指向 GLOBAL.ASA 的 URL。<br/>　　0221 @ 命令指令无效。指定的 &#39;|&#39; 选项未知或无效。<br/>　　0222 TypeLib 规范无效。METADATA 标记包含无效的类型库规范。<br/>　　0223 未找到 TypeLib。METADATA 标签含有的类型库规范和注册表项不符。<br/>0224 无法加载 TypeLib。无法加载 METADATA 标记中指定的类型库。<br/>　　0225 无法包装 TypeLib。不能通过 METADATA 标记中指定的类型库创建类型库包装对象。<br/>　　0226 无法修改 StaticObjects。运行时无法修改 StaticObjects 集合。<br/>　　0227 Server.Execute 失败。调用 Server.Execute 失败。<br/>　　0228 Server.Execute 错误。加载此页时调用 Server.Execute 失败。<br/>　　0229 Server.Transfer 失败。调用 Server.Transfer 失败。<br/>　　0230 Server.Transfer 错误。加载此页时调用 Server.Transfer 失败。<br/>　　0231 Server.Execute 错误。使用的 URL 格式无效，或者使用了完全限定的绝对 URL。请使用相对 URL。<br/>　　0232 Cookie 规范无效。METADATA 标记包含无效的 Cookie 规范。<br/>　　0233 无法加载 Cookie 脚本源。无法加载 METADATA 标记中指定的 Cookie 脚本源文件。<br/>　　0234 包含指令无效。脚本块中可能没有服务器端包含文件指令。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2156" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2156</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Ajax.net使用初体验 ]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-08-04T03:53:24+08:00</updated>
	  <published>2007-08-04T03:53:24+08:00</published>
		  <summary type="html"><![CDATA[AJAX在去年已经接触过，但都是使用手动的方法编写客户端代码，再加上被请求的页面，感觉非常累，虽然早听说过AJAX.NET和其他一些第3方开发的框架，却一直没有时间来体验。今天干完手上的活，下了个最新版本的AJAX.NET体验了下<br/><br/>我使用的还是VS2003，下载了个最新版本的AJAX.NET 6.4.5.1，下载地址：www.schwarz-interactive.de 下面说说使用方法：<br/><br/>1、准备工作<br/>新建项目，使用.NET1.1就引用下载下来的AJAX.NET的类库AjaxPro.dll，如果是使用.NET2.0 就引用AjaxPro2.dll<br/>首先修改WEB.CONFIG文件<br/> 在&lt;system.web&gt; 节点内增加<br/><br/>&lt;httpHandlers&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &lt;addverb=&#34;*&#34;path=&#34;*.ashx&#34;type=&#34;AjaxPro.AjaxHandlerFactory,AjaxPro&#34;/&gt;<br/>&lt;/httpHandlers&gt;<br/><br/><br/>2、然后在Page_Load事件中注册页面类<br/>如我将使用AJAX的页面类名为‘AjaxControls’，注册语句就这样写：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxControls));<br/><br/>红字的地方是我的页面的类名<br/>这句的作用实际上是在页面被请求的时候生成几句调用JS的SCRIPT代码<br/><br/><br/>3、编写服务器端处理函数<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [AjaxPro.AjaxMethod]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Fun(string str) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return str;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/><br/>‘[AjaxPro.AjaxMethod]’这句是关键，函数或方法写法没什么特别的地方，只是要使用这句声明这个函数是由AJAX.NET在页面异步请求的，总之记住要通过AJAX获得数据的后台函数就使用[AjaxPro.AjaxMethod]来声明一下。<br/><br/>另外，在AJAX.NET中如果处理函数需要对SESSION进行操作，‘[AjaxPro.AjaxMethod]’需要改成‘[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.ReadWrite)]’在 [AjaxPro.AjaxMethod(AjaxPro.……)]&nbsp;&nbsp;的‘…… ’部分ajax.net还提供了其他很多方法，可以处理一些特殊的请求。<br/>还有一点注意，如果使用Application，直接读取或写入Application也是不行的，需要使用HttpContext.Current.Application，同样对 Request的访问也需要使用HttpContext.Current.Request。原因是直接使用的Application 或Request等 都是由Page类继承下来的，而用Ajax.net对后台方法访问的时候，这些方法并不属于Page类。但是Session比较特殊，使用 HttpContext.Current.Session仍然不能访问，必须使用上面一段所用的方法并且直接就用Session就行。<br/><br/><br/>4、客户端代码<br/>在我的这个示例中，使用‘Ajax.AjaxControls.Fun(&#34;测试用的传递的字符串参数&#34;);’请求后台的函数，然后返回一个OBJECT对象，这个OBJECT的VALUE属性就可以得到后台函数的返回值<br/>如：<br/><br/>function doTest() <br/>{ <br/>var getobject = Ajax.AjaxControls.Fun(&#34;测试用的传递的字符串参数&#34;); <br/>alert(getobject.value); <br/>}<br/><br/>Ajax 是我这个项目的命名空间<br/>AjaxControls 是我这个页面的的类名<br/>Fun 很明显就是声明了的那个AJAX可调用的方法名<br/>()中的参数也就是我的Fun函数所需要的参数<br/>doTest() 只是一个客户段的函数，可以绑到控件的事件中，也可以已不用事件，随便怎么处理<br/>客户端异步请求这个函数所得到的和平时我们用函数返回的稍微不同的就是，平时直接得到函数类型的返回值，而使用AJAX.NET客户端异步请求后台函数得到的是个OBJECT，要通过这个OBJECT的VALUE属性才能得到函数返回的值。<br/>通常这里的客户段脚本还可以这样写：<br/> <br/>function doTest() <br/>{ <br/>Ajax.AjaxControls.Fun(&#34;测试用的传递的字符串参数&#34;,getdata); <br/>}<br/>function getdata(rv)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(rv.value);<br/>}<br/><br/><br/>Ajax.AjaxControls.Fun 中的参数除了对应后台函数的参数外，最后可以使用一个表达式参数，这个参数是某个客户段函数名，设置后，Ajax.AjaxControls.Fun请求后所获得OBJECT对象将被做为 表达式参数函数的一个参数传递到该函数中，然后通过这个OBJECT参数的VALUE就可以获得 AJAX请求后台函数所返回的值了<br/>通过这几个步骤 就可以做出一个简单的使用Ajax.net结合.NET的示例页面了。<br/><br/>下面说说用后的感受：<br/>总体感觉上使用起来很方便，很简单，但是功能不够强大，也许是我初次涉及的缘故，还没摸索出更高级的使用方法，但是在对服务器控件的控制上基本不能实现，需要使用其他方法如获得控件输出样式，然后通过客户端方法加载，还有除了能异步的获得后台请求的函数或方法的返回值之外，其他更具体复杂的操作都需要手动的写代码解决，不过确实是不错的东西，可以很快速的完成某些AJAX的效果。也许还有很多更强大的功能我还没摸索到，希望大家指教 ，补充~]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2153" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2153</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[关于Ajax.Net的快速入门 ]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-08-03T03:50:27+08:00</updated>
	  <published>2007-08-03T03:50:27+08:00</published>
		  <summary type="html"><![CDATA[现在的项目准备用ajax，用ajax.net实现，而不是atlas，所以先看下ajax.net，Ajax.Net现在的最新版本是AjaxPro5.11.4.2,下载地址是:www.schwarz-interactive.de<br/><br/>　　首先我们新建个项目，名字是AjaxPro,我用的是vs2005beta2版本。<br/><br/>　　右击站点名字点add reference添加对我们刚刚下载来的那个叫AjaxPro.2.dll的引用，如果你用的是vs2003，则添加对AjaxPro.dll的引用，然后我们在添加个web.config文件(很郁闷的是vs2005不再自动添加web.config文件拉)，修改web.config如下:<br/><br/>&lt;system.web&gt; &lt;httpHandlers&gt; <br/>&lt;add verb=&#34;POST,GET&#34; path=&#34;ajaxpro/*.ashx&#34; <br/>type=&#34;AjaxPro.AjaxHandlerFactory, <br/>AjaxPro.2&#34;/&gt; &lt;/httpHandlers&gt;<br/><br/>　　意思是所有的ajaxpro/*.ashx请求都由Ajax.PageHandlerFactory处理，而不是由默认的System.Web.UI.PageHandlerFactory处理程序工厂来处理。<br/><br/>　　我们现在给Default.aspx.cs文件添加个名字空间namespace MyDemo，这里更加郁闷的是为什么vs2005beta2怎么不给你自动添加名字空间啊?和2003怎么完全不同呢?<br/><br/>　　现在我们写个AjaxMethod服务器端方法，他和普通的服务器方法唯一不同的地方就是他必须要在方法的上面添加个[AjaxPro.AjaxMethod],代码如下:<br/><br/>[AjaxPro.AjaxMethod]<br/>public DateTime GetServerTime()<br/>{<br/>return DateTime.Now;<br/>}<br/>[AjaxPro.AjaxMethod]public int <br/>AddTwo(int firstInt, int secondInt)<br/>{<br/>return firstInt + secondInt;<br/>}<br/><br/>　　我们还必须在Page_Load里面把这个类注册下，如下:<br/><br/>protected void Page_Load<br/>(object sender, EventArgs e)<br/>{<br/>AjaxPro.Utility.RegisterTypeForAjax<br/>(typeof(_Default));<br/>}这个时候我们还必须修改aspx页面的指令行，因为我们在后台搞了个名字空间，如下:Inherits=&#34;MyDemo._Default&#34;也就是要把名字空间也写上。我们再写客户端脚本来调用服务器方法。代码里有详细的注释，前台Default.aspx代码:<br/><br/>&lt;%@ Page Language=&#34;C#&#34; <br/>AutoEventWireup=&#34;true&#34;CodeFile=&#34;Default.aspx.cs&#34; <br/>Inherits=&#34;MyDemo._Default&#34; %&gt;<br/>&lt;!DOCTYPE html PUBLIC &#34;-<br/>//W3C//DTD XHTML 1.1//EN&#34; <br/>&#34;<a href="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" target="_blank">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd</a>&#34;&gt;<br/>&lt;html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; &gt;<br/>&lt;head runat=&#34;server&#34;&gt;&lt;title&gt;Untitled Page<br/>&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;form id=&#34;form1&#34;<br/>runat=&#34;server&#34;&gt;&lt;div&gt;&lt;input id=&#34;Button1&#34;<br/>type=&#34;button&#34; value=&#34;获得服务器时间&#34; <br/>onclick=&#34;getServerTime();&#34; /&gt;&lt;input <br/>id=&#34;Text1&#34; type=&#34;text&#34; /&gt;&lt;input <br/>id=&#34;Text2&#34; type=&#34;text&#34; /&gt;&lt;input<br/>id=&#34;Button2&#34; type=&#34;button&#34; <br/>value=&#34;得到两个文本框的和&#34; <br/>onclick=&#34;add(document.getElementById(&#39;Text1&#39;).<br/>value,document.getElementById(&#39;Text2&#39;).value)&#34; <br/>/&gt;&lt;/div&gt;&lt;/form&gt;&lt;script <br/>type=&#34;text/javascript&#34;&gt;<br/>function getServerTime()<br/>{<br/>//MyDemo._Default.GetServerTime()<br/>得到从服务器传来的数据是object，<br/>要写.valuealert<br/>(MyDemo._Default.GetServerTime().value);<br/>}<br/>function add(a,b)<br/>{<br/>//把文本框的值转换成intvar <br/>a1 = parseInt(a);var b1 = parseInt(b);<br/>//第1、2参数为服务器方法所需要的参数，<br/>后面一个是如果服务器返回数据<br/>//客户端要处理这些数据的js函数名，<br/>他有个参数就是从服务器传来的数据<br/>MyDemo._Default.AddTwo(a1,b1,getAdd);<br/>}<br/>function getAdd(rel)<br/>{<br/>//要加上.valuealert(rel.value);<br/>}<br/>&lt;/script&gt;&lt;/body&gt;&lt;/html&gt;<br/>后台Default.aspx.cs代码：<br/>using System;using System.Data;<br/>using System.Configuration;<br/>using System.Web;<br/>using System.Web.Security;using <br/>System.Web.UI;<br/>using System.Web.UI.WebControls;<br/>using System.Web.UI.WebControls.WebParts;<br/>using System.Web.UI.HtmlControls;<br/>namespace MyDemo<br/>{<br/>public partial class _Default : <br/>System.Web.UI.Page{protected void <br/>Page_Load(object sender, EventArgs e){AjaxPro.Utility.RegisterTypeForAjax<br/>(typeof(_Default));<br/>}<br/>[AjaxPro.AjaxMethod]public <br/>DateTime GetServerTime()<br/>{return DateTime.Now;<br/>}[AjaxPro.AjaxMethod]public int AddTwo<br/>(int firstInt, int secondInt)<br/>{<br/>return firstInt + secondInt;<br/>}}} <br/><br/>按F5运行结果如下，<br/>firefox里面测试通过： <br/><br/>using System;using System.Data;<br/>using System.Configuration;<br/>using System.Web;<br/>using System.Web.Security;<br/>using System.Web.UI;<br/>using System.Web.UI.WebControls;<br/>using System.Web.UI.WebControls.WebParts;<br/>using System.Web.UI.HtmlControls;<br/>namespace MyDemo<br/>{<br/>public partial class _Default :<br/>System.Web.UI.Page<br/>{<br/>protected void Page_Load<br/>(object sender, EventArgs e)<br/>{AjaxPro.Utility.RegisterTypeForAjax<br/>(typeof(_Default));}<br/>[AjaxPro.AjaxMethod]public DateTime <br/>GetServerTime(){return DateTime.Now;<br/>}<br/>[AjaxPro.AjaxMethod]public <br/>int AddTwo(int firstInt, <br/>int secondInt)<br/>{return firstInt + secondInt;}}}<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2152" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2152</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[JavaScript浮点运算的问题]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.cnsdn.com.cn/blog/</uri>
		 <email>cnsdn@163.com</email>
	  </author>
	  <category term="" scheme="http://www.cnsdn.com.cn/blog/default.asp?cateID=4" label="B/S开发" /> 
	  <updated>2007-06-11T09:56:12+08:00</updated>
	  <published>2007-06-11T09:56:12+08:00</published>
		  <summary type="html"><![CDATA[　　最近在做一个工资核算的系统，所有的运算全部在前台进行，因此用了的是JS来做。<br/>做完以后，经手工核算，发现一个奇怪的问题。就是JS算出来的结果跟用计算器算出来的结果有差距。<br/>想了很久，也没有想出问题出在哪里。<br/>　　问题这样的：<br/>　　37.5*5.5=206.08&nbsp;&nbsp;(JS算出来是这样的一个结果，我四舍五入取两位小数)<br/>　　我先怀疑是四舍五入的问题，就直接用JS算了一个结果为：206.08499999999998<br/>　　怎么会这样，两个只有一位小数的数字相乘，怎么可能多出这么小数点出来。<br/>　　我Google了一下，发现原来这是JavaScript浮点运算的一个bug。<br/>　　比如：7*0.8 JavaScript算出来就是：5.6000000000000005<br/><br/>　　网上找到了一些解决办法，就是重新写了一些浮点运算的函数。<br/>　　下面就把这些方法摘录下来，以供遇到同样问题的朋友参考：<br/>　　<br/>　　 程序代码<br/>//除法函数，用来得到精确的除法结果<br/>//说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。<br/>//调用：accDiv(arg1,arg2)<br/>//返回值：arg1除以arg2的精确结果<br/>function accDiv(arg1,arg2){<br/>&nbsp;&nbsp;&nbsp;&nbsp;var t1=0,t2=0,r1,r2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;try{t1=arg1.toString().split(&#34;.&#34;)[1].length}catch(e){}<br/>&nbsp;&nbsp;&nbsp;&nbsp;try{t2=arg2.toString().split(&#34;.&#34;)[1].length}catch(e){}<br/>&nbsp;&nbsp;&nbsp;&nbsp;with(Math){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1=Number(arg1.toString().replace(&#34;.&#34;,&#34;&#34;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2=Number(arg2.toString().replace(&#34;.&#34;,&#34;&#34;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (r1/r2)*pow(10,t2-t1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/>//给Number类型增加一个div方法，调用起来更加方便。<br/>Number.prototype.div = function (arg){<br/>&nbsp;&nbsp;&nbsp;&nbsp;return accDiv(this, arg);<br/>}<br/><br/>//乘法函数，用来得到精确的乘法结果<br/>//说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。<br/>//调用：accMul(arg1,arg2)<br/>//返回值：arg1乘以arg2的精确结果<br/>function accMul(arg1,arg2)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;var m=0,s1=arg1.toString(),s2=arg2.toString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;try{m+=s1.split(&#34;.&#34;)[1].length}catch(e){}<br/>&nbsp;&nbsp;&nbsp;&nbsp;try{m+=s2.split(&#34;.&#34;)[1].length}catch(e){}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return Number(s1.replace(&#34;.&#34;,&#34;&#34;))*Number(s2.replace(&#34;.&#34;,&#34;&#34;))/Math.pow(10,m)<br/>}<br/><br/>//给Number类型增加一个mul方法，调用起来更加方便。<br/>Number.prototype.mul = function (arg){<br/>&nbsp;&nbsp;&nbsp;&nbsp;return accMul(arg, this);<br/>}<br/><br/>//加法函数，用来得到精确的加法结果<br/>//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。<br/>//调用：accAdd(arg1,arg2)<br/>//返回值：arg1加上arg2的精确结果<br/>function accAdd(arg1,arg2){<br/>&nbsp;&nbsp;&nbsp;&nbsp;var r1,r2,m;<br/>&nbsp;&nbsp;&nbsp;&nbsp;try{r1=arg1.toString().split(&#34;.&#34;)[1].length}catch(e){r1=0}<br/>&nbsp;&nbsp;&nbsp;&nbsp;try{r2=arg2.toString().split(&#34;.&#34;)[1].length}catch(e){r2=0}<br/>&nbsp;&nbsp;&nbsp;&nbsp;m=Math.pow(10,Math.max(r1,r2))<br/>&nbsp;&nbsp;&nbsp;&nbsp;return (arg1*m+arg2*m)/m<br/>}<br/><br/>//给Number类型增加一个add方法，调用起来更加方便。<br/>Number.prototype.add = function (arg){<br/>&nbsp;&nbsp;&nbsp;&nbsp;return accAdd(arg,this);<br/>}<br/><br/><br/><br/>　　在你要用的地方包含这些函数，然后调用它来计算就可以了。<br/>　　比如你要计算：7*0.8 ，则改成 (7).mul(8) <br/>　　其它运算类似，就可以得到比较精确的结果。<br/><br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.cnsdn.com.cn/blog/images/html.gif" style="margin:0px 2px -3px 0px"> HTML代码</div><div class="UBBContent"><TEXTAREA rows="8" id="temp32557"><script>
//除法函数，用来得到精确的除法结果
//说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用：accDiv(arg1,arg2)
//返回值：arg1除以arg2的精确结果
function accDiv(arg1,arg2){
	var t1=0,t2=0,r1,r2;
	try{t1=arg1.toString().split(&#34;.&#34;)[1].length}catch(e){}
	try{t2=arg2.toString().split(&#34;.&#34;)[1].length}catch(e){}
	with(Math){
		r1=Number(arg1.toString().replace(&#34;.&#34;,&#34;&#34;))
		r2=Number(arg2.toString().replace(&#34;.&#34;,&#34;&#34;))
		return (r1/r2)*pow(10,t2-t1);
	}
}

//给Number类型增加一个div方法，调用起来更加方便。
Number.prototype.div = function (arg){
	return accDiv(this, arg);
}

//乘法函数，用来得到精确的乘法结果
//说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用：accMul(arg1,arg2)
//返回值：arg1乘以arg2的精确结果
function accMul(arg1,arg2)
{
	var m=0,s1=arg1.toString(),s2=arg2.toString();
	try{m+=s1.split(&#34;.&#34;)[1].length}catch(e){}
	try{m+=s2.split(&#34;.&#34;)[1].length}catch(e){}
	return Number(s1.replace(&#34;.&#34;,&#34;&#34;))*Number(s2.replace(&#34;.&#34;,&#34;&#34;))/Math.pow(10,m)
}

//给Number类型增加一个mul方法，调用起来更加方便。
Number.prototype.mul = function (arg){
	return accMul(arg, this);
}

//加法函数，用来得到精确的加法结果
//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用：accAdd(arg1,arg2)
//返回值：arg1加上arg2的精确结果
function accAdd(arg1,arg2){
	var r1,r2,m;
	try{r1=arg1.toString().split(&#34;.&#34;)[1].length}catch(e){r1=0}
	try{r2=arg2.toString().split(&#34;.&#34;)[1].length}catch(e){r2=0}
	m=Math.pow(10,Math.max(r1,r2))
	return (arg1*m+arg2*m)/m
}

//给Number类型增加一个add方法，调用起来更加方便。
Number.prototype.add = function (arg){
	return accAdd(arg,this);
}

　　document.writeln(&#34;未改进的运算：7*0.8=&#34;+7*0.8+&#34;\<br>&#34;);
　　document.writeln(&#34;改进以后的运算：7*0.8=&#34;+(7).mul(0.8)+&#34;\<br>&#34;);
　　//你可以修改代码进行其它的运算测试
</script></TEXTAREA><br/><INPUT onclick="runEx('temp32557')"  type="button" value="运行此代码"/> <INPUT onclick="doCopy('temp32557')"  type="button" value="复制此代码"/><br/> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</div></div>　　]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.cnsdn.com.cn/blog/default.asp?id=2079" /> 
	  <id>http://www.cnsdn.com.cn/blog/default.asp?id=2079</id> 
  </entry>	
		
</feed>