信息系统项目管理师_2024年软考学习应考交流_信息系统项目管理师考试

 找回密码
 马上注册

QQ登录

只需一步,快速开始

楼主: 翔羽
打印 上一主题 下一主题

[转帖]ASP编程常用的代码

  [复制链接]

该用户从未签到

升级  30.8%

51
 楼主| 发表于 2006-2-24 09:20:48 | 只看该作者
<p><strong>存储过程使用大全</strong></p><hr/><p>1,调用没有参数的存储过程<br/>&lt;%<br/>set conn=server.CreateObject("adodb.connection")<br/>set cmd=server.CreateObject("adodb.command")<br/>strconn="dsn=pubs;uid=sa;pwd"</p><p>conn.Open strconn<br/>set cmd.ActiveConnection=conn</p><p>cmd.CommandText="{call nono}"</p><p>''set rs=cmc.exe 或者cmd.execute</p><p>set rs=cmd.Execute()</p><p>%&gt;<br/>2,一个输入的参数的存储过程<br/>&lt;%<br/>set conn=server.CreateObject("adodb.connection")<br/>set cmd=server.CreateObject("adodb.command")<br/>strconn="dsn=pubs;uid=sa;pwd"</p><p>conn.Open strconn<br/>set cmd.ActiveConnection=conn</p><p>cmd.CommandText="{call oneinput(?)}"<br/>cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger ,adParamInput )<br/>cmd("@aaa")=100</p><p>cmd.Execute()</p><p>%&gt;<br/>3,一个输入参数和一个输出的参数<br/>&lt;%<br/>set conn=server.CreateObject("adodb.connection")<br/>set cmd=server.CreateObject("adodb.command")<br/>strconn="dsn=pubs;uid=sa;pwd"</p><p>conn.Open strconn<br/>set cmd.ActiveConnection=conn</p><p>cmd.CommandText = "{call oneinout(?,?)}"<br/>cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger,adParamInput)<br/>cmd("@aaa")=10<br/>cmd.Parameters.Append cmd.CreateParameter("@bbb",adInteger,adParamOutput)</p><p>cmd.Execute()</p><p>bbb=cmd("@bbb")<br/>%&gt;<br/>4,一个输入参数,一个输出参数,和一个返回值<br/>&lt;%<br/>set conn=server.CreateObject("adodb.connection")<br/>set cmd=server.CreateObject("adodb.command")<br/>strconn="dsn=pubs;uid=sa;pwd"</p><p>conn.Open strconn<br/>set cmd.ActiveConnection=conn</p><p>cmd.CommandText="{?=call onereturn(?,?)}"</p><p>cmd.Parameters.Append cmd.CreateParameter("@return_value",adInteger,adParamReturnvalue )<br/>cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger,adParamInput )<br/>cmd("@aaa")=10<br/>cmd.Parameters.Append cmd.CreateParameter("@bbb",adInteger,adParamOutput)</p><p>cmd.Execute()</p><p>bbb=cmd("@bbb")<br/>rrr=cmd("@return_value")<br/>%&gt;</p><p><br/>作者:ministrybill(生命的烙印)</p><p>ASP调用Procedure</p><p>Microsoft 的Active Server Pages 即ASP,是一套微软开发的服务器端脚本环境,ASP内含于IIS 和PWS之中,通过ASP我们可以结合 HTML 网页、ASP指令和 ActiveX 元件建立动态、交互且高效的WEB服务器应用程序。 </p><p>----   存储过程(Stored-Procedure)是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。 </p><p>----   ASP包含的ADO(ActiveX Data Object)即ActiveX数据对象技术与ASP相结合提供了强大的站点数据库访问功能。ADO具有操作简单快速,占用内存和硬盘空间少的优点。通过ODBC,ADO可以与包括SQL Server,Oracle,Sybase等多种数据库相连接。加上ADO支持存储过程,这使得ASP能与大型数据库相结合,完成大型复杂高效率的站点数据库应用成为可能。 </p><p>---- 一、采用存储过程的优点: </p><p>----   在客户端工作站中执行大而复杂的SQL批处理时,存储过程提供了诸多方便之处: * 可以在存储过程中利用Transact-SQL的强大功能。一个SQL存储过程可以包含多个SQL语句。通过使用变量和条件。能够用存储过程建立非常复杂的查询,以非常复杂的方式更新数据库。 </p><p>快速执行。在第一次执行之后,存储过程在数据库中已经预先经过了优化和编译,存储在高速缓存之中,在接下来的运行中可以直接从高速缓存中执行,省去了以后执行的优化和编译阶段,节省了执行过程的大量时间。 </p><p>减少网络通信量。存储过程能包含巨大而复杂的查询或SQL操作。它们已被编译完毕并存储在SQL数据库内,当客户发出执行存储过程的请求时,它们就在SQL Server上运行,只把最终结果传送给客户应用程序。所以使得客户机与服务器的通讯量降至最小,大大减少了网络负荷。 </p><p>自动、复杂或敏感的事务处理。在一个存储过程中对某些表进行各种处理,可以保证这些表的数据完整性。 <br/>----   ASP调用存储过程除了具有存储过程本身的优点外还能够减少在ADO中构造复杂SQL语句的难度,省去繁杂的标点符号的处理。通过在多个网页中调用同一个存储过程。可以使站点更易于维护和更新。 <br/></p>

该用户从未签到

升级  30.8%

52
 楼主| 发表于 2006-2-24 09:21:06 | 只看该作者
二、ASP调用存储过程的方法: <p>----   调用存储过程的方法需要使用ADO的Command对象。Command对象是对一个数据源运行特定命令的定义(例如,一个SQL查询或一个SQL存储过程)。下面以MS SQL SERVER6.5为后台数据库,介绍ASP调用存储过程的方法。 </p><p>----   例如,在表User中保存了用户名和密码。现在建立一个检查密码的存储过程sp_CheckPass来检查用户是否输入了合法的密码。建立存储过程,可以从Microsoft SQL Sever程序组中启动ISQL/w。然后,在查询窗口中输入存储过程: </p><p>/*存储过程例程*/<br/>CREATE PROCEDURE sp_CheckPass</p><p>@CHKName VARCHAR(30),@CHKPass VARCHAR(30),<br/>@ISValid CHAR(8) OUTPUT  <br/>AS</p><p>IF EXISTS(SELECT UserName FROM Users</p><p>WHERE UserName=@CHKName AND UserPwd=@CHKPass)</p><p>SELECT @ISVaid="pass"</p><p>ELSE</p><p>SELECT @ISValid="Invalid"</p><p>----   存储过程接收两个输入参数。输入参数@CHKaName向存储过程传递一个用户名。@CHKPass向存储过程传递一个密码。如果有用户拥有指定的密码,输出参数将返回“pass",否则,返回“Invalid"。 <br/>----   现在我们可以在CheckPass.asp中调用存储过程sp_CheckPass 了。 </p><p><br/>CheckPass.asp</p><p>&lt; !--#INCLUDE VIRTUAL="ADOVBS.inc"-- &gt; ’<br/>包含VBSCRIPT的常量定义文件</p><p>&lt; %</p><p>Set DataConn=Sever.CreateObject("ADODB.Connection") <br/>'建立连接对象</p><p>Dataconn.Open"DSN=user;SERVER=APP_SERVER;<br/>UID=saWD=;APP=Microsoft(R) Developer Studio;<br/>WSID=APP_SERVER;Regional=Yes"</p><p>Set cmdTemp=Sever.CreateObject("ADODB.Command")<br/>'建立命令对象</p><p>Set cmdTemp.ActiveConnection=DataConn</p><p>cmdTemp.CommandType=adCMdStoredProc <br/>'指定要执行的是一个存储过程</p><p>cmdTemp.CommandText="sp_CheckPass" <br/>'存储过程名称</p><p>Set tmpFirstParam=cmdTemp.CreateParameter<br/>("UserName",adVarChar,adParamIntput,30) <br/>'创建输入参数对象 </p><p>cmdTemp.Parameters.Append.tmpFirstParam <br/>'把参数加到参数集合</p><p>Set tmpSecondParam=cmdTemp.CreateParameter<br/>("UserPwd",adVarChar,adParamInput,30)</p><p>cmdTemp.ParaMeters.Append tmpSecondParam</p><p>Set tmpThirdParam=cmdTemp.CreateParameter<br/>("RetValue",adChar,adParamOutput,8) <br/>'创建返回参数对象</p><p>cmdTemp.Parameters.Append tmpThirdParam</p><p>cmdTemp("UserName")=Request.FORM("UserName")<br/>’取得输入参数 </p><p>cmdTemp("UserPwd")=Request.FORM("UserPwd")</p><p>cmdTemp.Execute ’执行存储过程</p><p>% &gt;</p><p>The Check Result is &lt; %=cmdTemp("RetValue")% &gt; <br/>'输出返回值</p><p>&lt;%DataConn.Close '关闭数据库连接%&gt;</p><p>//用户输入界面</p><p>&lt;HTML&gt;<br/>&lt;HEAD&gt;&lt; TITLE&gt;Registration Page&lt;/TITLE&gt;&lt;/HEAD&gt; <br/>&lt;H2&gt;请输入用户名和密码:&lt;/H2&gt; <br/>&lt;FORM METHOD="OST" ACTION="CheckPass.asp"&gt;<br/>&lt;p&gt;用户名: <br/>&lt;input name="UserName" type="TEXT"&gt;<br/>&lt;/p&gt;<br/>&lt;p&gt; 密 码: <br/>&lt;input name="UserPwd" type="ASSWORD"&gt;<br/>&lt;input type="submit" name="submit" value="确定"&gt;<br/>&lt;/p&gt;<br/>&lt;/FORM&gt; &lt;/BODY&gt;<br/>&lt;/HTML&gt;</p><p>----   在这个例子中,首先创建了命令对象的一个实例。接着,ActiveConnection属性把命令和一个打开的连接联系在一起。CommandText属性指定要执行的存储过程名。CommandType属性为adCMDStoredProc属性,指明该命令是一个存储过程的定义。而为了得到存储过程的返回状态值必须用命令对象的CreateParameter()方法建立参数。本例中CreateParameter()方法有四个参数: <br/>---- 第一个参数为新参数指定一个名字; <br/>---- 第二个参数指定数据类型; <br/>---- 第三个参数指定新参数的类型。在此例中,常量adParamReturnValue指明该参数是一个返<br/>---- 回参数。常量adParamInput则指明该参数是一个输入参数; <br/>---- 第四个参数指定了每个参数的最大长度,特别是当建立的参数是变长度数据类型,如<br/>---- VARCHAR型时,就必须指定一个最大长度。 <br/>---- 本例中用CreateParameter()方法建立了三个参数对象。其中两个输入参数,一个输出参数。建立了任何新参数之后,都必须把它添加到命令对象的Parameters集合中。Append方法用来把新参数添加到这个集合中。最后,调用Execute方法执行存储过程。用户输入的用户名和密码被传递给存储过程。如果表中存在这个名字-密码组合,则报告该密码为Pass,否则报告该密码为Invalid。<br/>asp开发bs架构的三层系统,对于中小结构的系统把业务逻辑放在sqlserver的存储过程里面是一个很好的实现方法,但这么做出现了一个asp客户端和数据库存储过程之间配合调试的不方便.</p>

该用户从未签到

升级  30.8%

53
 楼主| 发表于 2006-2-24 09:21:20 | 只看该作者
<p>实际开发中我写了下面一个函数,自动把asp端传给数据库的参数取出,自动生成符合sqlserver查询分析器的规则的存储过程执行命令串,放在textarea控件里,可以从页面直接复制到查询分析器里进行存储过程调试,下面就是程序.<br/>‘==================================================================’<br/>dim dsn ‘数据源<br/>dim storename ‘存储过程名<br/>dim con ‘Connection对象<br/>dim cmd ‘Command对象<br/>dim rs ‘Recordset 对象<br/>set con=server.createobject(“ADODB.Connection”)<br/>con.open dsn<br/>set cmd=server.createobject("ADODB.Command") <br/>set cmd.ActiveConnection=Con<br/>cmd.CommandText= storename <br/>cmd.Commandtype=adCmdStoredProc<br/>cmd.Parameters.Append cmd.CreateParameter("@State",adInteger,adParamInput,4) <br/>cmd.Parameters.Append cmd.CreateParameter("@WhereT",adVarChar,adParamInput,200) <br/>cmd.Parameters.Append cmd.CreateParameter("@BranchType",adVarChar,adParamInput,50) <br/>cmd("@State") = 1 <br/>cmd("@WhereT")=”2”<br/>cmd("@BranchType")=”3”<br/>getpmt(cmd) ‘获取存储过程的参数<br/>set rs=server.CreateObject("adodb.recordset") <br/>rs.CursorType =3 <br/>rs.LockType =3 <br/>rs.CursorLocation =3 <br/>set rs.Source =cmd <br/>rs.Open<br/>‘======================================================’<br/>‘ 形成存储过程的函数<br/>‘=======================’<br/>‘ 输入参数 a= command对象<br/>‘=======================’<br/>sub getpmt(a)<br/>b=a.CommandText<br/>b=replace(b,"?","")<br/>b=replace(b,",","")<br/>b=replace(b,"}","")<br/>b=replace(b,"{","")<br/>b=replace(b," ","")<br/>b=replace(b,"call","")<br/>b=replace(b,"(","")<br/>b=replace(b,")","")<br/>Response.Write "&lt;center&gt;&lt;table border=1 cellpadding =0 cellspacing =0 bordercolordark=#ffffff bordercolorlight=#cccc88&gt;&lt;tr onclick="&amp;b&amp;".style.display=''&gt;&lt;td bgcolor=#cccc88&gt;" &amp; b &amp; "&lt;/td&gt;&lt;/tr&gt;&lt;tr id="&amp;b&amp;" style=display:none&gt;&lt;td&gt;"<br/>Response.Write "&lt;TEXTAREA rows=6 cols=70 style='font-color:#ccc888;bgcolor:#ffffc'&gt;"<br/>Response.Write b<br/>for each element in a.parameters<br/>c=element<br/>c="'" &amp; replace(c,"'","''") &amp; "'"<br/>d=d &amp; vbcrlf &amp; element.name &amp;"="&amp; c &amp;","<br/>next <br/>d=left(d,len(d)-1)<br/>Response.Write d<br/>Response.Write "&lt;/TEXTAREA&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/center&gt;"<br/>end sub<br/></p>

该用户从未签到

升级  30.8%

54
 楼主| 发表于 2006-2-24 09:21:37 | 只看该作者
<p><strong>数据库查询语言</strong></p><hr/><p>  原定计划从本篇开始就要给大家介绍 ASP 内建的 ActiveX 组件,但是考虑到我们在往后的学习中将会接触到大量的数据库查询,因此作者临时决定花一到两篇的篇幅向大家简要介绍一些数据库查询语言的基本知识,这其实也是学习 ASP 所必须掌握的一门知识。是否能够灵活地运用数据库查询语言,将直接关系到 ASP 程序的执行效率等一系列问题,所以请各位务必重视。<br/><br/>   相信很多朋友都听说过 SQL 这个名字,如果你是计算机方面的行家,SQL 的大名一定是如雷贯耳。那么 SQL 究竟是什么呢?SQL 一词实际上是 "Structured Query Language" 结构式查询语言的缩写,是用于对存放在计算机数据库中的数据进行组织、管理和检索的一种工具;是一种特定类型的数据库 -- 关系数据库。而控制这种数据库的计算机程序就是我们常说的 DBMS-- 数据库管理系统。譬如:SQL Server、Oracle、Sybase、DB2 等等。当用户想要检索数据库中的数据时,就通过 SQL 语言发出请求,接着 DBMS 对该 SQL 请求进行处理并检索所要求的数据,最后将其返回给用户,此过程被称作为数据库查询,这也就是数据库查询语言这一名称的由来。<br/><br/>   SQL 并不是象 C、COBOL 和 Fortran 语言那样的完整的计算机语言。SQL 没有用于条件测试的 IF 语句,也没有用于程序分支的 Goto 语句以及循环语句 For 或 Do。确切的讲,SQL 是一种数据库子语言,SQL 语句可以被嵌入到另一种语言中,从而使其具有数据库存取功能。SQL 也非严格的结构式语言,它的句法更接近英语语句,因此易于理解,大多数 SQL 语句都是直述其意,读起来就象自然语言一样明了。SQL 还是一种交互式查询语言,允许用户直接查询存储数据,利用这一交互特性,用户可以在很短的时间内回答相当复杂的问题,而同样问题若让程序员编写相应的报表程序则可能要用几个星期甚至更长时间。<br/><br/>   在大部分 ASP 应用程序中我们都会接触到数据库,而我们在编写 ASP 应用程序时用来进行数据库操作的标准语法正是 SQL,因此 SQL 语法的重要性是不言而喻的。下面,我们就从最常用的 SQL 语句 SELECT 着手,一步一步地来学习 SQL。<br/><br/>   查询是 SQL 语言的核心,而用于表达 SQL 查询的 SELECT 语句则是功能最强也是最为复杂的 SQL 语句,它从数据库中检索数据,并将查询结果提供给用户。在本文中我们将建立一个名为 tianjiao 的简单数据库,该库中存放了一个叫 sales 的销售记录表,如下所示 : <br/><br/>姓名 性别 工资 销售目标 销售额 地区 <br/>书生 男 2500 8000 9000 上海 <br/>吴冠军 男 3000 10000 9999 北京 <br/>雷鸣 男 2000 8000 10000 四川 <br/>雪儿 女 2500 5000 6000 广州 <br/>顾一 男 2600 9000 9800 大连 <br/>阿卓 女 2000 4000 4000 天津 <br/>熠天 男 4000 20000 20000 全国 <br/><br/>   在该表中有六列即六个字段 : 姓名、性别、工资、销售目标、销售额、地区,首先我们用 Select 语句列出姓名、销售目标和销售额 : <br/><br/>   Select 姓名,销售目标,销售额 From sales <br/><br/>   结果如下 : <br/><br/>姓名 销售目标 销售额 <br/>书生 8000 9000 <br/>吴冠军 10000 9999 <br/>雷鸣 8000 10000 <br/>雪儿 5000 6000 <br/>顾一 9000 9800 <br/>阿卓 4000 4000 <br/>熠天 20000 20000 <br/><br/>   然后,我们再列出所有男性的姓名、销售目标和销售额 : <br/><br/>   Select 姓名,销售目标,销售额 From sales Where 性别 =" 男 " <br/><br/>   结果如下 : <br/><br/>姓名 销售目标 销售额 <br/>书生 8000 9000 <br/>吴冠军 10000 9999 <br/>雷鸣 8000 10000 <br/>顾一 9000 9800 <br/>熠天 20000 20000 <br/><br/>   接下来,我们做一个相对复杂的查询,列出销售额大于销售目标的所有男性的姓名、销售目标和销售额,并且按销售目标排序。 <br/>  Select 姓名,销售目标,销售额 <br/>  Form sales<br/>  Where 销售额 &gt; 销售目标 <br/>  And 性别 =" 男 "<br/>  Order By 销售目标 <br/><br/>   结果如下 : <br/><br/>姓名 销售目标 销售额 <br/>书生 8000 9000 <br/>雷鸣 8000 10000 <br/>顾一 9000 9800 <br/>熠天 20000 20000 <br/><br/>   大家可以看到,对于简单查询,SQL Select 语句和英文语法很相象,我们来分析一下 SELECT 语句的完整格式,它包括六个子句,其中 SELECT 和 FROM 子句是必须的,其它子句可以任选,每个子句的功能如下 :<br/><br/>   1、Select 子句列出所有要求 SELECT 语句检索的数据项。它放在 SELECT 语句开始处,指定此查询要检索的数据项。这些数据项通常用选择表表示,即一组用“,”隔开的选择项。按照从左到右的顺序,每个选择项产生的一个列的查询结果,一个选择项可能是以下项目:<br/><br/>   (1)、列名:标识 FROM 子句指定表中的列。如果列名作为选择项,则 SQL 直接从数据库表中每行取出该列的值,再将其放在查询结果的相应行中。 <br/>   (2)、常数:指定在查询结果的每行中都放上该值。 <br/><br/>   (3)、SQL 表达式:说明必须将要放入查询结果中的值按表达式的规定进行计算。 <br/><br/>   2、From 子句列出包含所要查询数据的表,它由关键字 FROM 后跟一组用逗号分开的表名组成。每个表明都代表一个包括该查询要检索数据的表。这些表称为此 SQL 语句的表源,因为查询结果都源于它们。 <br/>   3、Where 子句告诉 SQL 只查询某些行中的数据,这些行用搜索条件描述。 <br/><br/>   4、Group By 子句指定汇总查询,即不是对每行产生一个查询结果,而是将相似的行进行分组,再对每组产生一个汇总结果。 <br/><br/>   5、Having 子句告诉 SQL 只产生有 Group By 得到的某些组的结果,和 Where 子句一样,所需要的组也用一个搜索条件指定。 <br/><br/>   6、Order By 子句将查询结果按一列或多列中的数据排序。如果省略此子句,则查询结果将是无序的。 <br/><br/>   下面作者将提供一个简单但实用的运用 SQL 语句查询的 ASP 程序供大家参考。 <br/><br/>   为了使大家更清楚更直接地了解 SQL 语法在 ASP 中的应用,我们先将查询的所有核心过程写成一个名为 query2table 的 SUB,然后利用 ASP 的服务器端包容功能调用该 SUB。请将以下语句剪贴到记事簿,保存为 subdbtable.inc 文件,并置于虚拟目录 asptest 下 : <br/>  &lt; %<br/>  sub query2table(inputquery)<br/>  set conntemp=server.createobject("adodb.connection")<br/>  conntemp.open"DSN=Student;uid=student;pwd=aspmagic"<br/>  set rstemp=conntemp.execute(inputquery)<br/>  howmanyfields=rstemp.fields.count -1<br/>  ' 统计数据库中的列数 <br/>  %&gt;<br/>  &lt; table border=1&gt;&lt; tr&gt;<br/>  &lt; %<br/>  for i=0 to howmanyfields<br/>  %&gt;<br/>  &lt; td&gt;&lt; b&gt;&lt; %=rstemp(i).name%&gt;&lt; /B&gt;&lt; /TD&gt;<br/>  &lt; % next %&gt;<br/>  &lt; /tr&gt;<br/>  &lt; %<br/>  do while not rstemp.eof<br/>  %&gt;<br/>  &lt; tr&gt;<br/>  &lt; % for i = 0 to howmanyfields<br/>  thisvalue=rstemp(i)<br/>  If isnull(thisvalue) then<br/>  thisvalue="?<br/>  ' 如果字段为空,则将变量 thisvalue 的值定义为一个空格 <br/>  end if%&gt;<br/>  &lt; td valign=top&gt;&lt; %=thisvalue%&gt;&lt; /td&gt;<br/>  &lt; % next %&gt;<br/>  &lt; /tr&gt;<br/>  &lt; %rstemp.movenext<br/>  loop%&gt;<br/>  &lt; /table&gt;<br/>  &lt; %<br/>  rstemp.close<br/>  set rstemp=nothing<br/>  conntemp.close<br/>  set conntemp=nothingend sub%&gt;<br/><br/>   完成了 SUB 的定义过程,在下面几个 ASP 程序中我们只要加入想要使用的 SQL 查询语句,并调用该过程就可以非常方便的得到查询结果。将以下四段代码分别保存为 asp11a.asp、asp11b.asp、asp11c.asp、asp11d.asp 四个 .asp 文件。 <br/><br/>  &lt; HEAD&gt;&lt; TITLE&gt;asp11a.asp&lt; /TITLE&gt;&lt; /HEAD&gt;<br/>  &lt; HTML&gt;&lt; body bgcolor="#FFFFFF"&gt;<br/>  &lt; %<br/>  call query2table("select * from publishers where name like 'A%%'")<br/>' 将表 publishers 中所有姓名中有字母 A 的记录查询出来 <br/>  %&gt;<br/>  &lt; !--#include virtual="/asptest/subdbtable.inc"--&gt;&lt; /BODY&gt;&lt; /HTML&gt;<br/><br/><br/>  &lt; HEAD&gt;&lt; TITLE&gt;asp11b.asp&lt; /TITLE&gt;&lt; /HEAD&gt;&lt; HTML&gt;&lt; body bgcolor="#FFFFFF"&gt;<br/>  &lt; %<br/>  call query2table("select * from titles where Year_Published &gt; = 1998")<br/>' 将表 titles 中所有发表年份大于或等于 1998 年的记录查询出来 <br/>  %&gt;<br/>  &lt; !--#include virtual="/asptest/subdbtable.inc"--&gt;&lt; /BODY&gt;&lt; /HTML&gt;<br/><br/><br/>  &lt; HEAD&gt;&lt; TITLE&gt;asp11c.asp&lt; /TITLE&gt;&lt; /HEAD&gt;&lt; HTML&gt;&lt; body bgcolor="#FFFFFF"&gt;<br/>  &lt; %<br/>  call query2table("select * from publishers where amount&gt;10000 and sex='male'")<br/>' 将表 publishers 中所有数量大于 10000 且性别为男的记录查询出来 <br/>  %&gt;<br/>  &lt; !--#include virtual="/asptest/subdbtable.inc"--&gt;&lt; /BODY&gt;&lt; /HTML&gt;<br/><br/><br/>  &lt; HEAD&gt;&lt; TITLE&gt;asp11d.asp&lt; /TITLE&gt;&lt; /HEAD&gt;&lt; HTML&gt;&lt; body bgcolor="#FFFFFF"&gt;<br/>  &lt; %<br/>  call query2table("select * from publishers where state&lt; &gt; 'NY'")<br/>'将表 publishers 中所有所在城市不为纽约的记录查询出来。<br/>  %&gt;<br/>  &lt; !--#include virtual="/asptest/subdbtable.inc"--&gt;&lt; /BODY&gt;&lt; /HTML&gt;<br/><br/>   利用 subdbtable.inc 文件中的所定义的过程query2table,你就可以非常迅速地对数据库进行查询,你所要做的只是将“conntemp.open"DSN=Student;uid=student;pwd=aspmagic"”中的数据库名称、用户身份和密码稍加改动,并在调用 query2table 时输入想要使用的 SQL 查询语句即可。是不是很简单 ? 这就是 ASP 和 SQL 的魅力所在 !!! <br/><br/>   今天,我们虽然用了一整篇的篇幅只学习了一个 SQL 指令,但请你相信你所获得远不同于一个 DOS 指令,SELECT 指令使得你可以非常容易地对数据库进行查询,或许在这之前你对数据库查询还一无所知,但是通过本篇的学习,你其实已经会使用 ASP 进行常用的数据库查询了,是不是很激动 ? 在下一篇中,作者将继续给大家介绍 SQL 的其它几个基本指令。在结束本文之前,作者在这里要向很多来信的朋友致歉,由于最近作者工作繁忙,实在无暇一一回答各位的问题,请见谅,我会尽量将一些常见的、发生频率较高的问题在文章中写出来,至于一些不常见的问题,我建议大家到下面这个站点提问,你将会得到及时的答复。www.onlinechina.net/friend/flybird/bbs/wwwboard.asp?id=1, 这是作者至今为止所见的最棒的中文 ASP 学习站点,由上海的飞鸟主持,大家务必去看看。</p>

该用户从未签到

升级  30.8%

55
 楼主| 发表于 2006-2-24 09:22:11 | 只看该作者
&lt; %<br/>If Application("NumVisits")&lt; 999 then<br/>Application("NumVisits")=999<br/>End If<br/>Application.Lock<br/>Application("NumVisits")=Application("NumVisits")+1<br/>Application.Unlock<br/>%&gt;<br/>欢迎光临本网页,你是本页的第 &lt; %= Application("NumVisits") %&gt; 位访客 !<br/><br/>   这里的 999 就是你要设定的计数器初始值,如此一来问题就迎刃而解了。我非常感谢这位姓康的朋友给我指出了这个错误,虽然这只是一个很小的漏洞,但我们在共同学程序写程序的过程中非常需要这种严谨细致的作风,希望今后朋友们们一旦发现文中的错误即刻来信告知,我也能及时纠正,谢谢。<br/><br/>   SQL 语言可以分为两大部分:数据定义语言和数据操纵语言,继上一篇我们学习了数据操纵语言中的 Select 语句后,今天作者要继续给大家简要介绍其余的 SQL 语句。<br/><br/>   SQL 是一种完备的数据处理语言,不仅用于数据库查询,而且用于数据库中的数据修改和更新,与支持 SQL 查询的 Select 语句的复杂性相比较,更改数据库内容的 SQL 语句就格外简单。然而对于一个 DBMS 来说,数据更新所造成的风险大大超出了数据查询。数据库管理系统必须在更改期内保护所存储的数据的一致性,确保有效的数据进入数据库,数据库必须保持一致性, DBMS 还必须协调多用户的并行更新,以确保用户和他们的更改不至于影响其他用户的作业。 <br/>   用于修改数据库内容的 SQL 语句主要有以下三个: <br/><br/>   1、 Insert,向一个表中加入新的数据行 <br/><br/>   2、 Delete,从一个表中删除数据行 <br/><br/>   3、 Update,更改数据库中已经存在的数据 <br/><br/>   首先我们来看看 Insert 的用法: <br/><br/>   标准语法: <br/>   INSERT INTO table_name<br/>   (col1, col2...)<br/>   VALUES(value1, value2...)<br/><br/>   下例要将书生作为一个新的销售员加入表 Salesreps 中 <br/>   Insert Into<br/>   Salesreps (name,num,sales,hire_date,income) <br/>   values ('shusheng',9,10000,'23-Feb-99',2000)<br/><br/>   在此语句中,列的名称列在括号中以逗号隔开,接下去是 Value 短语和括号中同样以逗号隔开的每列数据,应该注意的是数据和列名称的顺序是相同的,而且若是字符串型则以单引号隔开。从概念上来讲, Insert 语句建立的一个与表列结构相一致的数据行,用取自 Values 子句的数据来填充它,然后将该新行加入表中,表中的行是不排序的,因此不存在将该行插入到表的头或尾或两行之间的这个概念。 Insert 语句结束后,新行就是表的一部分了。<br/><br/>   Insert 语句还可以将多行数据添加到目标表中去,在这种形式的 Insert 语句中,新行的数据值不是在语句正文中明确地指定的,而是语句中指定的一个数据库查询。添加的值来自数据库自身的行,这乍看起来似乎有些奇怪,但是在某些特定的状态下,这是非常有用的。比如,你想把 1998 年 12 月 30 日之前产生的订单编号、日期和数目从 order 表中拷贝到另一个名为 oldorder 的表中去,多行 Insert 语句为拷贝数据提供了一种紧凑而高效的方法,如下: <br/>   Insert into oldorder (Num,Date,Amount)<br/>   Select Num,Date,Amount<br/>   From order<br/>   Where Date&lt;'30-12-98'<br/><br/>   这条语句看起来有些复杂,其实很简单,语句标识了接收新行的表 oldorder 和接收数据的列,完全类似于单行 Insert 语句。语句的剩余部分是一个查询,它检索 order 表中的数据。 SQL 先执行对 order 表的查询,然后将查询结果逐行插入到 oldorder 表中去。<br/><br/>   下面我们来看看 Update 的用法, Update 语句用于更新单表中选定行的一列或多列的值。要更新的目标表在语句中定义, Set 子句则指定要更新哪些列并计算他们的值。 Update 语句总是包含 Where 语句,而且 Update 语句比较危险,所以您必须明确地认识到 Where 语句的重要性, Where 语句被用来指定需要更新的行。 <br/>   标准语法: <br/>   UPDATE table_name<br/>   SET columnname1 = value1<br/>   [, columname2 = value2]...<br/>   WHERE search_condition<br/><br/><br/>   以下是一个简单的 Update 语句的例子 : <br/>   Update customers<br/>   Setcredit=100000.00,id=99<br/>   Where name='asp'<br/><br/><br/>   在此例中我们将表 customers 中客户名为 asp 的客户的信贷值更新为 10 万并将他的 ID 变更为 99。再看下例: <br/>   Update customers<br/>   Setcredit=200000.00,state=021<br/>   Where ID in (80,90,100,120)<br/><br/><br/>   我们可以发现,其实 SQL 处理 Update 语句的过程就是逐行遍历所指定的表,更新其搜索条件结果为“真”的行,跳过其搜索条件结果为“假”或“空”的行。 <br/><br/>   最后,来看看 Delete 语句。 <br/><br/>   标准语法: <br/>   DELETE FROM tablename<br/>   WHERE condition<br/><br/><br/>   由于它过于简单,所以所造成的后果也是严重的,虽然其中的 Where 子句是任选的,但它几乎总是存在的,若将 Where 子句从 Delete 语句中省略掉,则目标表的所有行都将被删除。看下例: <br/>   Delete from order Where ID=99 <br/><br/>   在文章的末尾,作者在给大家简要介绍一下数据定义语言。它是用来创建和修改数据库结构的一种语句,包括 Create 和 Drop 语句。 <br/><br/>   1、 Create 语句 <br/><br/>   标准语法: <br/>   CREATE TABLE table_name<br/>   ( field1 datatype [ NOT NULL ],<br/>   field2 datatype [ NOT NULL ],<br/>   field3 datatype [ NOT NULL ]...)<br/><br/>   如: <br/>   CREATE TABLE BILLS <br/>   ( NAME CHAR(30),<br/>   AMOUNT NUMBER,<br/>   ACCOUNT_ID NUMBER)<br/><br/>   尽管 Create Table 比前面介绍的语句难理解一些,但仍然很直观。它将 bills 赋予一个新表,并指定表中三列的名称和数据类型。表被建立后我们就可以添入数据了。如: <br/><br/>   Insert into bills(name,amout,account_id) values('gates',100,1) <br/><br/>   如果,你觉得不再需要保存产品信息,则可用 Drop table 语句将该表及其所包含的所有数据从数据库中删除掉。 <br/><br/>   标准语法: <br/><br/>   DROP TABLE table_name <br/><br/>

该用户从未签到

升级  30.8%

56
 楼主| 发表于 2006-2-24 09:22:26 | 只看该作者
<strong>常见的80004005错误及其解决方法 </strong><p></p><strong><hr/></strong>在编写WEB应用程序的过程中,我们常常要跟数据库打交道,例如我们日常经常用的数据库ACCESS、SQL SERVER等。在连接这些数据库的时候,系统往往会给我们一些象这类“80004005”错误,这些五花八门的错误信息很另人头痛。为了方便网友解决这类问题,本文将详细的介绍和解答这类问题。 <p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC Microsoft Access 97 Driver] The Microsoft Jet database<br/>engine cannot open the file '(unknown)'. It is already opened exclusively<br/>by another user, or you need permission to view its data. <br/>[原因]<br/>这个错误发生在IIS使用匿名帐号(通常是IUSR)时,该帐号在NT中对数据库所在目录<br/>没有正确的权限.</p><p>[解决方法]<br/>1、检查文件和目录的权限. 保证Evryone能够在该目录中有新建和删除临时文件的权限。<br/>2、检查数据源文件(DSN)是否被别的程序标志在使用中,这些程序一般都是Visual InterDev,关闭任何一个正在InterDev中打开和数据库连接的项目。<br/>3、检查ACCESS中的某个表是否在这时已连在一个网络服务器上。<br/>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC Microsoft Access 97 Driver] Couldn't use '(unknown)'; file<br/>already in use. <br/>[原因]<br/>要连接ACCESS数据库这时正在被使用使数据库被锁定,导致无法访问。</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC Driver Manager] Data source name not found and no default<br/>driver specified. <br/>[原因]<br/>可能的原因是ConnectString在global.asa中初始化的Application连接字符串 ,而这时global.asa文件却没有正常工作。</p><p>[解决方法]</p><p>检查赋值时是否正确,在asp中加入下面的代码:<br/>&lt;%= "'auth_user' is " &amp; request.servervariables("auth_user")%&gt;<br/>&lt&gt;<br/>&lt;%= "'auth_type' is " &amp; request.servervariables("auth_type")%&gt;<br/>&lt&gt;<br/>&lt;%= "connection string is " &amp; session("your_connectionstring")%&gt;<br/>&lt&gt; <br/>还有一个原因就是在ConnectString中加入了空格,例如<br/>DSN = MyDSN; Database = Pubs; <br/>试试改成下面这个样子:<br/>DSN=MyDSN;Database=Pubs;<br/>如果是global.asa还没有被运行,检查该文件是否在运用程序的根目录中,或者是虚拟目录的根目录中。<br/>还有可能错误出现的原因是DSN名称没找着,这可以采用我提供的id=36767的办法解决。最后是检查是否安装了最新的驱动程序,既是否是最新的MDAC版本。</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC Driver Manager] Data source name not ?? <br/>[原因]<br/>这个错误有可能是出现在你的计算机上软件安装(或则反安装)的顺序上。如果ODBC的版本不一致的话,就会发生该错误。<br/>[解决方法]</p><p>办法是安装最新版本的MDAC。</p><p><br/>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC Access 97 ODBC driver Driver]General error Unable to open<br/>registry key 'DriverId'. <br/>[原因]<br/>这个错误发生在从注册表中读取数值的时候。 使用regedit32.exe检查注册表的权限。</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC SQL Server Driver][dbnmpntw]ConnectionOpen (CreateFile()).<br/>[原因]<br/>原因之一:当一个数据库中包含有分别在不用机器上的许可关系时,这也可能发生在同一台机器上,当给一个关系设置了UNC路径,而另一个关系却是本地路径。<br/>原因之二:当用户使用IIS匿名帐号登录后,对本地这台机器而言他是有权的,但是对于一个UNC路径的机器,另外这台机器是不会认为你当前匿名登录的帐号在它那上面也是合法的。这样它就不允许你访问它上面的资源,导致错误。</p><p>[解决方法]<br/>1、在IIS工具中,改变IIS匿名帐号成另外一个基于域的帐号。(也就是不使用匿名登录)<br/>2、或则在那台你要访问资源的机器上也创建一个和当前匿名帐号同样的帐号,使用同样的密码。</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005' Microsoft][ODBC<br/>Microsoft SQL Driver] Logon Failed() <br/>[原因]<br/>该错误是由SQL Server产生的,当它不接受或则不能够认识这个登录帐号的时候,或者没有使用管理员身份登录,<br/>也可能是在NT中没有SQL影射帐号造成的。<br/>[解决方法]<br/>用系统管理员帐号(SA)登录,一般密码应该为空.注意,这时必须使用CoonectString而不能够使用DSN文件。因为DSN中没有保存用户名和密码。检查NT是否给SQL映射了帐号。</p><p><br/>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC SQL Server Driver][SQL Server] Login failed- User: Reason:<br/>Not defined as a valid user of a trusted SQL Server connection. <br/>[原因]<br/>该错误是由SQL Server产生的,当它不接受或则不能够认识这个登录帐号的时候,或者没有使用管理员身份登录,<br/>也可能是在NT中没有SQL影射帐号造成的。<br/>[解决方法]</p><p>在SQL Server的Enterprise Manager中,选择Server/SQL Server/Configure[ASCII<br/>133]/Security Options/Standard。如果是运行在IIS4中,取消选择该项目的Password Synchronization选项。</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC Microsoft Access 97 Driver] Couldn't lock file. <br/>[原因]<br/>也许是没有正确的权限生成Access数据库的锁定文件(.ldb)<br/>默认时,该文件和你的数据库是同一个目录的。<br/>给匿名帐号全权访问数据库共享目录的权限。<br/>有时是因为文件是因为共享时有意使用了只读的权限限制。</p><p>[解决方法]<br/>Set Conn = Server.CreateObject("ADODB.Connection")<br/>Conn.Mode = adModeShareDenyWrite '8</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC Microsoft Access 97 Driver] '(unknown)' isn't a valid<br/>path. Make sure that the path name is spelled correctly and that you are<br/>connected to the server on which the file resides. <br/>[原因]<br/>路径非法。最可能发生在当Global.asa和CoonecntString被使用到另外一台机器上的时候。</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC SQL Server Driver][SQL Server] The query and the views in<br/>it exceed the limit of 16 tables. </p><p>[原因]<br/>对查询有限制。</p><p>[错误信息]<br/>Microsoft OLE DB Provider for ODBC Drivers error '80004005'<br/>[Microsoft][ODBC SQL Server Driver][DBMSSOCN] General network error. Check<br/>your network document <br/>[原因]<br/>装有SQL Server的机器被改名,但数据库名(DSN)还使用了原来的机器名。</p><p>[解决方法]</p><p>重新设置DSN。<br/></p>

该用户从未签到

升级  30.8%

57
 楼主| 发表于 2006-2-24 09:22:50 | 只看该作者
<p><strong>asp的19个基本技巧 </strong></p><hr/><p>1. 现在的日期时间命令是<br/>&lt;%=now%&gt; 即可</p><p>2.ASP取得表格(from)数据输入的方法,是使用一个内置的对象(object)—Requect,<br/>它以get,post而异。</p><p>3.若要自己用VB或其它语言编写,.dll文件供ASP使用需将DLL文件注册方可:DOS下<br/>输入 regsbr32 *.dll</p><p>4.显示五个重复的句子,字体越来越大<br/>&lt;% for i=1 to 5 %&gt;<br/>&lt;font size=&lt;% =i %&gt; color=#00ffff&gt;<br/>快速ASP<br/>&lt;/font&gt;<br/>&lt;br&gt;<br/>&lt;% next %&gt;</p><p>5.传送字符串到用户端<br/>response.write string<br/>如:&lt;% response.write "Welcome" %&gt;</p><p>6.链接到指定的URL地址<br/>response.redirect url<br/>如:<br/>&lt;% response.redirect "homepage.asp"<br/>%&gt;</p><p>*但是如果此.ASP的文件内容已经传送到用户断,则再用redirect时会发生错误。</p><p>7.其他语言与ASP的结合:<br/>如:早上显示早安,下午显示你好<br/>&lt;%<br/>if time&gt;+#12:00:00 AM# and time&lt;#12:00:00 PM #<br/>then<br/>greeting="早安!"<br/>else<br/>greeting="你好!"<br/>end if<br/>%&gt;<br/>&lt;%=greeting %&gt;</p><p>8.&lt;script&gt;标记在ASP中的应用<br/>例:</p><p>&lt;html&gt;<br/>&lt;body&gt;<br/>&lt;% call function1 %&gt;<br/>&lt;/body&gt;<br/>&lt;/html&gt;<br/>&lt;script runat=server language=javascript&gt;<br/>function function1()<br/>{<br/>...<br/>}<br/>&lt;/script&gt;</p><p>9.#include 包括其它文件<br/>&lt;!--#include virtual|file="filename"--&gt;<br/>virtual指虚拟的文件地址。<br/>file 代表绝对的文件地址。<br/>如:<br/>&lt;!--#include virtual="/booksamp/test.asp"--&gt;<br/>&lt;!--#include file="/test/test.asp"--&gt;</p><p>而且可以层层嵌套。另外#include 不能在&lt;%--%&gt;之内</p><p>10.ASP取得表格输入数据的方法<br/>:GET POST<br/>一.get:用户端将数据加到URL后,格式为”?字段1=输入数据1&amp;字段2=输入数据2&amp;...",<br/>再将其送到服务器。<br/>如: action为www.abc.com, 字段Name输入数据为jack,字段age的数据为15,则用get方法为<br/>http://www.abc.com?Name=jack&amp;Age=15</p><p>二.post:用户端用http信息数据传送到服务器<br/>ASP中:<br/>get:使用“输入数据= Request.QueryString("字段名")",将附加于URL的数据取出。<br/>post:使用“输入数据=Request.Forml"(字段名")",读取HTTP信息数据字段。<br/>* Request.QueryString范例<br/>如:〈A hery="aspform.asp?Name=jack&amp;Age=15"&gt;<br/>按此〈/A〉〈p〉<br/>Name:&lt;%=request.QueryString("Name")%)<br/>Age:&lt;%=request.QeueryString("Age")%)<br/>* get 范例<br/>·aspturm.asp:<br/>&lt;form action="asp1b.asp" method="get"&gt;<br/>姓名: &lt;input type=text name="input1" value="Your name"&gt;<br/>&lt;p&gt;<br/>特征: &lt;select name="input2"&gt;<br/>&lt;option&gt;cool!<br/>&lt;option&gt;handsome<br/>&lt;option&gt;warmhearted<br/>&lt;/select&gt;<br/>&lt;input type=submit value="ok"&gt;<br/>&lt;/form&gt;<br/>asp1b.asp的内容<br/>&lt;html&gt;&lt;body&gt;<br/>&lt;% =request.querystring("input1") %&gt; hi, your character is<br/>&lt;%= request.querystring("input2") %&gt;<br/>&lt;/body&gt;&lt;/html&gt;<br/>11.request.From<br/>语法: request.From(name)[(index)|.count]<br/>name:字段名<br/>index:当同一字段输入多个值时,指针值index指定要读取同一字段的那一个值,范围由1到<br/>request.From(name).count<br/>count:由request.From(name).count可知name字段输入几个值,若无此name字段,count为0</p><p><br/>如下例:<br/>&lt;%<br/>forI=1 to request.fron("input1").count<br/>response.write request.From("input1")(I)&amp;"&lt;br&gt;"<br/>next<br/>%&gt;<br/>若input1有两个值则都显示出<br/>*若未采用index指定读取哪个.可用<br/>〈%<br/>for each item request.From("input"))<br/>repomse.write item &amp;"&lt;br&gt;"<br/>next<br/>%&gt;<br/>也可用" for each x in tewuest.From"重复取得所有字段的输入值。</p><p>&lt;% for each x in request.Form %&gt;<br/>request.From (&lt;%=x%)=&lt;%=request.Form<br/>(x)%&gt; &lt;br&gt;<br/>&lt;% next %&gt;</p><p><br/>12.<br/>获取客户端TCP/IP端口的方法:<br/>如: tcp/ip port is &lt;%=request("server_port")%&gt;<br/>使用server_port可以得到接收HTTP request的连接port信息</p><p><br/>13.<br/>通过HTTP_ACCEPT_LANGUAGE的HTTP表头信息,可以得到用户端的使用语言<br/>环境.<br/>以下例子判断用户端的语言环境,给出不同的页面.<br/>&lt;% language=request.servervariables("HTTP_ACCEPT_LANGUAGE")<br/>if language="en" then %&gt;<br/>&lt;!--#include file="english.asp"&gt;<br/>&lt;% else %&gt;<br/>&lt;!--#include file="china.asp"&gt;<br/>&lt;% end if%&gt;</p><p>14.主页保留的期限<br/>如果用户端浏览器在一个主页保留的期限内,再度浏览此主页,则原在用<br/>户端硬盘上的主页内容将被显示.<br/>response.expires[=number]<br/>其中NUMBER为记录数据盒(PAGE BOX)的保留期限,单位是分钟.<br/>或:<br/>response.expiresabsolute[=[date][time]]<br/>如:设定一个主页保留期到某个日子.</p>

该用户从未签到

升级  30.8%

58
 楼主| 发表于 2006-2-24 09:23:04 | 只看该作者
<p>15.连接到指定的URL地址<br/>如:你希望确认用户已经看过INDEX.HTM,则可以检查是否已经看过,如<br/>尚未确认,则自动连接到首页<br/>&lt;%<br/>if not session("BEEN_to_home_page") then<br/>response.redirect "index.asp"<br/>end if<br/>%&gt;</p><p>16.判断是回到本页还是第一次进入<br/>&lt;%<br/>if user_has_been_here_before then<br/>response.write "&lt;h3 align=center&gt; Welcome Back<br/>again"<br/>else<br/>response.write "Welcome!"<br/>end if<br/>%&gt;</p><p><br/>17.显示数据库中的图片与超级连接</p><p>&lt;%<br/>set conn=server.creatobject("ADODB.connection")<br/>conn.open "myaddress"<br/>set rs=conn.execute("select name,tel,url,image from<br/>myaddress")<br/>%&gt;</p><p>&lt;p&gt;<br/>&lt;tabel&gt;<br/>&lt;tr&gt;<br/>&lt;% for i=0 to rs.fields.count-1 %&gt;<br/>&lt;td&gt;<br/>&lt;b&gt;<br/>&lt;%=rs(i).name %&gt;<br/>&lt;/b&gt;<br/>&lt;/td&gt;<br/>&lt;% next %&gt;<br/>&lt;/tr&gt;<br/>&lt;% do while not rs.eof %&gt;<br/>&lt;tr&gt;<br/>&lt;% for i=0 to rs.fields.count-1 %&gt;<br/>&lt;td valign =top&gt;<br/>&lt;%<br/>if rs(i).name="image" then<br/>response.write "&lt;img src="""&amp;rs(i)&amp;""" &gt;"<br/>else<br/>if rs(i).name="url" then<br/>response.write "&lt;a href="""&amp;rs(i)&amp;"""&gt;"&amp;rs(i)&amp;"&lt;/a&gt;"<br/>else<br/>response.write rs(i)<br/>end if<br/>end if<br/>%&gt;<br/>&lt;/td&gt;<br/>&lt;%next%&gt;<br/>&lt;/tr&gt;<br/>&lt;% rs.movenext<br/>loop<br/>rs.close<br/>conn.close<br/>%&gt;<br/>&lt;/html&gt;</p><p></p><p>18. 用ASP取得浏览器信息<br/>&lt;%<br/>set a=server.creatobject("MSWC.BROWSERTYPE")<br/>msg="您使用的浏览器是:"+a.browser+"version"+a.version<br/>%&gt;<br/>&lt;%=msg%&gt;</p><p><br/>19. asp访问cookies的方式(使用response和request)<br/>如下:<br/>写入cookies:<br/>response.cookies("待写入的coookies名称")<br/>="待写入数据“<br/>读取cookies:<br/>读取数据=request.cookies("待读的cookies名称")</p><p>* 写入时注意<br/>@ 写入cookies的response.cookies程序段必须放在&lt;html&gt;标记<br/>之前。而且不可以有任何的其他html代码<br/>@ COOKIES中必须使用expires设定有效期, COOKIES才能真正的<br/>写入客户端硬盘中。如:<br/>response.cookies("待写入的名称“).expires=#july 1,1998#<br/>或response.cookies("名称").expires=DATE+365</p><p></p><p>&nbsp; </p>

该用户从未签到

升级  30.8%

59
 楼主| 发表于 2006-2-24 09:23:28 | 只看该作者
<strong>统计当前在线用户的解决方案</strong><p></p><strong><hr/></strong><p>在做一个在线交流的网站时,有个问题很令我头疼,就是关于实时统计在线用户的问题,客户要求:统计当前在线人数、游客人数、会员人数、在线用户列表,包括游客、会员和管理员(如果是游客,则自动生成游客的ID,如果是会员,则显示会员姓名)。因为它要求有实时性,则首先我将用global.asa解决的想法pass掉。</p><p>问题的关键是如何判断用户已经离开,和当用户离开时如何执行一个文件或一个函数。</p><p>经过和网上一些朋友的探讨,终于解决了这个问题。</p><p>解决的原理为:编写一个通用页面,所谓的通用页面,就是应用里的每个页面都包含这个页面,例如:header.asp,在这个页面里,用XMLHTTP写一段代码,这段代码的作用是每隔10秒或20秒就向服务器发送一个请求,目的是更新当前用户的在线时间并删除在线时间超过一定时间的用户,使数据库中的在线用户记录保持一定的实时性。</p><p>主要实现方法为:</p><p>新建一数据库,字段名称分别为:id(字符),name(字符),user(数字)tt(日期),admin(权限代码,0-普通用户,1-管理员)</p><p>表名:online</p><p>header.asp ↓</p><p>============================================================</p><p>&lt;%</p><p>... ...</p><p>if session("s_in")&lt;&gt;1 and session("s_name")="" then '如果用户是第一次登陆</p><p>rs.open "select * from online",conn,3,3<br/>rs.addnew<br/>rs("id")=session.sessionID<br/>rs("name")="游客" &amp; session.sessionID<br/>rs("user")=0 '0表示用户未登陆,是游客身份<br/>rs("tt")=now<br/>rs.update<br/>rs.close<br/>session("s_in")=1 '设置用户的资料已经存入数据库,表示已经在线<br/>end if</p><p>if session("s_name")&lt;&gt;"" then '如果用户已经通过登录框登录<br/>rs.open "select * from online where id='" &amp; session.sessionID &amp; "'",conn,3,3<br/>rs("name")=session("s_name")<br/>rs("admin")=session("s_admin") '将用户的姓名更新为会员名称<br/>rs("user")=1 '表示用户已经登陆,是会员身份<br/>rs("tt")=now '将当前系统时间设置为用户的登陆时间<br/>rs.update<br/>rs.close<br/>end if</p><p>... ...</p><p>%&gt;</p><p>... ...</p><p>&lt;head&gt;</p><p>... ...</p><p>&lt;script language=javascript&gt;<br/>function Test()<br/>{<br/>var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");<br/>xmlhttp.open("OST","onceonline.asp",false); // 向onceonline.asp发送更新请求<br/>xmlhttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");<br/>xmlhttp.send();<br/>}<br/>setInterval("Test();",10); // 10秒钟发送一次更新请求<br/>&lt;/script&gt;</p><p>... ...</p><p>&lt;/head&gt;</p><p>... ...</p><p>==========================================================</p><p>onceonline.asp</p><p>&lt;%<br/>rs.open "select tt from online where id='" &amp; session.sessionID &amp; "'",conn,3,3<br/>rs("tt")=now() '更新当前在线用户的在线时间<br/>rs.update<br/>rs.close</p><p>rs.open "delete from online where datediff('s',tt,now())&gt;60",conn,3,1 '删除超时用户<br/>%&gt;</p><p>==============================================================</p><p>这样,基本保证了数据库中用户列表的实时性,误差取决于更新时间和删除时间的差值大小和服务器的处理速度,建议不要将删除超时用户的时间间隔取的过于小,那样有可能会导致在线用户0人的失误。</p>

该用户从未签到

升级  30.8%

60
 楼主| 发表于 2006-2-24 09:23:49 | 只看该作者
<p><strong>一个很简单的验证码程序</strong></p><hr/><p>主程序共三个 </p><p>我的调用方式 &lt;script language="javascript" src="/verify/num.asp"&gt;&lt;/script&gt; <br/>验证方式 if trim(Loginnum)&lt;&gt;trim(session("Loginnum")) then <br/>Response.Write Error("验证码错误!") <br/>Response.End <br/>end if </p><p><br/>num.asp </p><p>&lt;% <br/>'### To encrypt/decrypt include this code in your page <br/>'### strMyEncryptedString = EncryptString(strString) <br/>'### strMyDecryptedString = DeCryptString(strMyEncryptedString) <br/>'### You are free to use this code as long as credits remain in place <br/>'### also if you improve this code let me know. </p><p>rivate Function EncryptString(strString) <br/>'#################################################################### <br/>'### Crypt Function ? 2001 by Slavic Kozyuk grindkore@yahoo.com ### <br/>'### Arguments: strString &lt;--- String you wish to encrypt ### <br/>'### Output: Encrypted HEX string ### <br/>'#################################################################### </p><p>Dim CharHexSet, intStringLen, strTemp, strRAW, I, intKey, intOffSet <br/>Randomize Timer </p><p>intKey = Round((RND * 1000000) + 1000000) '##### Key Bitsize <br/>intOffSet = Round((RND * 1000000) + 1000000) '##### KeyOffSet Bitsize </p><p>If IsNull(strString) = False Then <br/>strRAW = strString <br/>intStringLen = Len(strRAW) </p><p>For i = 0 to intStringLen - 1 <br/>strTemp = Left(strRAW, 1) <br/>strRAW = Right(strRAW, Len(strRAW) - 1) <br/>CharHexSet = CharHexSet &amp; Hex(Asc(strTemp) * intKey)&amp; Hex(intKey) <br/>Next </p><p>EncryptString = CharHexSet &amp; "|" &amp; Hex(intOffSet + intKey) &amp; "|" &amp; Hex(intOffSet) <br/>Else <br/>EncryptString = "" <br/>End If <br/>End Function </p><p></p><p><br/>rivate Function DeCryptString(strCryptString) <br/>'#################################################################### <br/>'### Crypt Function ? 2001 by Slavic Kozyuk grindkore@yahoo.com ### <br/>'### Arguments: Encrypted HEX stringt ### <br/>'### Output: Decrypted ASCII string ### <br/>'#################################################################### <br/>'### Note this function uses HexConv() and get_hxno() functions ### <br/>'### so make sure they are not removed ### <br/>'#################################################################### </p><p>Dim strRAW, arHexCharSet, I, intKey, intOffSet, strRawKey, strHexCrypData </p><p><br/>strRawKey = Right(strCryptString, Len(strCryptString) - InStr(strCryptString, "|")) <br/>intOffSet = Right(strRawKey, Len(strRawKey) - InStr(strRawKey,"|")) <br/>intKey = HexConv(Left(strRawKey, InStr(strRawKey, "|") - 1)) - HexConv(intOffSet) <br/>strHexCrypData = Left(strCryptString, Len(strCryptString) - (Len(strRawKey) + 1)) </p><p><br/>arHexCharSet = Split(strHexCrypData, Hex(intKey)) </p><p>For i=0 to Ubound(arHexCharSet) <br/>strRAW = strRAW &amp; Chr(HexConv(arHexCharSet(i))/intKey) <br/>Next </p><p>DeCryptString = strRAW <br/>End Function </p><p></p><p>rivate Function HexConv(hexVar) <br/>Dim hxx, hxx_var, multiply <br/>IF hexVar &lt;&gt; "" THEN <br/>hexVar = UCASE(hexVar) <br/>hexVar = StrReverse(hexVar) <br/>DIM hx() <br/>REDIM hx(LEN(hexVar)) <br/>hxx = 0 <br/>hxx_var = 0 <br/>FOR hxx = 1 TO LEN(hexVar) <br/>IF multiply = "" THEN multiply = 1 <br/>hx(hxx) = mid(hexVar,hxx,1) <br/>hxx_var = (get_hxno(hx(hxx)) * multiply) + hxx_var <br/>multiply = (multiply * 16) <br/>NEXT <br/>hexVar = hxx_var <br/>HexConv = hexVar <br/>END IF <br/>End Function </p><p>rivate Function get_hxno(ghx) <br/>If ghx = "A" Then <br/>ghx = 10 <br/>ElseIf ghx = "B" Then <br/>ghx = 11 <br/>ElseIf ghx = "C" Then <br/>ghx = 12 <br/>ElseIf ghx = "D" Then <br/>ghx = 13 <br/>ElseIf ghx = "E" Then <br/>ghx = 14 <br/>ElseIf ghx = "F" Then <br/>ghx = 15 <br/>End If <br/>get_hxno = ghx <br/>End Function </p><p>randomize <br/>num = int(7999*rnd+2000) '计数器的值 <br/>num2 = EncryptString(num) <br/>session("Loginnum")=num <br/>%&gt; <br/>document.write("&lt;img src='/verify/count.asp?sksid=&lt;%=num2%&gt;'&gt;") ' 这里是调用图片的路径 </p><p>count.asp </p><p><br/>&lt;!--#include file="numimg.asp"--&gt; </p><p>&lt;% <br/>'### To encrypt/decrypt include this code in your page <br/>'### strMyEncryptedString = EncryptString(strString) <br/>'### strMyDecryptedString = DeCryptString(strMyEncryptedString) <br/>'### You are free to use this code as long as credits remain in place <br/>'### also if you improve this code let me know. </p><p>rivate Function EncryptString(strString) <br/>'#################################################################### <br/>'### Crypt Function ? 2001 by Slavic Kozyuk grindkore@yahoo.com ### <br/>'### Arguments: strString &lt;--- String you wish to encrypt ### <br/>'### Output: Encrypted HEX string ### <br/>'#################################################################### </p><p>Dim CharHexSet, intStringLen, strTemp, strRAW, I, intKey, intOffSet <br/>Randomize Timer </p><p>intKey = Round((RND * 1000000) + 1000000) '##### Key Bitsize <br/>intOffSet = Round((RND * 1000000) + 1000000) '##### KeyOffSet Bitsize </p><p>If IsNull(strString) = False Then <br/>strRAW = strString <br/>intStringLen = Len(strRAW) </p><p>For i = 0 to intStringLen - 1 <br/>strTemp = Left(strRAW, 1) <br/>strRAW = Right(strRAW, Len(strRAW) - 1) <br/>CharHexSet = CharHexSet &amp; Hex(Asc(strTemp) * intKey)&amp; Hex(intKey) <br/>Next </p><p>EncryptString = CharHexSet &amp; "|" &amp; Hex(intOffSet + intKey) &amp; "|" &amp; Hex(intOffSet) <br/>Else <br/>EncryptString = "" <br/>End If <br/>End Function </p><p></p><p><br/>rivate Function DeCryptString(strCryptString) <br/>'#################################################################### <br/>'### Crypt Function ? 2001 by Slavic Kozyuk grindkore@yahoo.com ### <br/>'### Arguments: Encrypted HEX stringt ### <br/>'### Output: Decrypted ASCII string ### <br/>'#################################################################### <br/>'### Note this function uses HexConv() and get_hxno() functions ### <br/>'### so make sure they are not removed ### <br/>'#################################################################### </p><p>Dim strRAW, arHexCharSet, I, intKey, intOffSet, strRawKey, strHexCrypData </p><p><br/>strRawKey = Right(strCryptString, Len(strCryptString) - InStr(strCryptString, "|")) <br/>intOffSet = Right(strRawKey, Len(strRawKey) - InStr(strRawKey,"|")) <br/>intKey = HexConv(Left(strRawKey, InStr(strRawKey, "|") - 1)) - HexConv(intOffSet) <br/>strHexCrypData = Left(strCryptString, Len(strCryptString) - (Len(strRawKey) + 1)) </p><p><br/>arHexCharSet = Split(strHexCrypData, Hex(intKey)) </p><p>For i=0 to Ubound(arHexCharSet) <br/>strRAW = strRAW &amp; Chr(HexConv(arHexCharSet(i))/intKey) <br/>Next </p><p>DeCryptString = strRAW <br/>End Function </p><p></p><p>rivate Function HexConv(hexVar) <br/>Dim hxx, hxx_var, multiply <br/>IF hexVar &lt;&gt; "" THEN <br/>hexVar = UCASE(hexVar) <br/>hexVar = StrReverse(hexVar) <br/>DIM hx() <br/>REDIM hx(LEN(hexVar)) <br/>hxx = 0 <br/>hxx_var = 0 <br/>FOR hxx = 1 TO LEN(hexVar) <br/>IF multiply = "" THEN multiply = 1 <br/>hx(hxx) = mid(hexVar,hxx,1) <br/>hxx_var = (get_hxno(hx(hxx)) * multiply) + hxx_var <br/>multiply = (multiply * 16) <br/>NEXT <br/>hexVar = hxx_var <br/>HexConv = hexVar <br/>END IF <br/>End Function </p><p>rivate Function get_hxno(ghx) <br/>If ghx = "A" Then <br/>ghx = 10 <br/>ElseIf ghx = "B" Then <br/>ghx = 11 <br/>ElseIf ghx = "C" Then <br/>ghx = 12 <br/>ElseIf ghx = "D" Then <br/>ghx = 13 <br/>ElseIf ghx = "E" Then <br/>ghx = 14 <br/>ElseIf ghx = "F" Then <br/>ghx = 15 <br/>End If <br/>get_hxno = ghx <br/>End Function </p><p><br/>%&gt; </p>
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

小黑屋|手机版|Archiver|信息系统项目管理师_软考交流平台. ( 鄂ICP备11002878号-1  公安备案号:42011102001150

GMT+8, 2025-7-5 23:05

Software by Discuz! X3.2

© 2001-2013 SKIN BY DSVUE

快速回复 返回顶部 返回列表