信息系统项目管理师_2024年软考学习应考交流_信息系统项目管理师考试
标题:
[转帖]ASP编程常用的代码
[打印本页]
作者:
翔羽
时间:
2006-2-22 14:06
标题:
[转帖]ASP编程常用的代码
<p><font color="#006699">1. ASP与Access数据库连接: </font></p><p><% <br/>dim conn,mdbfile <br/>mdbfile=server.mappath("数据库名称.mdb") <br/>set conn=server.createobject("adodb.connection") <br/>conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile <br/>%> </p><p><br/><font color="#006699">2. ASP与SQL数据库连接: </font></p><p><% <br/>dim conn <br/>set conn=server.createobject("ADODB.connection") <br/>con.open "
ROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa
WD=数据库密码;DATABASE=数据库名称 <br/>%> </p>
作者:
翔羽
时间:
2006-2-22 14:06
<p>建立记录集对象: </p><p>set rs=server.createobject("adodb.recordset") <br/>rs.open SQL语句,conn,3,2 </p><p></p><p><font color="#006699">3. SQL常用命令使用方法: </font></p><p>(1) 数据记录筛选: </p><p>sql="select * from 数据表 where 字段名=字段值 order by 字段名 " <br/>sql="select * from 数据表 where 字段名 like ‘%字段值%‘ order by 字段名 " <br/>sql="select top 10 * from 数据表 where 字段名 order by 字段名 " <br/>sql="select * from 数据表 where 字段名 in (‘值1‘,‘值2‘,‘值3‘)" <br/>sql="select * from 数据表 where 字段名 between 值1 and 值2" </p><p>(2) 更新数据记录: </p><p>sql="update 数据表 set 字段名=字段值 where 条件表达式" <br/>sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" </p><p>(3) 删除数据记录: </p><p>sql="delete from 数据表 where 条件表达式" <br/>sql="delete from 数据表" (将数据表所有记录删除) </p><p>(4) 添加数据记录: </p><p>sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)" <br/>sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) </p><p>(5) 数据记录统计函数: </p><p>AVG(字段名) 得出一个表格栏平均值 <br/>COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 <br/>MAX(字段名) 取得一个表格栏最大的值 <br/>MIN(字段名) 取得一个表格栏最小的值 <br/>SUM(字段名) 把数据栏的值相加 </p><p>引用以上函数的方法: </p><p>sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" <br/>set rs=conn.excute(sql) </p><p>用 rs("别名") 获取统的计值,其它函数运用同上。</p>
作者:
翔羽
时间:
2006-2-22 14:06
<p>(5) 数据表的建立和删除: </p><p>CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) </p><p>例:CREATE TABLE tab01(name varchar(50),datetime default now()) </p><p>DROP TABLE 数据表名称 (永久性删除一个数据表) </p><p></p>(6) 记录集对象的方法: <p>rs.movenext 将记录指针从当前的位置向下移一行 <br/>rs.moveprevious 将记录指针从当前的位置向上移一行 <br/>rs.movefirst 将记录指针移到数据表第一行 <br/>rs.movelast 将记录指针移到数据表最后一行 <br/>rs.absoluteposition=N 将记录指针移到数据表第N行 <br/>rs.absolutepage=N 将记录指针移到第N页的第一行 <br/>rs.pagesize=N 设置每页为N条记录 <br/>rs.pagecount 根据 pagesize 的设置返回总页数 <br/>rs.recordcount 返回记录总数 <br/>rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否 <br/>rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否 <br/>rs.delete 删除当前记录,但记录指针不会向下移动 <br/>rs.addnew 添加记录到数据表末端 <br/>rs.update 更新数据表记录 </p><p><br/>判断所填数据是数字型</p><p>if not isNumeric(request("字段名称")) then <br/>response.write "不是数字" <br/>else <br/>response.write "数字" <br/>end if</p>
作者:
翔羽
时间:
2006-2-22 14:08
<strong><p>1.Access数据库的DSN-less连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adoconn.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ="& _<br/>Server.MapPath("数据库所在路径")</p><p>2.Access OLE DB连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"
rovider=Microsoft.Jet.OLEDB.4.0;"& _<br/>"Data Source=" & Server.MapPath("数据库所在路径")</p><p>3.SQL server连接方法:</p><p>set adocon=server.createobject("adodb.recordset")<br/>adocon.Open"Driver={SQL Server};Server=(Local);UID=***
WD=***;"& _<br/>"database=数据库名;"</p><p>4.SQL server OLE DB连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"provider=SQLOLEDB.1;Data Source=RITANT4;"& _<br/>"user ID=***
assword=***;"& _<br/>"inital Catalog=数据库名"</p><p>5.Oracle 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"</p><p>6.Oracle OLE DB 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"
rovider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"</p><p>7.dBase 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"</p><p>8.mySQL 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"</p><p>9.Visual Foxpro 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"</p><p>10.MS text 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;"&_<br/>"extensions=asc,csv,tab,txt
ersist SecurityInfo=false;"</p><p>11.MS text OLE DB 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"
rovider=microsof.jet.oledb.4.0;data source=your_path;"&_<br/>"Extended Properties'text;FMT=Delimited'"</p></strong>
作者:
翔羽
时间:
2006-2-22 14:09
常用的四种SQL命令:<p>1.查询数据记录(Select)<br/>语法:Select 字段串行 From table Where 字段=内容<br/>例子:想从book表中找出作者为"cancer"的所有记录,SQL语句便如下:<br/>select * from book where author=’cancer’<br/>"*"是取出book表所有的字段,如查询的字段值为数字,则其后的"内容"便无须加上单引号,</p><p>如是日期,则在Access中用(#)包括,而在SQL server中则用(’)包括,<br/>如:</p><p>select * from book where id=1<br/>select * from book where pub_date=#2002-1-7# (Access)<br/>select * from book where pub_date=’2002-1-7’ (SQL Server)</p><p>提示:<br/>日期函数to_date不是标准sql文,不是所有的数据库适用,所以大家在使用的时候要参考数据库具体语法</p><p>另外如果是查询传入的变量,则如下:</p><p>strau=request.form("author")<br/>strsql="select * from book where author=’"&strau&"’"</p><p>如果查询的是数字,则:</p><p>intID=request.form("id")<br/>strsql="select * from book where id="&intID</p><p>在很多数据库中,如:oracle,上面的语句是可以写成:<br/>strsql="select * from book where id='"&intID&"'"的。<br/>但是字符型一定不能按照数字格式写,需要注意。</p><p>2.添加记录(Insert)<br/>语法:Insert into table(field1,field2,....) Values (value1,value2,....)<br/>例子:添加一作者是"cancer"的记录入book表:<br/>insert into book (bookno,author,bookname) values (’CF001’,’cancer’,’Cancer无组件上传程序’)<br/>同样,如果用到变量就如下:</p><p>strno=request.form("bookno")<br/>strau=request.form("author")<br/>strname=request.form("bookname")<br/>strsql="insert into book (bookno,author,bookname) values (’"&strno&"’,’"&strau&"’,’"&strname&"’)"</p><p>3.用Recordset对象的Addnew插入数据的方法:<br/>语法:</p><p>rs.addnew<br/>rs("field1").value=value1<br/>rs("field2").value=value2<br/>...<br/>rs.update</p><p>4.修改数据记录(Update)<br/>语法:update table set field1=value1,field2=value2,...where fieldx=valuex<br/>例子:update book set author=’babycrazy’ where bookno=’CF001’<br/>如果用到变量就如下:</p><p>strno=request.form("bookno")<br/>strau=request.form("author")<br/>strsql="update book set author=’"&strau&"’ where bookno=’"&strno"’"</p><p>5.Recordset对象的Update方法:<br/>语法:</p><p>rs("field1").value=value1<br/>rs("field2").value=value2<br/>...<br/>rs.update</p><p>注意:使用语法3和语法5的时候,一定要注意字段的类型(尤其是日期型)一致,否则出错的几率非常的高。</p><p><br/></p>
作者:
翔羽
时间:
2006-2-22 14:09
例子:<p>strno=request.form("bookno")<br/>strau=request.form("author")<br/>set adocon=server.createobject("adodb.connection")<br/>adocon.open "Driver={Microsoft Access Driver(*.mdb)};DBQ=" & _<br/>Server.Mappath=("/cancer/cancer.mdb")<br/>strsql="select * from book where bookno=’"&strno&"’"<br/>set rs=server.createobject("adodb.recordset")<br/>rs.open strsql,adconn,1,3<br/>if not rs.eof then ’如果有此记录的话<br/>rs("author").value=strau<br/>rs.update<br/>end if<br/>rs.close<br/>set rs=nothing<br/>adocon.close<br/>set adocon=nothing</p><p>6.删除一条记录(Delete)<br/>语法:Delete table where field=value<br/>例子:删除book表中作者是cancer的记录</p><p>delete book where author=’cancer’</p><p>(注意:如果book表中author字段的值为cancer的记录有多条,将会删除所有author为cancer的记录)</p>
作者:
翔羽
时间:
2006-2-22 14:10
<strong>一、Request<br/></strong> Request对象把客户信息保存在几个集合中,供ASP应用使用。通用的访问方法为:Request.Collection("membername")<br/> 当你不指定集合名时,以(1)QueryString,(2)Form,(3)Cookie和(4)ServerVariable<br/>的顺序搜索所有集合,当发现第一个匹配的变量时,就认定他是要引用的成员。当然,为了提高效率,你最好显式指定是那个集合中的成员。<br/> QueryString集合<br/> 当HTML表单使用GET方法向ASP文件传递数据时,数据被保存在集合QueryString中。其成员可以具有与之相关的多个值,也就是说,同一个表单中,多个元素可以有相同的名字,下面的代码访问这些数据:<br/><%For each item in Request.QueryString("Name")<br/>Response.write Item &"<br>"<br/>Next %><br/> Form集合<br/> 当表单用POST方法时,数据被保存在Form集合中。<br/> ServerVariable集合<br/> 保存了随HTTP请求一起传送HTTP头的信息,可以通过他获取有关浏览器的信息,主要成员有:<br/>REMOTE_ADDR 远程主机IP地址<br/>REMOTE_HOST 远程主机名称<br/>REMOTE_USER 客户名称<br/>REQUEST_METHOD 请求方法(如POST,GET,HEAD)<br/>SERVER_NAME 服务器名<br/>SERVER_PROTOCOL 服务器版本号(如HTTP/1。0)<p> <strong>二、Response对象</strong><br/> 用来控制向客户返回的HTML的内容,有若干属性和方法。下面介绍我认为重要的:<br/> Buffer属性<br/> 如果为True,则Response的内容要写入缓冲区,当脚本处理完时再发给客户。<br/> Status属性<br/>传递HTTP Response报文的状态。服务器返回的状态代码由三位数字组成,可以用于测试阶段和转换控制到其他站点(即Forward)<br/> Write方法<br/> 向客户输出HTML,可以是任何合法的HTML脚本。<br/> Redirect方法<br/> 使浏览器重新定向到另外一个URL上,如:<br/><%browsetype=Request.ServerVariables("HTTP_USER_AGENT")<br/>IF Left(browsetype,11)="Mozilla/2.0" then<br/>Response.Redirect "FancyStart.asp"<br/>Else<br/>Response.Redirect "OldStart.asp"<br/>End if%><br/> Clear方法<br/> 如果设Buffer属性为True,则Clear方法清楚所有缓冲区内容。<br/> Flush方法<br/> 将缓冲内容立即发送给客户。<br/> End方法<br/> 当Active Server遇到该方法时,立即停止处理ASP文件,如果有缓冲,立即发送内容到客户。<br/> BinaryWrite方法<br/> 输出二进制数据</p>
作者:
翔羽
时间:
2006-2-22 14:10
<strong>三、Request对象和Response对象的Cookies集合<br/></strong> 1.写入Cookies<br/> Response.Cookies("Cookie名称")[("键名称").属性]=值<br/> 如果该Cookie已经存在,则值被新值替代,否则,创建该cookie<br/> 例如:<br/><% Response.Cookies("NewCookie")="New Cookie Value" %><br/> 2.读取Cookies<br/> 如:<br/><%=Request.Cookies("NewCookie")%><br/> Cookie还有一些属性,请参见有关资料。<p> <strong>四、Application对象</strong><br/> Active Server应用程序是虚拟目录及其子目录下的所有文件,即一个WEB。可以使用Application对象在应用软件的所有用户中共享信息,并可以在服务器运行期间持久地保存数据。他有一些控制访问应用层数据的方法和事件。<br/> Application本身没有内置属性,可以有用户定义:Application("属性名")=值<br/> 保存在Application对象中的数据可以被Application的所有用户读取。如用来做访问记数:Application("aVisits")=Application("aVisits")+1<br/> 方法有两个:<br/> Lock:<br/> 当用户调用Lock时,只有当前用户能够编辑或增加Application对象的属性。<br/> Unlock:<br/> 一定要记住,调用了Lock,完成时一定要调用Unlock.<br/> 事件也有两个:<br/> Application_OnStart事件:应用程序启动时调用。<br/> Application_OnStart事件:应用程序终止时调用。<br/> 这两个事件再加上Session的两个事件的处理程序都放在文件Global.asp中,一个Web应用只有一个Global.asa文件,且放在该应用的根目录下。一个Global.asp文件的例子如下:<br/><Script Language="VBScript" Runat="Server"><br/>Sub Application_OnStart<br/>Dim laChats(15)<br/>Application("gaChats")=maChats<br/>Application("giCounter")=0<br/>End Sub</p>
作者:
翔羽
时间:
2006-2-22 14:10
<strong>五、Session对象<br/></strong>Active Server使用会话设置为使用应用程序的单个用户持久保持数据。当用户请求Active Server应用程序中ASP文件的URL时,要启动Session。在缺省情况下,如果没有用户请求,则服务器只保留Session20分钟。用户也可以通过设Session的属性TimeOut来改变。或显示地调用Session.Abandon方法来释放Session对象。<br/> SessionID属性<br/> 唯一标识一个会话的标识符。<br/> TimeOut属性<br/> 定义Session保留的时限,单位为分钟,如Session.TimeOut=10<br/> 像Application一样,Session也可由用户来定义属性。<br/> Session的唯一方法是Abandon,用来取消用户的Session对象,并释放其占用的服务器资源。如:<%Session.Abandon%><br/> 事件有Session_OnStart和Session_OnEnd,其处理程序应放在文件Glabal.asa中。<p> <strong>六、Server对象</strong><br/> 1.HTMLEncode方法<br/> 对特定的字符串进行HTML编码,如你本来要显示下列内容:<br/>The Underline tag(<u></u>) is used to underline the surrounded text.<br/> 但很可能实际显示成:<br/>The Underline tag() is used to underline the surrounded text.<br/> 为了避免这种情况,可以调用Server对象的HTMLEncode方法,如:<br/><%<br/>Response.Write Server.HTMLEncode("The Underline tag(<U></U>) is used to underline the surrounded text.")<br/>%><br/> 2.URLEncode方法<br/> 根据URL规则对字符串进行编码。当字符串数据以URL格式传递到服务器时,串中间不能有空格,不能有特殊字符,这时,你就必须用URL编码。<br/> 3.CreateObject方法<br/> 用于创建已注册到服务器机器上的ActiveX组件例程,这恐怕是最重要的一个方法了:<br/> 句法如下:<br/>Server.CreateObject("ComponentName")<br/> 可以作为例程启动的组件可以是ActiveX能够使用的所有内置组件,实际上是存在于服务器上的任何ActiveX组件。比如,要使用金融计算,步骤如下:<br/> 1.创建对象<br/><%<br/>set x=server.createobject("extend.financial");<br/>%><br/> 2.调用对象的方法<br/><%<br/>set x=server.createobject("extend.financial")<br/>response.write Format(x.futval(.07/12,200,-500),"###,###,##0.00")<br/>%><br/> 3.释放例程<br/><%<br/>set x=Nothing<br/>%></p>
作者:
翔羽
时间:
2006-2-22 14:10
<strong>七、FileSystem和TextStream对象<br/></strong> FileSystem和TextStream对象可用于建立对文件系统的访问,并提供顺序访问文件的机制。FileSystem没有属性,只有两个方法,第一个方法是CreateTextFile方法,可以在宿主机上创建新的文本文件,并返回TextStream对象以提供对新创建文件的访问机制。第二个是OpenTextFile方法,用于打开文本文件供顺序访问并返回一个TextStream对象。如:<p><%<br/>set fsFilesys=CreateObject("Scripting.FileSystemObject")<br/>set tsCoffee=fsFilesys.CreateTextFile("c:\coffe.txt",True)<br/>tsCoffee.WriteLine("Man,I Could use some coffee.")<br/>tsCoffee.Close<br/>%><br/> TextStream对象的使用有:<br/> AtEndOfLine:如果文件当前字符处在行的末尾则返回true<br/> AtEndOfScreen:如果当前字符在文件的末尾则返回true<br/> Column:返回当前字符的列号<br/> Line:返回当前字符的行号<br/> TextStream对象的方法为:<br/> Close:关闭并释放TextStream对象<br/> Read:从一个文件中读取给定个数的字符到一个变量中<br/> ReadAll:读取文件的全部内容到一个变量中<br/> ReadLine:读取给定行号的内容到一个变量中<br/> Skip:跳过给定个数的字符<br/> SkipLine:跳过给顶的行书<br/> Write:写如字符串<br/> WriteLine:写入以换行结束的字符串<br/> WriteBlankLines:写入给顶数量的空格<br/></p>
作者:
翔羽
时间:
2006-2-22 14:11
<p>Request对象用于接受所有从浏览器发往你的服务器的请求内的所有信息。</p><p>集合</p><p>Request.ClientCertificate(key[SubField])</p><p>所有客户证书的信息的集合。对于Key,该集合具有如下的关键字:</p><p>Subject<br/>证书的主题。包含所有关于证书收据的信息。能和所有的子域后缀一起使用。</p><p>Issuer<br/>证书的发行人。包含所有关于证书验证的信息。除了CN外,能和所有的子域后缀一起使用。</p><p>VadidFrom<br/>证书发行的日期。使用VBScript格式。</p><p>ValidUntil<br/>该证书不在有效的时间。</p><p>SerialNumber<br/>包含该证书的序列号。</p><p>Certificate<br/>包含整个证书内容的二进制流,使用ASN.1格式。</p><p><br/>对于SubField,Subject和Issuer关键字可以具有如下的子域后缀:(比如:SubjectOU或IssuerL)</p><p>C<br/>起源国家。</p><p>O<br/>公司或组织名称。</p><p>OU<br/>组织单元。</p><p>CN<br/>用户的常规名称。</p><p>L<br/>局部。</p><p>S<br/>州(或省)。</p><p>T<br/>个人或公司的标题。</p><p>GN<br/>给定名称。</p><p>I<br/>初始。</p><p><br/>当文件cervbs.inc(VBScript使用)或cerjavas.inc(Jscript使用)通过使用#INCLUDE导向包含在你的Active Server Page里时,下面两个标志可以使用:</p><p>ceCertPresent<br/>指明客户证书是否存在,其值为TRUE或FALSE。</p><p>ceUnrecongnizedIssure<br/>指明在该链表中的最后的证书的发行者是否未知,其值为TRUE或FALSE。</p><p><br/>Request.Cookies(Cookie[(key).Attribute])</p><p>Cookie的集合。允许获得浏览器的Cookie。Cookie指明返回那一个Cookie。Key用于从Cookie字典中返回具有某一关键字的Cookie值。对于Attribute,你能使用属性HasKeys来确定某一Cookie是否具有子关键字。HasKeys的值为TRUE或FALSE。</p><p>Request.Form(Parameter)[(Index).Count]</p><p>填写在HTML的表单中所有的数据的集合。Parameter是在HTML表单中某一元素的名称。当某一参数具有不止一个值(比如,当在<SELECT>中使用MULTIPLE属性时)时,使用Index。当某一参数具有多值时,Count指明多值个数。</p><p>Request.QueryString(Varible)[(Index).Count]</p><p>查询字符串的所有值的集合。Varible是在查询字符串某一变量的名称。当某一变量具有多于一个值时,使用Index。当某一参数具有多值时,Count指明值的个数。</p><p>Request.ServerVaribles(Server Environment Variable)</p><p>环境变量的集合。允许读取HTTP头。你可以通过使用HTTP_前缀来读取任何头信息。比如,HTTP_USER_AGENT接受客户代理HTTP头(浏览器类型)。除此外,你可以使用下表所示的变量获得任何环境信息。</p>
作者:
翔羽
时间:
2006-2-22 14:11
<p>ALL_HTTP<br/>客户端发送的所有HTTP标头,他的结果都有前缀HTTP_。</p><p>ALL_RAW<br/>客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_ </p><p>APPL_MD_PATH<br/>应用程序的元数据库路径。</p><p>APPL_PHYSICAL_PATH<br/>与应用程序元数据库路径相应的物理路径。</p><p>AUTH_PASSWORD<br/>当使用基本验证模式时,客户在密码对话框中输入的密码。</p><p>AUTH_TYPE<br/>这是用户访问受保护的脚本时,服务器用于检验用户的验证方法。</p><p>AUTH_USER<br/>代验证的用户名。</p><p>CERT_COOKIE<br/>唯一的客户证书ID号。</p><p>CERT_FLAG<br/>客户证书标志,如有客户端证书,则bit0为0。如果客户端证书验证无效,bit1被设置为1。</p><p>CERT_ISSUER<br/>用户证书中的发行者字段。</p><p>CERT_KEYSIZE<br/>安全套接字层连接关键字的位数,如128。</p><p>CERT_SECRETKEYSIZE<br/>服务器验证私人关键字的位数。如1024。</p><p>CERT_SERIALNUMBER<br/>客户证书的序列号字段。</p><p>CERT_SERVER_ISSUER<br/>服务器证书的发行者字段</p><p>CERT_SERVER_SUBJECT<br/>服务器证书的主题字段。</p><p>CERT_SUBJECT<br/>客户端证书的主题字段。</p><p>CONTENT_LENGTH<br/>客户端发出内容的长度。</p><p>CONTENT_TYPE<br/>客户发送的form内容或HTTP PUT的数据类型。</p><p>GATEWAY_INTERFACE<br/>服务器使用的网关界面。</p><p>HTTPS<br/>如果请求穿过安全通道(SSL),则返回ON。如果请求来自非安全通道,则返回OFF。</p><p>HTTPS_KEYSIZE<br/>安全套接字层连接关键字的位数,如128。</p><p>HTTPS_SECRETKEYSIZE<br/>服务器验证私人关键字的位数。如1024。</p><p>HTTPS_SERVER_ISSUER<br/>服务器证书的发行者字段。</p><p>HTTPS_SERVER_SUBJECT<br/>服务器证书的主题字段。</p><p>INSTANCE_ID<br/>IIS实例的ID号。</p><p>INSTANCE_META_PATH<br/>响应请求的IIS实例的元数据库路径。</p><p>LOCAL_ADDR<br/>返回接受请求的服务器地址。</p><p>LOGON_USER<br/>用户登录Windows NT的帐号</p><p>
ATH_INFO<br/>客户端提供的路径信息。</p><p>
ATH_TRANSLATED<br/>通过由虚拟至物理的映射后得到的路径。</p><p>QUERY_STRING<br/>查询字符串内容。</p><p>REMOTE_ADDR<br/>发出请求的远程主机的IP地址。</p><p>REMOTE_HOST<br/>发出请求的远程主机名称。</p><p>REQUEST_METHOD<br/>提出请求的方法。比如GET、HEAD、POST等等。</p><p>SCRIPT_NAME<br/>执行脚本的名称。</p>
作者:
翔羽
时间:
2006-2-22 14:11
<p>SERVER_NAME<br/>服务器的主机名、DNS地址或IP地址。</p><p>SERVER_PORT<br/>接受请求的服务器端口号。</p><p>SERVER_PORT_SECURE<br/>如果接受请求的服务器端口为安全端口时,则为1,否则为0。</p><p>SERVER_PROTOCOL<br/>服务器使用的协议的名称和版本。</p><p>SERVER_SOFTWARE<br/>应答请求并运行网关的服务器软件的名称和版本。</p><p>URL<br/>提供URL的基本部分。</p><p> </p><p>方法</p><p>Request.BinaryRead(Count)</p><p>接收一个HTML表单的未经过处理的内容。当调用此方法时,Count指明要接收多少字节。在调用此方法后,Count指明实际上接收到多少个字节。</p><p>属性</p><p>Request.TotalBytes</p><p>查询体的长度,以字节为单位。</p>
作者:
翔羽
时间:
2006-2-22 14:12
<p>Session 对象<br/>可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。</p><p>当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。</p><p>Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。</p><p>注意 会话状态仅在支持 cookie 的浏览器中保留。</p><p>语法<br/>Session.collection|property|method</p><p>集合 <br/>Contents 包含已用脚本命令添加到会话中的项目。 <br/>StaticObjects 包含通过 <OBJECT> 标记创建的并给定了会话作用域的对象。 </p><p><br/>属性<br/>CodePage 将用于符号映射的代码页。 <br/>LCID 现场标识。 <br/>SessionID 返回用户的会话验证。 <br/>Timeout 应用程序会话状态的超时时限,以分钟为单位。 </p><p><br/>方法<br/>Abandon 该方法破坏 Session 对象并释放其资源。 </p><p><br/>事件<br/>global.asa 文件中声明下列事件的脚本。</p><p>Session_OnEnd <br/>Session_OnStart </p><p><br/>有关以上事件及 global.asa 文件的详细信息, 请参阅 Global.asa 参考.</p><p>注释<br/>您可以在 Session 对象中存储值。存储在 Session 对象中的信息在会话及会话作用域内有效。下列脚本演示两种类型的变量的存储方式。</p><p><% <br/>Session("username") = "Janine"<br/>Session("age") = 24<br/>%></p><p>但是,如果您将对象存储在 Session对象中,而且您使用 VBScript 作为主脚本语言。则必须使用关键字 Set。如下列脚本所示。</p><p><% Set Session("Obj1") = Server.CreateObject("MyComponent.class1") %></p><p>然后,您就可以在后面的 Web 页上调用 MyComponent.class1 揭示的方法和属性,其调用方法如下:</p><p><% Session("Obj1").MyMethod %></p><p>也可以通过展开该对象的本地副本并使用下列脚本来调用:</p><p><% <br/>Set MyLocalObj1 = Session("Obj1") <br/>MyLocalObj1.MyObjMethod<br/>%></p><p>创建有会话作用域的对象的另一种方法是在 global.asa 文件中使用 <OBJECT> 标记。 </p><p>但是不能在 Session 对象中存储内建对象。例如,下面每一行都将返回错误。</p><p><%<br/>Set Session("var1") = Session<br/>Set Session("var2") = Request<br/>Set Session("var3") = Response<br/>Set Session("var4") = Server<br/>Set Session("var5") = Application<br/>%></p><p>在将对象存储到 Session 对象之前,必须了解它使用的是哪一种线程模型。只有那些标记为“Both”的对象才能存储在没有锁定单线程会话的 Session 对象中。详细信息, 请参阅“创建 ASP 组件”中的“选择线程模型”。</p>
作者:
翔羽
时间:
2006-2-22 14:12
<p>若您将一个数组存储在 Session对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。</p><p><% Session("StoredArray")(3) = "new value" %></p><p>这是因为 Session对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。</p><p>我们极力建议您在将数组存储在 Session对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,您应再将数组全部存储在 Session 对象中,这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。</p><p>---file1.asp---<br/><%<br/>'Creating and initializing the array<br/>Dim MyArray()<br/>Redim MyArray(5)<br/>MyArray(0) = "hello"<br/>MyArray(1) = "some other string"</p><p>'Storing the array in the Session object<br/>Session("StoredArray") = MyArray</p><p>Response.Redirect("file2.asp")<br/>%></p><p>---file2.asp---<br/><%<br/>'Retrieving the array from the Session Object<br/>'and modifying its second element<br/>LocalArray = Session("StoredArray")<br/>LocalArray(1) = " there"</p><p>'printing out the string "hello there"<br/>Response.Write(LocalArray(0)&LocalArray(1))</p><p>'Re-storing the array in the Session object<br/>'This overwrites the values in StoredArray with the new values<br/>Session("StoredArray") = LocalArray<br/>%></p><p>示例 <br/>下列代码将字符串 MyName 分配给名为 name 的会话变量,并给名为 year 的会话变量指定一个值,而且为 some.Obj 组件的实例指定一个名为 myObj 的变量。</p><p>Session("name") = "MyName" <br/>Session("year") = 96 <br/>Set Session("myObj") = Server.CreateObject("someObj") <br/>%> </p><p></p><p> </p>
作者:
翔羽
时间:
2006-2-22 14:12
<p>Server 对象:</p><p>Server 对象提供对服务器上的方法和属性的访问。其中大多数方法和属性是作为实用程序的功能服务的。</p><p>语法 </p><p>Server.property|method</p><p>属性</p><p>ScriptTimeout:<br/>ScriptTimeout 属性指定脚本在结束前最大可运行多长时间。 当处理服务器组件时,超时限制将不再生效。 </p><p>语法 Server.ScriptTimeout = NumSeconds</p><p>参数 NumSeconds <br/>指定脚本在被服务器结束前最大可运行的秒数。默认值为 90 秒。 </p><p>注释<br/>通过使用元数据库中的AspScriptTimeout属性可以为 Web 服务或 Web 服务器设置缺省的ScriptTimeout值。ScriptTimeout属性不能设置为小于在元数据库中指定的值。例如,如果NumSeconds设置为10,而元数据库设置包含了默认值90秒,则脚本在90秒后超时。但如果NumSeconds设置为100,则脚本在100秒后超时。</p><p>关于使用元数据库的详细信息,参阅 关于元数据库。</p><p>示例 以下示例中,如果服务器处理脚本超过 100 秒,将使之超时。<br/><% Server.ScriptTimeout = 100 %><br/>以下示例获取 ScriptTimeout 属性当前值,并将其存储在变量 TimeOut 中。<br/><% TimeOut = Server.ScriptTimeout %></p><p>方法</p><p>CreateObject <br/>CreateObject 方法创建服务器组件的实例。如果该组件执行了 OnStartPage 和 OnEndPage 方法,则此时就会调用 OnStartPage 方法。有关服务器组件的详细信息,请参阅 可安装的 ASP 组件 。</p><p>语法 Server.CreateObject( progID )</p><p>参数 progID 指定要创建的对象的类型。progID 的格式为 [Vendor.] component[.Version]。</p><p>注释 默认情况下,由 Server.CreateObject 方法创建的对象具有页作用域。这就是说,再当前 ASP 页处理完成之后,服务器将自动破坏这些对象。要创建有会话或应用程序作用域的对象,可以使用 <OBJECT> 标记并设置 SESSION 或 APPLICATION 的 SCOPE 属性,也可以在对话及应用程序变量中存储该对象。<br/>例如,在如下所示的脚本中,当 Session 对象被破坏,即当对话超时时或 Abandon 方法被调用时,存储在会话变量中的对象也将被破坏。<br/><% Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%><br/>可以通过将变量设置为 Nothing 或新的值来破坏对象,如下所示。第一个例子释放 ad 对象,第二个例子用字串代替 ad 。<br/><% Session ("ad") = Nothing %><br/><% Session ("ad") = " Other Valum " %><br/>不能创建与内建对象同名的对象实例。 例如,下列脚本将返回错误。<br/><% Set Response = Server.CreateObject("Response") %> </p><p>示例 <% Set MyAd = Server.CreateObject("MSWC.AdRotator") %> <br/>上面的例子创建一个名为 MyAd 的 MSWC.AdRotator 服务器组件,MSWC.AdRotator 组件可用于在 Web 页上的自动轮换广告。<br/>关于服务器组件的详细信息, 请参阅 Creating Components for ASP.</p><p>HTMLEncode HTMLEncode方法对指定的字符串应用 HTML 编码。 </p><p>语法 Server.HTMLEncode( string )</p><p>参数 string 指定要编码的字符串。 </p><p>示例脚本 <%= Server.HTMLEncode("The paragraph tag: <
>") %> </p><p>输出 The paragraph tag: &lt
&gt; </p><p>注意 以上输出将被 Web 浏览器显示为The paragraph tag: <
>如果查看一下源文件或以文本方式打开一个 Web 页,您就可以看到已编码的 HTML。<br/></p><p> </p>
作者:
翔羽
时间:
2006-2-22 14:12
ObjectContext 对象提交或放弃一项由 Microsoft Transaction Server (MTS) 管理的事务,它由 ASP 页包含的脚本初始化。 <p>ASP 包含 @TRANSACTION 指令时,该页会在事务中运行,直到事务成功或失败后才会终止。 </p><p>语法<br/>ObjectContext.method</p><p>方法<br/>SetComplete SetComplete 方法声明脚本不了解事务未完成的原因。如果事务中的所有组件都调用 SetComplete,事务将完成。 <br/>SetAbort SetAbort 方法声明被脚本初始化的事务未完成,无法更新源。 </p><p><br/>事件<br/>OnTransactionCommit <br/>OnTransactionAbort </p><p><br/>注释<br/>ObjectContext 实现 MTS ObjectContext 对象的两种方法。 SetAbort 方法完全终止事务。这样,MTS 不更新在第一阶段联系的源。事务终止时,将处理脚本的 OnTransactionAbort 事件。</p><p>调用 SetComplete 方法并不一定意味着事务已完成。只有脚本调用的所有事务组件都调用了 SetComplete,事务才能完成。在大多数实例中,如果结束处理时未调用 SetAbort,脚本通常被假定为完成的,所以不一定要在脚本内调用 SetComplete。</p><p>ObjectContext 展示了 SetAbort 和 SetComplete 以外的六种方法。这些方法可用于脚本调用的组件,但不能直接用于 ASP 脚本。 </p><p>示例<br/>这里示范使用 SetAbort 和 SetCommit 的方法。Sales.htm 文件获取处理销售请求所需的数据。第二个文件——SalesVerify.asp 中的脚本使用两个对象——Inventory 和 Sales 处理销售。如果 Inventory 返回了错误代码表示供销售的存货不足,就会调用 SetAbort。如果 Inventory 对象没有返回错误代码,将会调用 SetComplete 处理销售请求。</p><p>Sales.htm<br/><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"></p><p><HTML><br/><HEAD><br/><TITLE>Sales Order</TITLE><br/></HEAD><br/><BODY BGCOLOR="#FFFFFF"><FONT FACE="ARIAL,HELVETICA"><br/><H2>Sales Order Form </H2></p><p><FORM METHOD=POST ACTION="SalesVerify.asp"> <br/><
>
lease enter the product code, quantity, and your account number.<br/><INPUT TYPE=TEXT NAME=QuantityToBuy> <br/><INPUT TYPE=TEXT NAME=ProductCode> <br/><INPUT TYPE=TEXT NAME=AccountIn> <br/><
><br/><INPUT TYPE=SUBMIT> <br/></FONT> <br/></BODY><br/></HTML></p><p>SalesVerify.asp 文件<br/><%@ Transaction = Required %><br/><%<br/>Set CurrentQOH = Server.CreateObject("Mycomp.Inventory")<br/>Set CurrentSales = Server.CreateObject("Mycomp.Sales")</p><p>CheckQuantity = Request("QuantityToBuy")<br/>CheckProduct = Request("
roductCode")<br/>QuantityStatus = CurrentQOH.CheckQOH(CheckQuantity,CheckProduct)</p><p>If QuantityStatus = None<br/>ObjectContext.SetAbort<br/>Response.Write "Sorry, there is not sufficient quantity on hand to process your sale."<br/>Else <br/>ObjectContext.SetComplete<br/>Account = Request("AccountIn")<br/>Saleupdate = CurrentSales.PostIt(AccountIn)<br/>End If<br/>%></p>
作者:
翔羽
时间:
2006-2-22 14:13
Application 对象。在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序。我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据。而且,Application 对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。 <br/> 下面就让我们一起来学习 Application 对象。 <p> 一、属性 </p><p> 虽然 Application 对象没有内置的属性,但我们可以使用以下句法设置用户定义的属性也可称为集合。 </p><p> Application(" 属性 / 集合名称 ")= 值 </p><p> 我们可以使用如下脚本声明并建立 Application 对象的属性。 <br/>< %<br/>Application("MyVar") = "Hello"<br/>Set Application("MyObj") = Server.CreateObject("MyComponent")<br/>%></p><p></p><p> 一旦我们分配了 Application 对象的属性,它就会持久地存在,直到关闭 WEB 服务器服务使得 Application 停止。由于存储在 Application 对象中的数值可以被应用程序的所有用户读取,所以 Application 对象的属性特别适合在应用程序的用户之间传递信息。 <br/> 二、方法 </p><p> Application 对象有两个方法,它们都是用于处理多个用户对存储在 Application 中的数据进行写入的问题 </p><p> 1、Lock 方法禁止其他客户修改 Application 对象的属性。 </p><p> Lock 方法阻止其他客户修改存储在 Application 对象中的变量,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将在 .asp 文件结束或超时后即解除对 Application 对象的锁定。 </p><p> 让我们来看看下面这段用 Application 来记录页面访问次数的程序 : <br/>< %<br/>Dim NumVisitsNumVisits=0<br/>Application.LockApplication("NumVisits") = Application("NumVisits") + 1<br/>Application.Unlock<br/>%><br/>欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !</p><p><br/> 将以上脚本保存在你的 .asp 文件中,就轻而易举地给你的页面添加了一个计数器。 </p><p> 2、和 Lock 方法相反,Unlock 方法允许其他客户修改 Application 对象的属性。 </p><p> 在上面的例子中,上述例子中,Unlock 方法解除对象的锁定,使得下一个客户端能够增加 NumVisits 的值。 </p><p> 三、事件 </p><p> 1、Application_OnStart </p><p> Application_OnStart 事件在首次创建新的会话 ( 即 Session_OnStart 事件 ) 之前发生。当 WEB 服务器启动并允许对应用程序所包含的文件进行请求时就触发 Application_OnStart 事件。Application_OnStart 事件的处理过程必须写在 Global.asa 文件之中。</p><p> Application_OnStart 事件的语法如下 : <br/>< SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server><br/>Sub Application_OnStart. . .<br/>End Sub<br/>< /SCRIPT></p><p><br/> 2、Application_OnEnd </p><p> Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,Application_OnEnd 事件的处理过程也必须写在 Global.asa 文件之中。 </p><p> 下面让我们来看看在使用 Application 对象时必须注意的一些事项。 </p><p> 不能在 Application 对象中存储 ASP 内建对象。例如,下面的每一行都返回一个错误。 <br/>< %<br/>Set Application("var1")=Session<br/>Set Application("var2")=Request<br/>Set Application("var3")=Response<br/>Set Application("var4")=Server<br/>Set Application("var5")=Application<br/>Set Application("var6")=ObjectContext<br/>%></p><p><br/> 若您将一个数组存储在 Application 对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。 <br/>< % Application("StoredArray")(3) = "new value" %></p><p></p><p> 这是因为 Application 对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。建议您在将数组存储在 Application 对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,您应再将数组全部存储在 Application 对象中,这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。 <br/>---asp8a.asp---<br/>< %<br/>dim MyArray()<br/>Redim MyArray(5)<br/>MyArray(0)="hello"<br/>MyArray(1)="some other string"<br/>Application.Lock<br/>Application("StoredArray")=MyArray<br/>Application.Unlock<br/>Response.Redirect "asp8b.asp"<br/>%></p><p>---asp8b.asp---<br/>< %<br/>LocalArray=Application("StoredArray")<br/>LocalArray(1)=" there"<br/>Response.Write LocalArray(0)&LocalArray(1)<br/>Application.Lock<br/>Application("StoredArray")=LocalArray<br/>Application.Unlock<br/>%></p><p> 与 Application 对象具有相近作用的另一个非常实用的 ASP 内建对象就是 Session。我们可以使用 Session 对象存储特定的用户会话所需的信息。当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。</p><p> 通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象。当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有名为 ASPSESSIONID 的 Cookie 发送过来,如果有,则服务器会启动新的会话,并为该会话生成一个全局唯一的值,在把这个值作为新 ASPSESSIONID Cookie 的值发送给客户端,正是使用这种 Cookie,可以访问存储在服务器上的属于客户程序的信息。Session 对象最常见的作用就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。另外其还经常被用在鉴别客户身份的程序中。要注意的是,会话状态仅在支持 cookie 的浏览器中保留,如果客户关闭了 Cookie 选项,Session 也就不能发挥作用了。</p>
作者:
翔羽
时间:
2006-2-22 14:13
一、属性 <p> 1、SessionID </p><p> SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识。会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。 </p><p> 2、TimeOut </p><p> Timeout 属性以分钟为单位为该应用程序的 Session 对象指定超时时限。如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。 </p><p> 二、方法 </p><p> Session 对象仅有一个方法,就是 Abandon,Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 Abandon 方法,一旦会话超时,服务器将删除这些对象。当服务器处理完当前页时,下面示例将释放会话状态。 <br/> < % Session.Abandon %></p><p></p><p> 三、事件 </p><p> Session 对象有两个事件可用于在 Session 对象启动和释放是运行过程。 </p><p> 1、Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。 </p><p> 尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。 </p><p> 为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。程序如下 : </p><p>< SCRIPT RUNAT=Server Language=VBScript><br/>Sub Session_OnStart<br/>startPage = "/MyApp/StartHere.asp"<br/>currentPage = Request.ServerVariables("SCRIPT_NAME")<br/>if strcomp(currentPage,startPage,1) then<br/>Response.Redirect(startPage)<br/>end if<br/>End Sub<br/>< /SCRIPT></p><p> 上述程序只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求服务器都将处理 Session_OnStart 脚本并将用户重定向到启动页中。 <br/> 2、Session_OnEnd 事件在会话被放弃或超时发生。 </p><p> 关于使用 Session 对象需要注意的事项 Application 对象相近,请参照前文。 </p><p> 会话可以通过以下三种方式启动 : </p><p> 1、一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。 </p><p> 2、用户在 Session 对象中存储了一个值。 </p><p> 3、用户请求了一个应用程序的 .asp 文件,并且该应用程序的Global.asa 文件使用 < OBJECT> 标签创建带有会话作用域的对象的实例。 </p><p> 如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束。这段时间的默认值是 20 分钟。可以通过在 Internet 服务管理器中设置“应用程序选项”属性页中的“会话超时”属性改变应用程序的默认超时限制设置。应依据您的 Web 应用程序的要求和服务器的内存空间来设置此值。例如,如果您希望浏览您的 Web 应用程序的用户在每一页仅停留几分钟,就应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽您的服务器的内存资源。对于一个特定的会话,如果您想设置一个小于默认超时值的超时值,可以设置 Session 对象的 Timeout 属性。例如,下面这段脚本将超时值设置为 5 分钟。 <br/> < % Session.Timeout = 5 %></p><p> 当然你也可以设置一个大于默认设置的超时值,Session.Timeout 属性决定超时值。你还可以通过 Session 对象的 Abandon 方法显式结束一个会话。例如,在表格中提供一个“退出”按钮,将按钮的 ACTION 参数设置为包含下列命令的 .asp 文件的 URL。 <br/> < % Session.Abandon %> </p>
作者:
翔羽
时间:
2006-2-24 09:10
<p><font color="#cc3300">点击返回上页代码:</font><br/><form><br/><p><input TYPE="button" VALUE="返回上一步" ONCLICK="history.back(-1)"></p><br/></form></p><p><font color="#cc3300">弹出警告框代码:</font><br/><form><br/><p><input TYPE="button" VALUE="弹出警告框" ONCLICK="AlertButton()"></p><br/></form><br/><script language="JavaScript"><!--<br/>function AlertButton(){window.alert("要多多光临呀!");}<br/>// --></script></p><p><font color="#cc3300">点击打开新窗口</font><br/><form><br/><p><input TYPE="button" VALUE="打开新窗口" ONCLICK="NewWindow()"></p><br/></form><br/><script language="JavaScript"><!--<br/>function NewWindow(){window.open("http://www.mcmx.com","","height=240,width=340,status=no,location=no,toolbar=no,directories=no,menubar=no");}<br/>// --></script></body></p><p><font color="#cc3300">删除记录时弹出确认框:<br/></font><script LANGUAGE="VBSCRIPT"> <br/>a=msgbox("真的要删除该记录吗?",1,"注意")<br/>if a=1 then<br/>location="Dodelete.asp?id=<%=id%>" //指向执行删除的页面Dodelete.asp<br/>else <br/>history.go(-1)<br/>end if<br/></script><br/></p><p><font color="#cc3300">关闭打开的窗口 </font><br/>< a href="/" onclick="javascript:window.close(); return false;">关闭窗口</a> </p><p><font color="#cc3300">清空INPUT且选定</font><br/>onClick="Javascript:this.value=''" onFocus="this.select()" onMouseOver="this.focus()"</p><p><font color="#cc3300">右键屏蔽</font><br/><body oncontextmenu=self.event.returnValue=false></p><p><font color="#cc3300">连串英文自动换行的解决方法 IE5.5<br/></font>style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word" 你可修改为指定的大小如 200px </p><p><font color="#cc3300">图片“重置”按钮</font><br/><script language="jscript"><br/>function myreset()<br/>{ document.login.reset();<br/>document.login.focus();}<br/></script><br/><img src="image/reclear.gif" width="69" height="20" style="cursor:hand" onfocus="this.blur()" onclick="myreset()"</p><p><font color="#cc3300">画细线表格<br/></font><table style="border-collapse: collapse"> </p><p><font color="#cc3300">状态栏信息</font><br/><form><br/><p><input TYPE="button" VALUE="状态栏信息" ONCLICK="StatusButton()"></p><br/></form><br/><script language="JavaScript"><!--<br/>function StatusButton(){window.status="要多多光临呀!";}<br/>// --></script></p><p><font color="#cc3300">最小化、最大化、关闭窗口<br/></font><object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> <br/><param name="Command" value="Minimize"></object><br/><object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> <br/><param name="Command" value="Maximize"></object><br/><OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"><br/><
ARAM NAME="Command" VALUE="Close"></OBJECT><br/><br/><input type=button value=最小化 onclick=hh1.Click()><br/><input type=button value=最大化 onclick=hh2.Click()><br/><input type=button value=关闭 onclick=hh3.Click()><br/>本例适用于IE</p>
作者:
翔羽
时间:
2006-2-24 09:11
<p><font color="#cc3300">隐藏状态栏里出现的LINK信息 </font><br/><a href="http://"; onMouseOver="window.status='none';return true">梦想天空</a> </p><p><font color="#cc3300">文本框自动滚动条</font><br/><textarea name=words rows=18 cols=26 style="border:1 solid #000000;background-color:white; font-size:9pt; width:188; overflow:auto" wrap=hard></textarea></p><p><font color="#cc3300">全选并复制</font><br/><FORM name=test><INPUT onclick="javascript:HighlightAll('test.select1')" type=button value=全选并复制><BR><TEXTAREA name=select1 rows=3 cols=46>你好,欢迎您的光临!</TEXTAREA> <br/></FORM><br/><SCRIPT language=Javascript> <br/><!-- <br/><br/>var copytoclip=1 <br/><br/>function HighlightAll(theField) { <br/>var tempval=eval("document."+theField) <br/>tempval.focus() <br/>tempval.select() <br/>if (document.all&&copytoclip==1){ <br/>therange=tempval.createTextRange() <br/>therange.execCommand("Copy") <br/>window.status="Contents highlighted and copied to clipboard!" <br/>setTimeout("window.status=''",1800) <br/>} <br/>} <br/>//--> <br/></SCRIPT></p><p><font color="#cc3300">屏蔽JAVASCRIPT错误</font><br/><script language="JavaScript"><br/><!--<br/>function killErrors(){<br/>return true;<br/>}<br/>window.onerror = killErrors;<br/>--><br/></script><br/><font color="#cc3300"><br/>关闭子窗口时刷新父窗口</font> <br/><script language="JavaScript"><br/><!--<br/>self.opener.location.reload();<br/>window.close()<br/>--><br/></script><br/></p><p><font color="#cc3300">背景色变换</font><br/><form><br/><p><input TYPE="button" VALUE="背景色变换" onClick="BgButton()"></p><br/></form><br/><script>function BgButton(){<br/>if (document.bgColor=='#00ffff')<br/>{document.bgColor='#ffffff';}<br/>else{document.bgColor='#00ffff';}<br/>}<br/></script></p>
作者:
翔羽
时间:
2006-2-24 09:11
<p><font color="#cc3300">检查一段字符串是否全由数字组成 </font><br/><script language="Javascript"><!-- <br/>function checkNum(str){return str.match(//D/)==null} <br/>alert(checkNum("1232142141")) <br/>alert(checkNum("123214214a1")) <br/>// --></script> </p><p><font color="#cc3300">判断是否是字符 </font><br/>if (/[^/x00-/xff]/g.test(s)) alert("含有汉字"); </p><p><font color="#cc3300">点击刷新代码:</font><br/><form><br/><p><input TYPE="button" VALUE="刷新按钮一" ONCLICK="ReloadButton()"></p><br/></form><br/><script language="JavaScript"><!--<br/>function ReloadButton(){location.href="allbutton.htm";}<br/>// --></script></p><p><font color="#cc3300">让层不被控件复盖代码:</font><br/><div z-Index:2><object xxx></object></div> # 前面 <br/><div z-Index:1><object xxx></object></div> # 后面 <br/><div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><iframe width=0 height=0></iframe></div><br/><div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><iframe height=100% width=100%></iframe></div> </p><p><font color="#cc3300">让层的相对定位 </font><br/><div id="Layer1" style="position:relative; left:0px; top:0px; width:0px; height:0px;z-index:1"> <br/><div id="Layer2" style="position:absolute; left:500px; top:0px; width:220px; height:220px; z-index:1"> <br/>内容<br/></div></div></p><p><font color="#cc3300">Flash代码以及背景透明</font><br/><object classid="clsid
27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="200" height="200"><br/><param name="movie" value="文件"><br/><param name="quality" value="high"><br/><param name="wmode" value="transparent"><br/><embed src="images/fish.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="220" height="220"></embed></object> </p>
作者:
翔羽
时间:
2006-2-24 09:11
<p><font color="#cc3300">Windows Media Player 播放器</font><br/><OBJECT id=MediaPlayer1 <br/>style="LEFT: 0px; VISIBILITY: visible; POSITION: absolute; TOP: 0px;z-index:2" <br/>codeBase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=</p><p>Loading <br/>type=application/x-oleobject height=300 width=320 <br/>classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 VIEWASTEXT><br/><
ARAM NAME="URL" VALUE="地址"></p><p><param name="AudioStream" value="-1"><br/><param name="AutoSize" value="0"><br/><param name="AutoStart" value="-1"><br/><param name="AnimationAtStart" value="0"><br/><param name="AllowScan" value="-1"><br/><param name="AllowChangeDisplaySize" value="-1"><br/><param name="AutoRewind" value="0"><br/><param name="Balance" value="0"><br/><param name="BaseURL" value><br/><param name="BufferingTime" value="5"><br/><param name="CaptioningID" value><br/><param name="ClickToPlay" value="-1"><br/><param name="CursorType" value="0"><br/><param name="CurrentPosition" value="-1"><br/><param name="CurrentMarker" value="0"><br/><param name="DefaultFrame" value><br/><param name="DisplayBackColor" value="0"><br/><param name="DisplayForeColor" value="16777215"><br/><param name="DisplayMode" value="0"><br/><param name="DisplaySize" value="4"><br/><param name="Enabled" value="-1"><br/><param name="EnableContextMenu" value="-1"><br/><param name="EnablePositionControls" value="0"><br/><param name="EnableFullScreenControls" value="0"><br/><param name="EnableTracker" value="-1"><br/><param name="InvokeURLs" value="-1"><br/><param name="Language" value="-1"><br/><param name="Mute" value="0"><br/><param name="
layCount" value="1"><br/><param name="
reviewMode" value="0"><br/><param name="Rate" value="1"><br/><param name="SAMILang" value><br/><param name="SAMIStyle" value><br/><param name="SAMIFileName" value><br/><param name="SelectionStart" value="-1"><br/><param name="SelectionEnd" value="-1"><br/><param name="SendOpenStateChangeEvents" value="-1"><br/><param name="SendWarningEvents" value="-1"><br/><param name="SendErrorEvents" value="-1"><br/><param name="SendKeyboardEvents" value="0"><br/><param name="SendMouseClickEvents" value="0"><br/><param name="SendMouseMoveEvents" value="0"><br/><param name="SendPlayStateChangeEvents" value="-1"><br/><param name="ShowCaptioning" value="0"><br/><param name="ShowControls" value="-1"><br/><param name="ShowAudioControls" value="-1"><br/><param name="ShowDisplay" value="0"><br/><param name="ShowGotoBar" value="0"><br/><param name="ShowPositionControls" value="-1"><br/><param name="ShowStatusBar" value="-1"><br/><param name="ShowTracker" value="-1"><br/><param name="TransparentAtStart" value="-1"><br/><param name="VideoBorderWidth" value="0"><br/><param name="VideoBorderColor" value="0"><br/><param name="VideoBorder3D" value="0"><br/><param name="Volume" value="70"><br/><param name="WindowlessVideo" value="0"><br/></OBJECT><br/></p><p><font color="#cc3300">RealPlayer 播放器</font><br/><object id=video1 classid=" clasid:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA" <br/>width=320 height=240 align="middle"><br/><param name="controls" value="inagewindow"><br/><param name="console" value="chicp1"><br/><param name="autostar" value="true"><br/><param name="src" value="地址"><br/><embed <br/>src="地址" <br/>type="audio/x-pn-realaudio-plugin" console="chip1" <br/>controls="imagewindow" width=320 height=240 autostart=true align="middle"><br/></embed> <br/></object><br/></p>
作者:
翔羽
时间:
2006-2-24 09:12
<p>1.函数 <strong>array()</strong><br/>功能:创建一个数组变量<br/>格式:array(list)<br/>参数:list 为数组变量中的每个数值列,中间用逗号间隔<br/>例子:<br/><br/>结果: i 被赋予为数组</p><p>2.函数 <strong>Cint()</strong><br/>功能:将一表达式/其它类型的变量转换成整数类型(int)<br/>格式:Cint(expression)<br/>参数:expression 是任何有效的表达式/其它类型的变量<br/>例子:<br/> <br/>结果: 236<br/>函数Cint()将字符"234"转换 成整数234.如果表达式为空, 或者无效时,返回值为0;</p><p>3.函数: <strong>Creatobject()</strong><br/>功能:创建及返回一个ActiveX对象.<br/>格式:Creatobject(obname)<br/>参数
bname 是对象的名称<br/>例子:<br/> <br/>结果:<br/>4.函数 <strong>Cstr()</strong><br/>功能:将一表达式/其它类型的变量转换成字符类型(string)<br/>格式:Cstr(expression)<br/>参数:expression是任何有效的表达式/其它类型的变量<br/>例子:<br/> <br/>结果:函数Cstr()将整数 5 转换 成字符"5".</p><p>5.函数 <strong>Date()</strong><br/>功能:返回当前系统(server端)的日期<br/>格式
ate()<br/>参数:无<br/>例子:<br/>结果:05/10/00</p><p>6.函数<strong> Dateadd()</strong><br/>功能:计算某个指定的时间和<br/>格式:dateadd(timeinterval,number,date)<br/>参数:timeinterval是时间单位(月,日..); number是时间间隔值,date是时间始点.<br/>例子:<br/><br/><br/> <br/>结果:<br/>11/4/99<br/>3:34:45 PM<br/>其中<br/>"m" = "month";<br/>"d" = "day";<br/>如果是currentDate 格式,则,<br/>"h" = "hour"; <br/>"s" = "second"; </p><p>7.函数 <strong>Datediff()</strong><br/>功能:计算某量个指定的时间差<br/>格式:datediff(timeinterval,date1,date2[,firstdayofweek[,firstdayofyear]])<br/>参数:timeinterval 是时间单位; date1,date2是有效的日期表达式,firstdayofweek,firstdayofyear 是任意选项.<br/>例子:<br/> <br/>结果:There are 150 days to millenium from 8/4/99. </p><p>8.函数 <strong>day()</strong><br/>功能:返回一个整数值,对应于某月的某日<br/>格式:day(date)<br/>参数:date是一个有效的日期表达式;<br/>例子:<br/>结果:4</p><p>9.函数 <strong>formatcurrency()</strong><br/>功能:转换成货币格式<br/>格式:formatcurrency(expression [,digit[,leadingdigit[,paren[,groupdigit]]]])<br/>参数:expression 是有效的数字表达式;digit表示小数点后的位数;leadingdigit,paren,groupdigit是任意选项.<br/>例子: <br/>结果
34.35</p>
作者:
翔羽
时间:
2006-2-24 09:12
<p>10.函数 <strong>Formatdatetime()</strong><br/>功能:格式化日期表达式/变量<br/>格式:formatdatetime(date[,nameformat])<br/>参数:date为有效的日期表达式/变量;nameformat是指定的日期格式常量名称.<br/>例子:<br/>结果:Wednesday,August 04,1999<br/><br/><br/>11.函数 <strong>formatnumber()</strong><br/>功能:格式化数字表达式/变量<br/>格式:formatnumbe(expression [,digit[,leadingdigit[,paren[,groupdigit]]]])<br/>参数:express为有效的数字表达式, digit表示小数点后的位数;leadingdigit,paren,groupdigit是任意选项<br/>例子:<br/> <br/>结果: 23.222</p><p>12.函数 <strong>formatpercent()</strong><br/>功能:格式化百分数表达式/变量<br/>格式:formatnumber(expression [,digit [,leading [,paren[,groupdigit]]]])<br/>参数:expression 是有效的数字表达式,digit表示小数点后的位数;leadingdigit,paren,groupdigit是任意选项<br/>例子:<br/> <br/>结果: 45.233</p><p>13.函数:<strong> hour()</strong><br/>功能:返回一个数值,对应于的指定时间.<br/>格式:hour(time)<br/>参数:time对应于的指定时间.<br/>例子:<br/> <br/>结果:16 (24 小时制)</p><p>14.函数<strong> instr()</strong><br/>功能:返回一个数值,对应于某字符(串)在另一字符串中的位置.<br/>格式:instr([start,]strtobesearched,strsearchfor [,compare])<br/>参数:start(任选)是从第start位寻找,strtobesearched 是被搜索的字符串,strsearchfor是被寻找的目标.compare是任意选项<br/>例子:<br/> <br/>结果:9,(字符"a"在strtext字符串的第九位)</p><p>15.函数 <strong>instrrev()</strong><br/>功能:返回一个数值,对应于某字符(串)在另一字符串中的位置(从后面起开始寻找).<br/>格式:instrrev([start,] strtobesearched,strsearchfor[,compare])<br/>参数:参考 instr(),<br/>例子:<br/><br/>结果:13, 字串"s"是strtext的第13个字符(从后面起开始寻找)</p><p>16.函数<strong> int()</strong><br/>功能:数字取整<br/>格式:int(number)<br/>参数:number 是任何有效的数字表达式/其它类型的变量<br/>例子:<br/><br/>结果:322 (如果用Cint()则结果是323)<br/><br/>17.函数 <strong>isarray()</strong><br/>功能:返回一个布尔值,判断变量是否为数组.<br/>格式: isarray(name)<br/>参数:name是变量名称<br/>例子:<br/> <br/>结果:false</p><p>18.函数 <strong>isdate()</strong><br/>功能:返回一个布尔值,判断变量是否为日期变量.<br/>格式:isdate(expression)<br/>参数:expression 是任意的变量.<br/>例子:<br/>结果:true</p><p>19.函数 <strong>isempty()</strong><br/>功能:返回一个布尔值,判断变量是否为空.<br/>格式:isempty(expression)<br/>参数:expression 是任意的变量.<br/>例子:<br/><br/>结果:true</p>
作者:
翔羽
时间:
2006-2-24 09:13
<p>20.函数 <strong>isnull()</strong><br/>功能:返回一个布尔值,判断变量是否包含非法的数据.<br/>格式:isnull(expression)<br/>参数:expression 是任意的变量.<br/>例子:<br/><br/>结果:false</p><p>21.函数 <strong>Isnumeric()</strong><br/>功能:返回一个布尔值,判断变量是否为数字变量,或者是可以转换成数字的其它变量.<br/>格式:isnumeric(expression)<br/>参数:expression 是任意的变量.<br/>例子:<br/> <br/>结果: true.</p><p>22.函数 <strong>Isobject()</strong><br/>功能:返回一个布尔值,判断变量是否为对象的变量,<br/>格式:isobject(expression)<br/>参数:expression 是任意的变量.<br/>例子:<br/> <br/>结果: true</p><p>23.函数: <strong>Lbound()</strong><br/>功能:返回一个数组的下界.<br/>格式
bound(arrayname[,dimension])<br/>参数:arrayname 是数组变量,dimension 是任意项<br/>例子:<br/> <br/>结果:0<br/>24.函数<strong> Lcase()</strong><br/>功能:将一字符类型变量的字符全部变换小写字符.<br/>格式
case(string)<br/>参数:string是字串变量<br/>例子:<br/> <br/>结果:this is lcase!</p><p>25.函数 <strong>left()</strong><br/>功能:截取一个字符串的前部分;<br/>格式:left(string,length)<br/>参数:string字符串,length截取的长度.<br/>例子: <br/>结果:this i</p><p>26.函数 <strong>len()</strong><br/>功能:返回字符串长度或者变量的字节长度<br/>格式:len(string |varname)<br/>参数:string字符串;varname任意的变量名称<br/>例子:<br/><br/>结果:15</p><p>27.函数 <strong>ltrim()</strong><br/>功能:去掉字符串前的空格.<br/>格式:ltrim(string)<br/>参数:string 字串.<br/>例子: <br/>结果:Today</p><p>29.函数<strong> minute()</strong><br/>功能:返回一数值, 表示分钟<br/>格式:minute(time)<br/>参数: time是时间变量<br/>例子:<br/>结果:23</p>
作者:
翔羽
时间:
2006-2-24 09:13
<p>30.函数 <strong>month()</strong><br/>功能:返回一数值, 表示月份<br/>格式:month(time)<br/>参数:time是日期变量<br/>例子:<br/>结果:9</p><p>31.函数 <strong>monthname()</strong><br/>功能:返回月份的字符串(名称).<br/>格式:Monthname(date [,abb])<br/>参数:date是日期变量,abb=true时 则月份的缩写,<br/>例子:<br/> <br/>结果:April<br/>32.函数 <strong>Now()</strong><br/>功能:返回系统的当前时间和日期.<br/>格式:now()<br/>参数:无<br/>例子:<br/> <br/>结果: 05/10/00 8:45:32 pm</p><p>33.函数: <strong>replace()</strong><br/>功能:在字串中查找,替代指定的字串.<br/>格式:replace(strtobesearched,strsearchfor,strreplacewith <br/><br/>[,start[,count[,compare]]])<br/>参数:strtobesearched是字串; strsearchfor是被查找的子字串;strreplacewith <br/><br/>是用来替代的子字串.start,count,compare 是任意选项.<br/>例子:<br/> <br/>结果:this is an orange.</p><p>34.函数<strong> right()</strong><br/>功能:截取一个字符串的后部分<br/>格式:right(string,length)<br/>参数:string字符串,length截取的长度.<br/>例子:<br/> <br/>结果:st!</p><p>35.函数 <strong>rnd()</strong><br/>功能:返回一个随机数值<br/>格式:rnd[(number)]<br/>参数:number是任意数值.<br/>例子:<br/><br/>结果:0/1数值之一,无randomize(), 则不能产生随机数.<br/>36.函数round()<br/>功能:完整数值<br/>格式:round(expression[,numright])<br/>参数:expression数字表达式;numright任意选项.<br/>例子:<br/><br/>结果: 12<br/>37.函数 <strong>rtrim()</strong><br/>功能:去掉字符串后的空格.<br/>格式:rtrim(string)<br/>参数:string 是字串<br/>例子:<br/> <br/>结果:this is a test!</p><p>38.函数 <strong>second()</strong><br/>功能:返回一个整数值.<br/>格式:second(time)<br/>参数:time是一个有效的时间表达式;<br/>例子:<br/>结果:30</p>
作者:
翔羽
时间:
2006-2-24 09:14
<p>39.函数 <strong>strReverse()</strong><br/>功能:返回与原字串排列逆向的字串.<br/>格式:strreverse(string)<br/>参数:string是字串<br/>例子:</p><hr/><p>下面为带例子的:</p><p>Array() <br/>FUNCTION: 返回一个数组 <br/>SYNTAX: Array(list) <br/>ARGUMENTS: 字符,数字均可 <br/>EXAMPLE: <%<br/>Dim myArray()<br/>For i = 1 to 7<br/>Redim Preserve myArray(i)<br/>myArray(i) = WeekdayName(i)<br/>Next<br/>%> <br/>RESULT: 建立了一个包含7个元素的数组myArray<br/>myArray("Sunday","Monday", ... ... "Saturday") <br/><br/>CInt() <br/>FUNCTION: 将一个表达式转化为数字类型 <br/>SYNTAX: CInt(expression) <br/>ARGUMENTS: 任何有效的字符均可 <br/>EXAMPLE: <%<br/>f = "234"<br/>response.write cINT(f) + 2<br/>%> <br/>RESULT: 236<br/>转化字符"234"为数字"234",如果字符串为空,则返回0值 <br/><br/>CreateObject() <br/>FUNCTION: 建立和返回一个已注册的ACTIVEX组件的实例。 <br/>SYNTAX: CreateObject(objName) <br/>ARGUMENTS: objName 是任何一个有效、已注册的ACTIVEX组件的名字. <br/>EXAMPLE: <%<br/>Set con = Server.CreateObject("ADODB.Connection")<br/>%> <br/>RESULT: <br/><br/>CStr() <br/>FUNCTION: 转化一个表达式为字符串. <br/>SYNTAX: CStr(expression) <br/>ARGUMENTS: expression 是任何有效的表达式。 <br/>EXAMPLE: <%<br/>s = 3 + 2<br/>response.write "The result is: " & cStr(s)<br/>%> <br/>RESULT: 转化数字“5”为字符“5”。 <br/><br/>Date() <br/>FUNCTION: 返回当前系统日期. <br/>SYNTAX: Date() <br/>ARGUMENTS: None. <br/>EXAMPLE: <%=Date%> <br/>RESULT: 8/4/99 <br/><br/>DateAdd() <br/>FUNCTION: 返回一个被改变了的日期。 <br/>SYNTAX: DateAdd(timeinterval,number,date) <br/>ARGUMENTS: timeinterval is the time interval to add; number is amount of <br/>time intervals to add; and date is the starting date. <br/>EXAMPLE: <%<br/>currentDate = #8/4/99#<br/>newDate = DateAdd("m",3,currentDate)<br/>response.write newDate<br/>%></p><p><%<br/>currentDate = #12:34:45 PM#<br/>newDate = DateAdd("h",3,currentDate)<br/>response.write newDate<br/>%> <br/>RESULT: 11/4/99<br/>3:34:45 PM</p><p>"m" = "month";<br/>"d" = "day";</p><p>If currentDate is in time format then,<br/>"h" = "hour"; <br/>"s" = "second"; <br/><br/>DateDiff() <br/>FUNCTION: 返回两个日期之间的差值 。 <br/>SYNTAX: DateDiff(timeinterval,date1,date2 [, firstdayofweek ][, <br/>firstweekofyear]]) <br/>ARGUMENTS: timeinterval 表示相隔时间的类型,如“M“表示“月”。 <br/>EXAMPLE: <%<br/>fromDate = #8/4/99#<br/>toDate = #1/1/2000#<br/>response.write "There are " & _<br/>DateDiff("d",fromDate,toDate) & _<br/>" days to millenium from 8/4/99."<br/>%> <br/>RESULT: 从8/4/99 到2000年还有 150 天. <br/><br/>Day() <br/>FUNCTION: 返回一个月的第几日 . <br/>SYNTAX: Day(date) <br/>ARGUMENTS: date 是任何有效的日期。 <br/>EXAMPLE: <%=Day(#8/4/99#)%> <br/>RESULT: 4 <br/><br/>FormatCurrency() <br/>FUNCTION: 返回表达式,此表达式已被格式化为货币值 <br/>SYNTAX: FormatCurrency(Expression [, Digit ][, LeadingDigit ][, Paren ][, <br/>GroupDigit]]]]) <br/>ARGUMENTS: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是<br/>计算机的区域设置; LeadingDigit 三态常数,指示是否显示小数值小数点前面的<br/>零。 <br/>EXAMPLE: <%=FormatCurrency(34.3456)%> <br/>RESULT: $34.35 <br/><br/>FormatDateTime() <br/>FUNCTION: 返回表达式,此表达式已被格式化为日期或时间 <br/>SYNTAX: FormatDateTime(Date, [, NamedFormat]) <br/>ARGUMENTS: NamedFormat 指示所使用的日期/时间格式的数值,如果省略,则使用 <br/>vbGeneralDate. <br/>EXAMPLE: <%=FormatDateTime("08/4/99", vbLongDate)%> <br/>RESULT: Wednesday, August 04, 1999 <br/></p>
作者:
翔羽
时间:
2006-2-24 09:14
FormatNumber() <br/>FUNCTION: 返回表达式,此表达式已被格式化为数值. <br/>SYNTAX: FormatNumber(Expression [, Digit ][, LeadingDigit ][, Paren ][, <br/>GroupDigit]]]]) <br/>ARGUMENTS: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是<br/>计算机的区域设置。; LeadingDigit i指示小数点右侧显示位数的数值。默认值为 -<br/>1,指示使用的是计算机的区域设置。; Paren 指示小数点右侧显示位数的数值。默认<br/>值为 -1,指示使用的是计算机的区域设置。; GroupDigit i指示小数点右侧显示位数<br/>的数值。默认值为 -1,指示使用的是计算机的区域设置。. <br/>EXAMPLE: <%=FormatNumber(45.324567, 3)%> <br/>RESULT: 45.325 <br/><br/>FormatPercent() <br/>FUNCTION: 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 <br/>100 )。 (%) <br/>SYNTAX: FormatPercent(Expression [, Digit ][, LeadingDigit ][, Paren ][, <br/>GroupDigit]]]]) <br/>ARGUMENTS: 同上. <br/>EXAMPLE: <%=FormatPercent(0.45267, 3)%> <br/>RESULT: 45.267% <br/><br/>Hour() <br/>FUNCTION: 以24时返回小时数. <br/>SYNTAX: Hour(time) <br/>ARGUMENTS: <br/>EXAMPLE: <%=Hour(#4:45:34 PM#)%> <br/>RESULT: 16<br/>(Hour has been converted to 24-hour system) <br/><br/>Instr() <br/>FUNCTION: 返回字符或字符串在另一个字符串中第一次出现的位置. <br/>SYNTAX: Instr([start, ] strToBeSearched, strSearchFor [, compare]) <br/>ARGUMENTS: Start为搜索的起始值,strToBeSearched接受搜索的字符串 <br/>strSearchFor要搜索的字符.compare比较方式(详细见ASP常数) <br/>EXAMPLE: <%<br/>strText = "This is a test!!"<br/>pos = Instr(strText, "a")<br/>response.write pos<br/>%> <br/>RESULT: 9 <br/><br/>InstrRev() <br/>FUNCTION: 同上,只是从字符串的最后一个搜索起 <br/>SYNTAX: InstrRev([start, ] strToBeSearched, strSearchFor [, compare]) <br/>ARGUMENTS: 同上. <br/>EXAMPLE: <%<br/>strText = "This is a test!!"<br/>pos = InstrRev(strText, "s")<br/>response.write pos<br/>%> <br/>RESULT: 13<p><br/>Int() <br/>FUNCTION: 返回数值类型,不四舍五入,注意取值是不大于它的整数。 <br/>SYNTAX: Int(number) <br/>ARGUMENTS: <br/>EXAMPLE: <%=INT(32.89)%> <%=int(-3.33)%><br/>RESULT: 32 -4<br/><br/>IsArray() <br/>FUNCTION: 判断一对象是否为数组,返回布尔值 . <br/>SYNTAX: IsArray(name) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = "Test!"<br/>response.write IsArray(strTest)<br/>%> <br/>RESULT: False <br/><br/>IsDate() <br/>FUNCTION: 判断一对象是否为日期,返回布尔值 <br/>SYNTAX: IsDate(expression) <br/>ARGUMENTS: expression is any valid expression. <br/>EXAMPLE: <%<br/>strTest = "8/4/99"<br/>response.write IsDate(strTest)<br/>%> <br/>RESULT: True <br/><br/>IsEmpty() <br/>FUNCTION: 判断一对象是否初始化,返回布尔值. <br/>SYNTAX: IsEmpty(expression) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>Dim i<br/>response.write IsEmpty(i)<br/>%> <br/>RESULT: True <br/></p>
作者:
翔羽
时间:
2006-2-24 09:15
IsNull() <br/>FUNCTION: 判断一对象是否为空,返回布尔值. <br/>SYNTAX: IsNull(expression) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>Dim i<br/>response.write IsNull(i)<br/>%> <br/>RESULT: False <br/><br/>IsNumeric() <br/>FUNCTION: 判断一对象是否为数字,返回布尔值. <br/>SYNTAX: IsNumeric(expression) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>i = "345"<br/>response.write IsNumeric(i)<br/>%> <br/>RESULT: True<br/>就算数字加了引号,ASP还是认为它是数字。 <br/><br/>IsObject() <br/>FUNCTION: 判断一对象是否为对象,返回布尔值. <br/>SYNTAX: IsObject(expression) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>Set con = Server.CreateObject("ADODB.Connection")<br/>response.write IsObject(con)<br/>%> <br/>RESULT: True <br/><br/>LBound() <br/>FUNCTION: 返回指定数组维的最小可用下标. <br/>SYNTAX: Lbound(arrayname [, dimension]) <br/>ARGUMENTS: ; dimension 指明要返回哪一维下界的整数。使用 1 表示第一维,2 <br/>表示第二维,以此类推。如果省略 dimension 参数,默认值为 1. <br/>EXAMPLE: <%<br/>i = Array("Monday","Tuesday","Wednesday")<br/>response.write LBound(i)<br/>%> <br/>RESULT: 0 <br/><br/>LCase() <br/>FUNCTION: 返回字符串的小写形式 <br/>SYNTAX: Lcase(string) <br/>ARGUMENTS: string is any valid string expression. <br/>EXAMPLE: <%<br/>strTest = "This is a test!"<br/>response.write LCase(strTest)<br/>%> <br/>RESULT: this is a test! <br/><br/>Left() <br/>FUNCTION: 返回字符串左边第length个字符以前的字符(含第length个字符). <br/>SYNTAX: Left(string, length) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = "This is a test!"<br/>response.write Left(strTest, 3)<br/>%> <br/>RESULT: Thi <br/><br/>Len() <br/>FUNCTION: 返回字符串的长度. <br/>SYNTAX: Len(string | varName) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = "This is a test!"<br/>response.write Len(strTest)<br/>%> <br/>RESULT: 15 <br/><br/>LTrim() <br/>FUNCTION: 去掉字符串左边的空格. <br/>SYNTAX: LTrim(string) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = " This is a test!"<br/>response.write LTrim(strTest)<br/>%> <br/>RESULT: This is a test! <br/>
作者:
翔羽
时间:
2006-2-24 09:15
Mid() <br/>FUNCTION: 返回特定长度的字符串(从start开始,长度为length). <br/>SYNTAX: Mid(string, start [, length]) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = "This is a test! Today is Monday."<br/>response.write Mid(strTest, 17, 5)<br/>%> <br/>RESULT: Today <br/><br/>Minute() <br/>FUNCTION: 返回时间的分钏. <br/>SYNTAX: Minute(time) <br/>ARGUMENTS: <br/>EXAMPLE: <%=Minute(#12:45:32 PM#)%> <br/>RESULT: 45 <br/><br/>Month() <br/>FUNCTION: 返回日期. <br/>SYNTAX: Month(date) <br/>ARGUMENTS: date is any valid date expression. <br/>EXAMPLE: <%=Month(#08/04/99#)%> <br/>RESULT: 8 <br/><br/>MonthName() <br/>FUNCTION: Returns a string identifying the specified month. <br/>SYNTAX: MonthName(month, [, Abb]) <br/>ARGUMENTS: month is the numeric representation for a given month; Abb <br/>(optional) is a boolean value used to display month abbreviation. True <br/>will display the abbreviated month name and False (default) will not show <br/>the abbreviation. <br/>EXAMPLE: <%=MonthName(Month(#08/04/99#))%> <br/>RESULT: August <br/><br/>Now() <br/>FUNCTION: Returns the current system date and time. <br/>SYNTAX: Now() <br/>ARGUMENTS: None <br/>EXAMPLE: <%=Now%> <br/>RESULT: 8/4/99 9:30:16 AM <br/><br/>Replace() <br/>FUNCTION: Returns a string in which a specified sub-string has been <br/>replaced with another substring a specified number of times. <br/>SYNTAX: Replace(strToBeSearched, strSearchFor, strReplaceWith [, start <br/>][, count ][, compare]]]) <br/>ARGUMENTS: strToBeSearched is a string expression containing a sub-<br/>string to be replaced; strSearchFor is the string expression to search for <br/>within strToBeSearched; strReplaceWith is the string expression to replace <br/>sub-string strSearchFor; start (optional) is the numeric character <br/>position to begin search; count (optional) is a value indicating the <br/>comparision constant. <br/>EXAMPLE: <% <br/>strTest = "This is an apple!"<br/>response.write Replace(strTest, "apple", "orange")<br/>%> <br/>RESULT: This is an orange! <br/><br/>Right() <br/>FUNCTION: 返回字符串右边第length个字符以前的字符(含第length个字符). <br/>SYNTAX: Right(string, length) <br/>ARGUMENTS: . <br/>EXAMPLE: <% <br/>strTest = "This is an test!"<br/>response.write Right(strTest, 3)<br/>%> <br/>RESULT: st! <br/><br/>Rnd() <br/>FUNCTION: 产生一个随机数. <br/>SYNTAX: Rnd [ (number) ] <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>Randomize()<br/>response.write RND()<br/>%> <br/>RESULT: 任何一个在0 到 1 之间的数 <br/><br/>Round() <br/>FUNCTION: 返回按指定位数进行四舍五入的数值. <br/>SYNTAX: Round(expression [, numRight]) <br/>ARGUMENTS: numRight数字表明小数点右边有多少位进行四舍五入。如果省略,则 <br/>Round 函数返回整数. <br/>EXAMPLE: <%<br/>i = 32.45678<br/>response.write Round(i)<br/>%> <br/>RESULT: 32 <br/><br/>Rtrim() <br/>FUNCTION: 去掉字符串右边的字符串. <br/>SYNTAX: Rtrim(string) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = "This is a test!! "<br/>response.write RTrim(strTest)<br/>%> <br/>RESULT: This is a test!! <br/>
作者:
翔羽
时间:
2006-2-24 09:15
Second() <br/>FUNCTION: 返回秒. <br/>SYNTAX: Second(time) <br/>ARGUMENTS: . <br/>EXAMPLE: <%=Second(#12:34:28 PM#)%> <br/>RESULT: 28 <br/><br/>StrReverse() <br/>FUNCTION: 反排一字符串 <br/>SYNTAX: StrReverse(string) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = "This is a test!!"<br/>response.write StrReverse(strTest)<br/>%> <br/>RESULT: !!tset a si sihT <br/><br/>Time() <br/>FUNCTION: 返回系统时间. <br/>SYNTAX: Time() <br/>ARGUMENTS: . <br/>EXAMPLE: <%=Time%> <br/>RESULT: 9:58:28 AM <br/><br/>Trim() <br/>FUNCTION: 去掉字符串左右的空格. <br/>SYNTAX: Trim(string) <br/>ARGUMENTS: string is any valid string expression. <br/>EXAMPLE: <%<br/>strTest = " This is a test!! "<br/>response.write Trim(strTest)<br/>%> <br/>RESULT: This is a test!! <br/><br/>UBound() <br/>FUNCTION: 返回指定数组维数的最大可用下标. <br/>SYNTAX: Ubound(arrayname [, dimension]) <br/>ARGUMENTS: ; dimension (optional) 指定返回哪一维上界的整数。1 表示第一<br/>维,2 表示第二维,以此类推。如果省略 dimension 参数,则默认值为 1. <br/>EXAMPLE: <%<br/>i = Array("Monday","Tuesday","Wednesday")<br/>response.write UBound(i)<br/>%> <br/>RESULT: 2 <br/><br/>UCase() <br/>FUNCTION: 返回字符串的大写形式. <br/>SYNTAX: UCase(string) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>strTest = "This is a test!!"<br/>response.write UCase(strTest)<br/>%> <br/>RESULT: THIS IS A TEST!! <br/><br/>VarType() <br/>FUNCTION: 返回指示变量子类型的值 <br/>SYNTAX: VarType(varName) <br/>ARGUMENTS: <br/>EXAMPLE: <%<br/>i = 3<br/>response.write varType(i)<br/>%> <br/>RESULT: 2(数字)详见"asp常数" <br/><br/>WeekDay() <br/>FUNCTION: 返回在一周的第几天. <br/>SYNTAX: WeekDay(date [, firstdayofweek]) <br/>ARGUMENTS: . <br/>EXAMPLE: <%<br/>d = #8/4/99#<br/>response.write Weekday(d)<br/>%> <br/>RESULT: 4(星期三) <br/><br/>WeekDayName() <br/>FUNCTION: 返回一周第几天的名字. <br/>SYNTAX: WeekDayName(weekday [, Abb ][, firstdayofweek]]) <br/>ARGUMENTS: Abb可选。Boolean 值,指明是否缩写表示星期各天的名称。如果省<br/>略, 默认值为 False,即不缩写星期各天的名称.firstdayofweek指明星期第一天的<br/>数值 <br/>EXAMPLE: <%<br/>d = #8/4/99#<br/>response.write WeekdayName(Weekday(d))<br/>%> <br/>RESULT: Wednesday <br/><br/>Year() <br/>FUNCTION: 返回当前的年份. <br/>SYNTAX: Year(date) <br/>ARGUMENTS: <br/>EXAMPLE: <%=Year(#8/4/99#)%> <br/>RESULT: 1999
作者:
翔羽
时间:
2006-2-24 09:15
<p><strong>ASP数据库语法总结</strong></p><hr/><p>经常使用到有关数据库的操作。包括连接代码、SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻去。一些比较少用的数据库还不一定能顺利找到,所以现在把它们全归纳到这里,提供大家参考。(个人水平有限,有缺陷之处,欢迎大家指正。)</p><p><一>。数据库的连接方法:</p><p>1.Access数据库的DSN-less连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adoconn.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ="& _<br/>Server.MapPath("数据库所在路径")</p><p>2.Access OLE DB连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"
rovider=Microsoft.Jet.OLEDB.4.0;"& _<br/>"Data Source=" & Server.MapPath("数据库所在路径")</p><p>3.SQL server连接方法:</p><p>set adocon=server.createobject("adodb.recordset")<br/>adocon.Open"Driver={SQL Server};Server=(Local);UID=***
WD=***;"& _<br/>"database=数据库名;"</p><p>4.SQL server OLE DB连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"provider=SQLOLEDB.1;Data Source=RITANT4;"& _<br/>"user ID=***
assword=***;"& _<br/>"inital Catalog=数据库名"</p><p>5.Oracle 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"</p><p>6.Oracle OLE DB 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"
rovider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"</p><p>7.dBase 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"</p><p>8.mySQL 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"</p><p>9.Visual Foxpro 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"</p><p>10.MS text 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;"&_<br/>"extensions=asc,csv,tab,txt
ersist SecurityInfo=false;"</p><p>11.MS text OLE DB 连接方法:</p><p>set adocon=Server.Createobject("adodb.connection")<br/>adocon.open"
rovider=microsof.jet.oledb.4.0;data source=your_path;"&_<br/>"Extended Properties'text;FMT=Delimited'"</p>
作者:
翔羽
时间:
2006-2-24 09:16
<p><二>。常用的四种SQL命令:</p><p>1.查询数据记录(Select)<br/>语法:Select 字段串行 From table Where 字段=内容<br/>例子:想从book表中找出作者为"cancer"的所有记录,SQL语句便如下:<br/>select * from book where author=’cancer’<br/>"*"是取出book表所有的字段,如查询的字段值为数字,则其后的"内容"便无须加上单引号,</p><p>如是日期,则在Access中用(#)包括,而在SQL server中则用(’)包括,<br/>如:</p><p>select * from book where id=1<br/>select * from book where pub_date=#2002-1-7# (Access)<br/>select * from book where pub_date=’2002-1-7’ (SQL Server)</p><p>提示:<br/>日期函数to_date不是标准sql文,不是所有的数据库适用,所以大家在使用的时候要参考数据库具体语法</p><p>另外如果是查询传入的变量,则如下:</p><p>strau=request.form("author")<br/>strsql="select * from book where author=’"&strau&"’"</p><p>如果查询的是数字,则:</p><p>intID=request.form("id")<br/>strsql="select * from book where id="&intID</p><p>在很多数据库中,如:oracle,上面的语句是可以写成:<br/>strsql="select * from book where id='"&intID&"'"的。<br/>但是字符型一定不能按照数字格式写,需要注意。</p><p>2.添加记录(Insert)<br/>语法:Insert into table(field1,field2,....) Values (value1,value2,....)<br/>例子:添加一作者是"cancer"的记录入book表:<br/>insert into book (bookno,author,bookname) values (’CF001’,’cancer’,’Cancer无组件上传程序’)<br/>同样,如果用到变量就如下:</p><p>strno=request.form("bookno")<br/>strau=request.form("author")<br/>strname=request.form("bookname")<br/>strsql="insert into book (bookno,author,bookname) values (’"&strno&"’,’"&strau&"’,’"&strname&"’)"</p><p>3.用Recordset对象的Addnew插入数据的方法:<br/>语法:</p><p>rs.addnew<br/>rs("field1").value=value1<br/>rs("field2").value=value2<br/>...<br/>rs.update</p><p>4.修改数据记录(Update)<br/>语法:update table set field1=value1,field2=value2,...where fieldx=valuex<br/>例子:update book set author=’babycrazy’ where bookno=’CF001’<br/>如果用到变量就如下:</p><p>strno=request.form("bookno")<br/>strau=request.form("author")<br/>strsql="update book set author=’"&strau&"’ where bookno=’"&strno"’"</p><p>5.Recordset对象的Update方法:<br/>语法:</p><p>rs("field1").value=value1<br/>rs("field2").value=value2<br/>...<br/>rs.update</p><p>注意:使用语法3和语法5的时候,一定要注意字段的类型(尤其是日期型)一致,否则出错的几率非常的高。</p><p><br/>例子:</p><p>strno=request.form("bookno")<br/>strau=request.form("author")<br/>set adocon=server.createobject("adodb.connection")<br/>adocon.open "Driver={Microsoft Access Driver(*.mdb)};DBQ=" & _<br/>Server.Mappath=("/cancer/cancer.mdb")<br/>strsql="select * from book where bookno=’"&strno&"’"<br/>set rs=server.createobject("adodb.recordset")<br/>rs.open strsql,adconn,1,3<br/>if not rs.eof then ’如果有此记录的话<br/>rs("author").value=strau<br/>rs.update<br/>end if<br/>rs.close<br/>set rs=nothing<br/>adocon.close<br/>set adocon=nothing</p>
作者:
翔羽
时间:
2006-2-24 09:16
<p>6.删除一条记录(Delete)<br/>语法:Delete table where field=value<br/>例子:删除book表中作者是cancer的记录</p><p>delete book where author=’cancer’</p><p>(注意:如果book表中author字段的值为cancer的记录有多条,将会删除所有author为cancer的记录)</p><p>好了,学会了用这些操作,大家在用asp操作数据库的时候,该是没有什么问题了。</p>
作者:
翔羽
时间:
2006-2-24 09:16
<p><strong>ASP的对象结构 </strong></p><p>现在我们要系统地了解一下ASP的对象结构,然后,大家就可以举一反三,不用我过多解释每一个例子了。这一部分,可能有些困难。</p><hr/><p> <strong> 一、Request</strong><br/> Request对象把客户信息保存在几个集合中,供ASP应用使用。通用的访问方法为:Request.Collection("membername")<br/> 当你不指定集合名时,以(1)QueryString,(2)Form,(3)Cookie和(4)ServerVariable<br/>的顺序搜索所有集合,当发现第一个匹配的变量时,就认定他是要引用的成员。当然,为了提高效率,你最好显式指定是那个集合中的成员。<br/> QueryString集合<br/> 当HTML表单使用GET方法向ASP文件传递数据时,数据被保存在集合QueryString中。其成员可以具有与之相关的多个值,也就是说,同一个表单中,多个元素可以有相同的名字,下面的代码访问这些数据:<br/><%For each item in Request.QueryString("Name")<br/>Response.write Item &"<br>"<br/>Next %><br/> Form集合<br/> 当表单用POST方法时,数据被保存在Form集合中。<br/> ServerVariable集合<br/> 保存了随HTTP请求一起传送HTTP头的信息,可以通过他获取有关浏览器的信息,主要成员有:<br/>REMOTE_ADDR 远程主机IP地址<br/>REMOTE_HOST 远程主机名称<br/>REMOTE_USER 客户名称<br/>REQUEST_METHOD 请求方法(如POST,GET,HEAD)<br/>SERVER_NAME 服务器名<br/>SERVER_PROTOCOL 服务器版本号(如HTTP/1。0)</p><p> <strong>二、Response对象</strong><br/> 用来控制向客户返回的HTML的内容,有若干属性和方法。下面介绍我认为重要的:<br/> Buffer属性<br/> 如果为True,则Response的内容要写入缓冲区,当脚本处理完时再发给客户。<br/> Status属性<br/>传递HTTP Response报文的状态。服务器返回的状态代码由三位数字组成,可以用于测试阶段和转换控制到其他站点(即Forward)<br/> Write方法<br/> 向客户输出HTML,可以是任何合法的HTML脚本。<br/> Redirect方法<br/> 使浏览器重新定向到另外一个URL上,如:<br/><%browsetype=Request.ServerVariables("HTTP_USER_AGENT")<br/>IF Left(browsetype,11)="Mozilla/2.0" then<br/>Response.Redirect "FancyStart.asp"<br/>Else<br/>Response.Redirect "OldStart.asp"<br/>End if%><br/> Clear方法<br/> 如果设Buffer属性为True,则Clear方法清楚所有缓冲区内容。<br/> Flush方法<br/> 将缓冲内容立即发送给客户。<br/> End方法<br/> 当Active Server遇到该方法时,立即停止处理ASP文件,如果有缓冲,立即发送内容到客户。<br/> BinaryWrite方法<br/> 输出二进制数据</p><p> <strong>三、Request对象和Response对象的Cookies集合</strong><br/> 1.写入Cookies<br/> Response.Cookies("Cookie名称")[("键名称").属性]=值<br/> 如果该Cookie已经存在,则值被新值替代,否则,创建该cookie<br/> 例如:<br/><% Response.Cookies("NewCookie")="New Cookie Value" %><br/> 2.读取Cookies<br/> 如:<br/><%=Request.Cookies("NewCookie")%><br/> Cookie还有一些属性,请参见有关资料。</p>
作者:
翔羽
时间:
2006-2-24 09:16
<strong>四、Application对象<br/></strong> Active Server应用程序是虚拟目录及其子目录下的所有文件,即一个WEB。可以使用Application对象在应用软件的所有用户中共享信息,并可以在服务器运行期间持久地保存数据。他有一些控制访问应用层数据的方法和事件。<br/> Application本身没有内置属性,可以有用户定义:Application("属性名")=值<br/> 保存在Application对象中的数据可以被Application的所有用户读取。如用来做访问记数:Application("aVisits")=Application("aVisits")+1<br/> 方法有两个:<br/> Lock:<br/> 当用户调用Lock时,只有当前用户能够编辑或增加Application对象的属性。<br/> Unlock:<br/> 一定要记住,调用了Lock,完成时一定要调用Unlock.<br/> 事件也有两个:<br/> Application_OnStart事件:应用程序启动时调用。<br/> Application_OnStart事件:应用程序终止时调用。<br/> 这两个事件再加上Session的两个事件的处理程序都放在文件Global.asp中,一个Web应用只有一个Global.asa文件,且放在该应用的根目录下。一个Global.asp文件的例子如下:<br/><Script Language="VBScript" Runat="Server"><br/>Sub Application_OnStart<br/>Dim laChats(15)<br/>Application("gaChats")=maChats<br/>Application("giCounter")=0<br/>End Sub<p> <strong>五、Session对象</strong><br/>Active Server使用会话设置为使用应用程序的单个用户持久保持数据。当用户请求Active Server应用程序中ASP文件的URL时,要启动Session。在缺省情况下,如果没有用户请求,则服务器只保留Session20分钟。用户也可以通过设Session的属性TimeOut来改变。或显示地调用Session.Abandon方法来释放Session对象。<br/> SessionID属性<br/> 唯一标识一个会话的标识符。<br/> TimeOut属性<br/> 定义Session保留的时限,单位为分钟,如Session.TimeOut=10<br/> 像Application一样,Session也可由用户来定义属性。<br/> Session的唯一方法是Abandon,用来取消用户的Session对象,并释放其占用的服务器资源。如:<%Session.Abandon%><br/> 事件有Session_OnStart和Session_OnEnd,其处理程序应放在文件Glabal.asa中。</p><p> <strong>六、Server对象</strong><br/> 1.HTMLEncode方法<br/> 对特定的字符串进行HTML编码,如你本来要显示下列内容:<br/>The Underline tag(<u></u>) is used to underline the surrounded text.<br/> 但很可能实际显示成:<br/>The Underline tag() is used to underline the surrounded text.<br/> 为了避免这种情况,可以调用Server对象的HTMLEncode方法,如:<br/><%<br/>Response.Write Server.HTMLEncode("The Underline tag(<U></U>) is used to underline the surrounded text.")<br/>%><br/> 2.URLEncode方法<br/> 根据URL规则对字符串进行编码。当字符串数据以URL格式传递到服务器时,串中间不能有空格,不能有特殊字符,这时,你就必须用URL编码。<br/> 3.CreateObject方法<br/> 用于创建已注册到服务器机器上的ActiveX组件例程,这恐怕是最重要的一个方法了:<br/> 句法如下:<br/>Server.CreateObject("ComponentName")<br/> 可以作为例程启动的组件可以是ActiveX能够使用的所有内置组件,实际上是存在于服务器上的任何ActiveX组件。比如,要使用金融计算,步骤如下:<br/> 1.创建对象<br/><%<br/>set x=server.createobject("extend.financial");<br/>%><br/> 2.调用对象的方法<br/><%<br/>set x=server.createobject("extend.financial")<br/>response.write Format(x.futval(.07/12,200,-500),"###,###,##0.00")<br/>%><br/> 3.释放例程<br/><%<br/>set x=Nothing<br/>%></p><p> <strong>七、FileSystem和TextStream对象</strong><br/> FileSystem和TextStream对象可用于建立对文件系统的访问,并提供顺序访问文件的机制。FileSystem没有属性,只有两个方法,第一个方法是CreateTextFile方法,可以在宿主机上创建新的文本文件,并返回TextStream对象以提供对新创建文件的访问机制。第二个是OpenTextFile方法,用于打开文本文件供顺序访问并返回一个TextStream对象。如:</p><p><%<br/>set fsFilesys=CreateObject("Scripting.FileSystemObject")<br/>set tsCoffee=fsFilesys.CreateTextFile("c:\coffe.txt",True)<br/>tsCoffee.WriteLine("Man,I Could use some coffee.")<br/>tsCoffee.Close<br/>%><br/> TextStream对象的使用有:<br/> AtEndOfLine:如果文件当前字符处在行的末尾则返回true<br/> AtEndOfScreen:如果当前字符在文件的末尾则返回true<br/> Column:返回当前字符的列号<br/> Line:返回当前字符的行号<br/> TextStream对象的方法为:<br/> Close:关闭并释放TextStream对象<br/> Read:从一个文件中读取给定个数的字符到一个变量中<br/> ReadAll:读取文件的全部内容到一个变量中<br/> ReadLine:读取给定行号的内容到一个变量中<br/> Skip:跳过给定个数的字符<br/> SkipLine:跳过给顶的行书<br/> Write:写如字符串<br/> WriteLine:写入以换行结束的字符串<br/> WriteBlankLines:写入给顶数量的空格<br/></p>
作者:
翔羽
时间:
2006-2-24 09:17
<p><strong>asp内置对象 server 详解</strong></p><p></p><hr/><p>Server 对象:</p><p>Server 对象提供对服务器上的方法和属性的访问。其中大多数方法和属性是作为实用程序的功能服务的。</p><p>语法 </p><p>Server.property|method</p><p>属性</p><p>ScriptTimeout:<br/>ScriptTimeout 属性指定脚本在结束前最大可运行多长时间。 当处理服务器组件时,超时限制将不再生效。 </p><p>语法 Server.ScriptTimeout = NumSeconds</p><p>参数 NumSeconds <br/>指定脚本在被服务器结束前最大可运行的秒数。默认值为 90 秒。 </p><p>注释<br/>通过使用元数据库中的AspScriptTimeout属性可以为 Web 服务或 Web 服务器设置缺省的ScriptTimeout值。ScriptTimeout属性不能设置为小于在元数据库中指定的值。例如,如果NumSeconds设置为10,而元数据库设置包含了默认值90秒,则脚本在90秒后超时。但如果NumSeconds设置为100,则脚本在100秒后超时。</p><p>关于使用元数据库的详细信息,参阅 关于元数据库。</p><p>示例 以下示例中,如果服务器处理脚本超过 100 秒,将使之超时。<br/><% Server.ScriptTimeout = 100 %><br/>以下示例获取 ScriptTimeout 属性当前值,并将其存储在变量 TimeOut 中。<br/><% TimeOut = Server.ScriptTimeout %></p><p>方法</p><p>CreateObject <br/>CreateObject 方法创建服务器组件的实例。如果该组件执行了 OnStartPage 和 OnEndPage 方法,则此时就会调用 OnStartPage 方法。有关服务器组件的详细信息,请参阅 可安装的 ASP 组件 。</p><p>语法 Server.CreateObject( progID )</p><p>参数 progID 指定要创建的对象的类型。progID 的格式为 [Vendor.] component[.Version]。</p><p>注释 默认情况下,由 Server.CreateObject 方法创建的对象具有页作用域。这就是说,再当前 ASP 页处理完成之后,服务器将自动破坏这些对象。要创建有会话或应用程序作用域的对象,可以使用 <OBJECT> 标记并设置 SESSION 或 APPLICATION 的 SCOPE 属性,也可以在对话及应用程序变量中存储该对象。<br/>例如,在如下所示的脚本中,当 Session 对象被破坏,即当对话超时时或 Abandon 方法被调用时,存储在会话变量中的对象也将被破坏。<br/><% Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%><br/>可以通过将变量设置为 Nothing 或新的值来破坏对象,如下所示。第一个例子释放 ad 对象,第二个例子用字串代替 ad 。<br/><% Session ("ad") = Nothing %><br/><% Session ("ad") = " Other Valum " %><br/>不能创建与内建对象同名的对象实例。 例如,下列脚本将返回错误。<br/><% Set Response = Server.CreateObject("Response") %> </p><p>示例 <% Set MyAd = Server.CreateObject("MSWC.AdRotator") %> <br/>上面的例子创建一个名为 MyAd 的 MSWC.AdRotator 服务器组件,MSWC.AdRotator 组件可用于在 Web 页上的自动轮换广告。<br/>关于服务器组件的详细信息, 请参阅 Creating Components for ASP.</p><p>HTMLEncode HTMLEncode方法对指定的字符串应用 HTML 编码。 </p><p>语法 Server.HTMLEncode( string )</p><p>参数 string 指定要编码的字符串。 </p><p>示例脚本 <%= Server.HTMLEncode("The paragraph tag: <
>") %> </p><p>输出 The paragraph tag: &lt
&gt; </p><p>注意 以上输出将被 Web 浏览器显示为The paragraph tag: <
>如果查看一下源文件或以文本方式打开一个 Web 页,您就可以看到已编码的 HTML。<br/></p>
作者:
翔羽
时间:
2006-2-24 09:17
<p><strong>asp内置对象 ObjectContext 详解</strong></p><p></p><hr/><p>您可以使用 ObjectContext 对象提交或放弃一项由 Microsoft Transaction Server (MTS) 管理的事务,它由 ASP 页包含的脚本初始化。 </p><p>ASP 包含 @TRANSACTION 指令时,该页会在事务中运行,直到事务成功或失败后才会终止。 </p><p>语法<br/>ObjectContext.method</p><p>方法<br/>SetComplete SetComplete 方法声明脚本不了解事务未完成的原因。如果事务中的所有组件都调用 SetComplete,事务将完成。 <br/>SetAbort SetAbort 方法声明被脚本初始化的事务未完成,无法更新源。 </p><p><br/>事件<br/>OnTransactionCommit <br/>OnTransactionAbort </p><p><br/>注释<br/>ObjectContext 实现 MTS ObjectContext 对象的两种方法。 SetAbort 方法完全终止事务。这样,MTS 不更新在第一阶段联系的源。事务终止时,将处理脚本的 OnTransactionAbort 事件。</p><p>调用 SetComplete 方法并不一定意味着事务已完成。只有脚本调用的所有事务组件都调用了 SetComplete,事务才能完成。在大多数实例中,如果结束处理时未调用 SetAbort,脚本通常被假定为完成的,所以不一定要在脚本内调用 SetComplete。</p><p>ObjectContext 展示了 SetAbort 和 SetComplete 以外的六种方法。这些方法可用于脚本调用的组件,但不能直接用于 ASP 脚本。 </p><p>示例<br/>这里示范使用 SetAbort 和 SetCommit 的方法。Sales.htm 文件获取处理销售请求所需的数据。第二个文件——SalesVerify.asp 中的脚本使用两个对象——Inventory 和 Sales 处理销售。如果 Inventory 返回了错误代码表示供销售的存货不足,就会调用 SetAbort。如果 Inventory 对象没有返回错误代码,将会调用 SetComplete 处理销售请求。</p><p>Sales.htm<br/><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"></p><p><HTML><br/><HEAD><br/><TITLE>Sales Order</TITLE><br/></HEAD><br/><BODY BGCOLOR="#FFFFFF"><FONT FACE="ARIAL,HELVETICA"><br/><H2>Sales Order Form </H2></p><p><FORM METHOD=POST ACTION="SalesVerify.asp"> <br/><
>
lease enter the product code, quantity, and your account number.<br/><INPUT TYPE=TEXT NAME=QuantityToBuy> <br/><INPUT TYPE=TEXT NAME=ProductCode> <br/><INPUT TYPE=TEXT NAME=AccountIn> <br/><
><br/><INPUT TYPE=SUBMIT> <br/></FONT> <br/></BODY><br/></HTML></p><p>SalesVerify.asp 文件<br/><%@ Transaction = Required %><br/><%<br/>Set CurrentQOH = Server.CreateObject("Mycomp.Inventory")<br/>Set CurrentSales = Server.CreateObject("Mycomp.Sales")</p><p>CheckQuantity = Request("QuantityToBuy")<br/>CheckProduct = Request("
roductCode")<br/>QuantityStatus = CurrentQOH.CheckQOH(CheckQuantity,CheckProduct)</p><p>If QuantityStatus = None<br/>ObjectContext.SetAbort<br/>Response.Write "Sorry, there is not sufficient quantity on hand to process your sale."<br/>Else <br/>ObjectContext.SetComplete<br/>Account = Request("AccountIn")<br/>Saleupdate = CurrentSales.PostIt(AccountIn)<br/>End If<br/>%></p>
作者:
翔羽
时间:
2006-2-24 09:17
<p><strong>asp内置对象 Application 详解</strong></p><p></p><hr/><p> 在 ASP 的内建对象中除了用于发送、接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个用户信息的对象。</p><p> 让我们先来看看 Application 对象。在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序。我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据。而且,Application 对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。 <br/> 下面就让我们一起来学习 Application 对象。 </p><p> 一、属性 </p><p> 虽然 Application 对象没有内置的属性,但我们可以使用以下句法设置用户定义的属性也可称为集合。 </p><p> Application(" 属性 / 集合名称 ")= 值 </p><p> 我们可以使用如下脚本声明并建立 Application 对象的属性。 <br/>< %<br/>Application("MyVar") = "Hello"<br/>Set Application("MyObj") = Server.CreateObject("MyComponent")<br/>%></p><p></p><p> 一旦我们分配了 Application 对象的属性,它就会持久地存在,直到关闭 WEB 服务器服务使得 Application 停止。由于存储在 Application 对象中的数值可以被应用程序的所有用户读取,所以 Application 对象的属性特别适合在应用程序的用户之间传递信息。 <br/> 二、方法 </p><p> Application 对象有两个方法,它们都是用于处理多个用户对存储在 Application 中的数据进行写入的问题 </p><p> 1、Lock 方法禁止其他客户修改 Application 对象的属性。 </p><p> Lock 方法阻止其他客户修改存储在 Application 对象中的变量,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将在 .asp 文件结束或超时后即解除对 Application 对象的锁定。 </p><p> 让我们来看看下面这段用 Application 来记录页面访问次数的程序 : <br/>< %<br/>Dim NumVisitsNumVisits=0<br/>Application.LockApplication("NumVisits") = Application("NumVisits") + 1<br/>Application.Unlock<br/>%><br/>欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !</p><p><br/> 将以上脚本保存在你的 .asp 文件中,就轻而易举地给你的页面添加了一个计数器。 </p><p> 2、和 Lock 方法相反,Unlock 方法允许其他客户修改 Application 对象的属性。 </p><p> 在上面的例子中,上述例子中,Unlock 方法解除对象的锁定,使得下一个客户端能够增加 NumVisits 的值。 </p><p> 三、事件 </p><p> 1、Application_OnStart </p><p> Application_OnStart 事件在首次创建新的会话 ( 即 Session_OnStart 事件 ) 之前发生。当 WEB 服务器启动并允许对应用程序所包含的文件进行请求时就触发 Application_OnStart 事件。Application_OnStart 事件的处理过程必须写在 Global.asa 文件之中。</p><p> Application_OnStart 事件的语法如下 : <br/>< SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server><br/>Sub Application_OnStart. . .<br/>End Sub<br/>< /SCRIPT></p><p><br/> 2、Application_OnEnd </p><p> Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,Application_OnEnd 事件的处理过程也必须写在 Global.asa 文件之中。 </p><p> 下面让我们来看看在使用 Application 对象时必须注意的一些事项。 </p><p> 不能在 Application 对象中存储 ASP 内建对象。例如,下面的每一行都返回一个错误。 <br/>< %<br/>Set Application("var1")=Session<br/>Set Application("var2")=Request<br/>Set Application("var3")=Response<br/>Set Application("var4")=Server<br/>Set Application("var5")=Application<br/>Set Application("var6")=ObjectContext<br/>%></p><p><br/> 若您将一个数组存储在 Application 对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。 <br/>< % Application("StoredArray")(3) = "new value" %></p><p></p><p> 这是因为 Application 对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。建议您在将数组存储在 Application 对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,您应再将数组全部存储在 Application 对象中,这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。 <br/>---asp8a.asp---<br/>< %<br/>dim MyArray()<br/>Redim MyArray(5)<br/>MyArray(0)="hello"<br/>MyArray(1)="some other string"<br/>Application.Lock<br/>Application("StoredArray")=MyArray<br/>Application.Unlock<br/>Response.Redirect "asp8b.asp"<br/>%></p><p>---asp8b.asp---<br/>< %<br/>LocalArray=Application("StoredArray")<br/>LocalArray(1)=" there"<br/>Response.Write LocalArray(0)&LocalArray(1)<br/>Application.Lock<br/>Application("StoredArray")=LocalArray<br/>Application.Unlock<br/>%></p><p> 与 Application 对象具有相近作用的另一个非常实用的 ASP 内建对象就是 Session。我们可以使用 Session 对象存储特定的用户会话所需的信息。当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。</p>
作者:
翔羽
时间:
2006-2-24 09:18
通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象。当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有名为 ASPSESSIONID 的 Cookie 发送过来,如果有,则服务器会启动新的会话,并为该会话生成一个全局唯一的值,在把这个值作为新 ASPSESSIONID Cookie 的值发送给客户端,正是使用这种 Cookie,可以访问存储在服务器上的属于客户程序的信息。Session 对象最常见的作用就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。另外其还经常被用在鉴别客户身份的程序中。要注意的是,会话状态仅在支持 cookie 的浏览器中保留,如果客户关闭了 Cookie 选项,Session 也就不能发挥作用了。 <br/> 一、属性 <p> 1、SessionID </p><p> SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识。会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。 </p><p> 2、TimeOut </p><p> Timeout 属性以分钟为单位为该应用程序的 Session 对象指定超时时限。如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。 </p><p> 二、方法 </p><p> Session 对象仅有一个方法,就是 Abandon,Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 Abandon 方法,一旦会话超时,服务器将删除这些对象。当服务器处理完当前页时,下面示例将释放会话状态。 <br/> < % Session.Abandon %></p><p></p><p> 三、事件 </p><p> Session 对象有两个事件可用于在 Session 对象启动和释放是运行过程。 </p><p> 1、Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。 </p><p> 尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。 </p><p> 为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。程序如下 : </p><p>< SCRIPT RUNAT=Server Language=VBScript><br/>Sub Session_OnStart<br/>startPage = "/MyApp/StartHere.asp"<br/>currentPage = Request.ServerVariables("SCRIPT_NAME")<br/>if strcomp(currentPage,startPage,1) then<br/>Response.Redirect(startPage)<br/>end if<br/>End Sub<br/>< /SCRIPT></p><p> 上述程序只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求服务器都将处理 Session_OnStart 脚本并将用户重定向到启动页中。 <br/> 2、Session_OnEnd 事件在会话被放弃或超时发生。 </p><p> 关于使用 Session 对象需要注意的事项 Application 对象相近,请参照前文。 </p><p> 会话可以通过以下三种方式启动 : </p><p> 1、一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。 </p><p> 2、用户在 Session 对象中存储了一个值。 </p><p> 3、用户请求了一个应用程序的 .asp 文件,并且该应用程序的Global.asa 文件使用 < OBJECT> 标签创建带有会话作用域的对象的实例。 </p><p> 如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束。这段时间的默认值是 20 分钟。可以通过在 Internet 服务管理器中设置“应用程序选项”属性页中的“会话超时”属性改变应用程序的默认超时限制设置。应依据您的 Web 应用程序的要求和服务器的内存空间来设置此值。例如,如果您希望浏览您的 Web 应用程序的用户在每一页仅停留几分钟,就应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽您的服务器的内存资源。对于一个特定的会话,如果您想设置一个小于默认超时值的超时值,可以设置 Session 对象的 Timeout 属性。例如,下面这段脚本将超时值设置为 5 分钟。 <br/> < % Session.Timeout = 5 %></p><p> 当然你也可以设置一个大于默认设置的超时值,Session.Timeout 属性决定超时值。你还可以通过 Session 对象的 Abandon 方法显式结束一个会话。例如,在表格中提供一个“退出”按钮,将按钮的 ACTION 参数设置为包含下列命令的 .asp 文件的 URL。 <br/> < % Session.Abandon %> </p>
作者:
翔羽
时间:
2006-2-24 09:18
<p><strong>ASP中使用SQL语句教程 </strong></p><hr/><p><br/>五花八门的SQL产品多得要命,或许你早顾不得其它甩开袖子就动手干了。但你要同时采用ASP和SQL的话就可能会头晕。MySQL、SQL Server和mSQL都是绝佳的SQL工具,可惜,在ASP的环境下你却用不着它们来创建实用的SQL语句。不过,你可以利用自己掌握的Access知识以及相应的Access技能,再加上我们的提示和技巧,相信一定能成功地在你的ASP网页中加入SQL。</p><p><br/>1. <font color="#009999"><strong>SELECT 语句</strong></font></p><p>在SQL的世界里,最最基础的操作就是SELECT 语句了。在数据库工具下直接采用SQL的时候很多人都会熟悉下面的操作:<br/>SELECT what<br/>FROM whichTable<br/>WHERE criteria</p><p>执行以上语句就会创建一个存放其结果的查询。</p><p>而在ASP页面文件上,你也可以采用以上的一般语法,不过情况稍微不同,ASP编程的时候,SELECT 语句的内容要作为字符串赋给一个变量: <br/>SQL = "SELECT what FROM whichTable WHERE criteria"</p><p>好了,明白了ASP下SQL“说话”的方式,接下来如法炮制即可,只要满足你的需要,传统的SQL查询模式和条件查询都能派用场。</p><p>举例说明,不妨假设你的数据库内有个数据表,名字是Products ,现在你想取出这个表里的全部记录。然后你就编写了下面的代码: <br/>SQL ="SELECT * FROM Products"</p><p>以上代码——SQL语句的作用就是取出表内的全部数据——执行后将会选出数据表内的全部记录。不过,要是只想从表内取出某个特定列,比如p_name。那就不能用 * 通配符了,这里得键入具体某列的名字,代码如下: <br/>SQL ="SELECT p_name FROM Products"</p><p>执行以上查询之后Products 表内、p_name 列的内容就会全被选取出来。</p><p><br/>2. <font color="#009999"><strong>用WHERE子句设置查询条件</strong></font></p><p>有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,何况本文也存心不想让你去用那个什么劳什子的recordset。</p><p>举个例子,假如你只打算取出p_name 记录,而且这些记录的名字必须以字母w打头,那么你就要用到下面的WHERE 子句了:<br/>SQL ="SELECT p_name FROM Products WHERE p_name LIKE 'W%'"</p><p>WHERE 关键词的后面跟着用来过滤数据的条件,有了这些条件的帮助,只有满足一定标准的数据才会被查询出来。在以上的例子里,查询的结果只会得到名字以w 打头的p_name 记录。</p><p>以上例子中,百分比符号(%)的含义是指示查询返回所有w 字母打头而且后面是任何数据甚至没有数据的记录条目。所以,在执行以上查询的时候, west 和 willow 就会从Products 表内被选取出来并存放在查询里。</p><p>就像你看到的那样,只要仔细地设计SELECT 语句,你就可以限制recordset 中返回的信息量,多琢磨琢磨总能满足你的要求。</p><p>这些啊还不过是掌握SQL用途刚起步。为了帮助你逐步掌握复杂的SELECT 语句用法,下面就让我们再来看一下关键的标准术语:比较运算符,这些玩意都是你在构筑自己的SELECT 字符串来获得特定数据时要经常用到的。</p><p>WHERE子句基础<br/>在开始创建WHERE 子句的时候,最简单的方式是采用标准的比较符号,它们是 < 、 <= 、 > 、 >= 、<> 和 =。显然,你很快就能明白以下代码的含义和具体运行结果:<br/>SELECT * FROM Products WHERE p_price >= 199.95<br/>SELECT * FROM Products WHERE p_price <> 19.95<br/>SELECT * FROM Products WHERE p_version = '4'</p><p>注意: 这里你会注意到,最后一个例句中的数字4周围加了单引号。原因是这样的,在这个例子中的 '4' 是文本类型而非数字类型。因为你会把 SELECT 语句放到引号中来把它作为一个值赋给变量,所以你也可以在语句中采用引号。</p><p>比较运算符<br/>比较运算符指定从表内取出数据的内容范围。你可以用它们来创建过滤器以便缩小recordset的范围,促使其只保存给定任务下你关心的信息。</p><p>3. <font color="#009999"><strong>LIKE 、 NOT LIKE和 BETWEEN</strong></font></p><p><br/>你已经在上面取出w打头记录的例子中看到了LIKE的用法。LIKE判定词是一个非常有用的符号。不过,在很多情况下用了它可能会带给你太多的数据,所以在用到它之前最好先开动脑筋多想想自己到底想获得什么数据。假设你想取出5位数字的SKU号码,而且其开头是1结尾是5,那么你可以用下划符(_)代替%符号:<br/>SQL = "SELECT * FROM Products WHERE p_sku LIKE '1___5'"</p><p>下划符表示任意一个字符。所以在输入“1 _ _ _ 5”的情况下,你的搜索就会限制在满足特定模式的5位数范围内了。</p><p>假如你想反其道而行之,要找出所有不匹配“1_ _ _ 5”模式的SKU条目。那么你只需要在刚才语句例子中的LIKE前面加上NOT就可以了。</p><p>BETWEEN<br/>假设你想取出一定范围内的数据,而且你事先知道范围的起点和终点,那么你不妨采用BETWEEN 判断词。现在就让我们假设你想选取给定表内范围在 1和 10之间的记录。你可以如下使用BETWEEN:<br/>…WHERE ID BETWEEN 1 AND 10</p><p>或者你也可以采用已经熟悉的数学判断字句:<br/>…WHERE ID >= 1 AND ID >= 10</p><p><br/>4. <font color="#009999"><strong>联合语句</strong></font></p><p>我们到目前为止所谈到的SQL语句相对较为简单,如果再能通过标准的recordset循环查询,那么这些语句也能满足一些更复杂的要求。不过,何必非要拘泥在浅尝则止的基础水准之上呢?你完全可以再增加其他一些符号,比如AND、 OR和NOT来完成更强大的功能。</p><p>以下面的SQL语句为例:<br/>SQL ="SELECT c_firstname, c_lastname, c_email FROM customers WHERE c_email IS<br/>NOT NULL AND c_purchase = '1' OR c_purchase = '2' AND c_lastname LIKE<br/>'A%'"</p><p>就你目前所掌握的SQL知识,以上的例子也不难解释,不过上面的语句并没有很明白地让你看清条件字句是如何胶合在单一SQL语句中的。</p><p>多行语句<br/>在SQL语句不好懂的情况下,你不妨把整个语句分解为多行代码,然后在现有变量基础上逐步增加查询语句的各个组成部分并把它存在同一变量内: <br/>SQL = "SELECT c_firstname, c_lastname, c_emailaddress, c_phone"<br/>SQL = SQL & " FROM customers"<br/>SQL = SQL & " WHERE c_firstname LIKE 'A%' and c_emailaddress NOT NULL"<br/>SQL = SQL & " ORDER BY c_lastname, c_firstname"<br/>到了最后一句,SQL变量就包含了以下的完整SELECT 语句:<br/>"SELECT c_firstname, c_lastname, c_emailaddress, c_phone FROM customers<br/>WHERE c_firstname LIKE 'A%' and c_emailaddress NO NULL ORDER BY c_lastname,<br/>c_firstname"</p><p>整句照上面分解之后显然好读多了!在进行调试的时候,你或许更乐于多敲几个字符把程序改得更好读些。不过你可要记住了,在封闭引号之前或者在打开引号之后你需要增加空格,这样才能保证字符串连接起来的时候你没有把几个词凑到了一块。</p><p><br/></p>
作者:
翔羽
时间:
2006-2-24 09:18
5. <font color="#009999"><strong>开始执行</strong></font><p>在学会了SELECT语句的构造和用途之后你就该学习如何使用它了。在你所掌握的数据库工具下,这可能意味着你得按下某个写着“执行”字样的按钮。在ASP网页上,可以立即执行SQL语句也可以当作存储过程调用。</p><p>一旦创建了SQL 语句,你还得设法访问其查询结果。显然,这里的关键就是ASP recordset。在使用非SQL的recordset时,创建recordset的代码通常如下所示:<br/>Dim objRec<br/>Set objRec = Server.CreateObject ("ADODB.Recordset")<br/>objRec.Open "customers", objConn, 0, 1, 2</p><p>如果你对ASP比较熟悉以上的代码对你可就不陌生了,你应该知道“customers”表示你打开数据库内一个数据表的名字。</p><p>打开recordset<br/>为了充分利用你更为熟悉的SQL技能,你需要调整常规ASP网页上最常采用的recordset:<br/>Dim objRec<br/>Set objRec = Server.CreateObject ("ADODB.Recordset")<br/>objRec.Open SQL, objConn, 0, 1, 2</p><p>这里唯一的修改就是在objRec.Open,之后用包含SQL语句的变量代替了要查询的数据表的名称。</p><p>这种方法的优点之一是你可以指定游标类型(如以上0, 1 ,2 所示)。</p><p>执行SQL<br/>你可以用紧凑的一行代码执行SQL语句来创建recordset。以下是语法:<br/>Dim objRec<br/>set objRec = objConn.Execute(SQL)</p><p>在上例中,你所看到的SQL是你存放自己SQL SELECT 语句的变量。该代码行“运行”SQL语句(或者说对数据库进行查询),选取数据并把数据存放在recordset 内,在上例中就是变量objRec。这种方法的主要缺点是你不能选择自己想采用的游标类型。相反,recordset总是用前向游标打开。</p><p>因为游标的缘故,你或许打算熟悉两种创建recordset的方法。直接执行查询节省了键入字符所消耗的时间,但那样的话你就得采用默认的游标了,这样有可能遭遇经常不能正常运行的毛病。不管你具体采用哪种办法,两者之间的最大的差别也不外乎代码精练与否。在不考虑你取得什么字段、你的标准是什么的前提下,也不管你如何存储数据,采用SQL式的recordset 在体积上会比ASP上打开的标准recordset 要小得多,更别提操作起来的简易性了。毕竟,通过过滤数据,你消除了耗费时间的if-then 测试和可能用到的循环。</p><p>编写测试用SQL<br/>这里有个技巧,许多专业ASP程序员习惯在测试网页的时候“编写”自己的SQL语句。这样做可以帮助你调试代码,因为你可以从中看到传递给服务器执行的字符串。而你要做的无非是增加Response.WriteyourVariable 在屏幕上显示有关信息。在你把和SQL有关的问题提交给ASP讨论组的时候你就应该附上这些信息。</p><p>6. <font color="#009999"><strong>存储查询</strong></font></p><p><br/>当你的查询相对简单的时候,每次从头开始创建SQL语句也不费什么工夫,不过,复杂的查询就不同了,每次都从头来会产生很多开发错误。因此,一旦让SQL顺利地运行起来,你最好把它们存起来,在需要时再调用它们。这样,哪怕是一个简单查询你都能随时用上存储的查询语句了。</p><p>假设你每周都要给团队做一次报告,指出目前存在的业务支持问题,这些数据需要从你的数据库中选取,而且要按照日期选择记录,同时根据你所在团队所采用的支持问题的类别排序。一旦你设计了这一查询,你何必以后每周都重新编写一次呢?不要在你的HTML页面上创建查询,你应该用你的数据库工具创建查询并且保存它。</p><p>然后你可以采用ActiveCommand 属性把查询插入到你的ASP网页。头一两回你可能会觉得没啥意思,其实也就几行代码而已:<br/>Set objSQ = Server.CreateObject ("ADODB.Command")<br/>objSQ.ActiveConnection = "databaseName"</p><p>objSQ.CommandText = "storedQueryName"<br/>objSQ.CommandType = adCmdStoredProc</p><p>set objRec = objSQ.Execute</p><p>注意,采用adCmdStoredProc 表示你已经在页面上包含了adovbs.inc 文件。该文件定义了你可以按照名字而非数字进行访问的Access常数。只需要在页面上包含该文件即可(<!--#INCLUDE -->),然后你就可以用adCmdStoredProc 这类名字了。这样,将来你再看到的时候更容易理解以上被存储的查询到底是个什么意思。</p><p>7.<font color="#009999"><strong> ORDER BY</strong></font></p><p>从Access数据库中选取记录有件最令人丧气的事情,它们是以怎样的顺序输入到数据库内就按照怎样的顺序出来。就算你在Access环境内采用Sort By来改变记录视图,数据表内的记录顺序也并没有发生改变。</p><p><br/>如果你正在使用ASPrecordset在网页上写出记录,那么你或许知道乱纷纷的顺序是多令人痛苦的事。但是你可能不得不经常得面对这一问题,因为并不存在什么简单方便的解决方案。好在ORDER BY 可以简化这一难题。</p><p>为了对你的结果排序,只要在SELECT语句末尾加上ORDER BY,然后指定你需要排序的参照列即可。因此,如果你想要根据顾客的姓氏对Customers表排序,那么你可以编写如下的查询语句:<br/>SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY c_lastname"</p><p>这样,只要你建立了recordset而且开始把结果写到屏幕上,你就会看见数据按照字母顺序排列起来了。</p><p>多级排序<br/>其实不仅仅可以在SQL语句中进行一级排序。实际上,在很多情况下,你可能会希望指定两到三级深度的数据排序。假设你有以下数据表,其内容如下所示:</p><p><img height="176" src="mk
MSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/2003101213373359565.gif" width="427" alt=""/></p><p></p><p>先前采用的单级ORDER BY 排序是按下面的顺序取出数据的:<br/>Absurdly Assured<br/>absurd@assured.com</p><p>Absolutely Assured<br/>absolutely@assured.com</p><p>Crazed Coder<br/>crazy@coder.net</p><p>Loosely Fringe<br/>loose@fringe.to</p><p>Lunatic Fringe<br/>lune@fringe.to</p><p>Hands On<br/>hands@yes.org</p><p>显然ORDER BY 起了应有的作用。在实际的表结构下,Absurdly Assured 是最后的条目,但它排在检索结果的最顶端。Hands On记录排最后因为 O 在以上列表中排在字母表最后。显然,Absolutely按照字母表最好排在Absurdly之前。为此,你需要采取第2级ORDER BY 排序标准,参照第2列进行排序:<br/>SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY<br/>c_lastname, c_firstname"</p><p>其结果将首先按照c_lastname 列排序然后按照c_firstname 列排序。假如你的数据表包含的记录比较多,仔细设计排序会令输出结果编排更为合理。</p><p>投入使用<br/>如果你同大多数程序员一样喜欢自己动手编代码,沉湎于掌握新技术的狂热之中。何不从ASP的冗长编码中转过头来尝试一下SQL编码呢?下面我们将就ASP编程时常见的问题以及如何在ASP中高效地利用SQL语句做一番探讨。</p>
作者:
翔羽
时间:
2006-2-24 09:18
<p>8. <font color="#009999"><strong>记录统计</strong></font></p><p><br/>确定数据库内有多少记录,或者确定有多少记录达到了某些标准,这些用ASP完成并非难事。如果你采用了正确的游标类型,你可以用RecordCount 属性获得记录数当然也可以用recordset。但是,有个更简单的办法,这就是在自己的SELECT语句中采用count(*) ,代码如下所示:<br/>SQL = "SELECT count(*) FROM Customers"</p><p>或者<br/>SQL = "SELECT count(*) FROM Customers WHERE c_lastname LIKE 'A%'"</p><p>举例说明,以下代码将选出一些记录以及这些记录的总数:<br/>SQL = "SELECT c_firstname, c_lastname, count(*) FROM Customers WHERE c_lastname LIKE 'A%'"</p><p>但是你不能实现自己的目的。这里采用的“count”函数其实是一种集合函数,意思是只返回单行信息:回答你提出的问题。对第1个SELECT 语句来说,问题是“在客户表内有多少条记录?”查询返回单一的值作为响应,因此它不能同你常规的查询相组合。假如你希望得到其他数据,你需要采用RecordCount。</p><p>集合函数除了“count”之外还包括AVG、MIN、MAX和SUM等。</p><p><br/>9. <font color="#009999"><strong>连接</strong></font></p><p>任何熟悉SQL和关系数据库的人都遇见过大量的连接类型。最简单的说,连接(join)会把两个表的内容组合到一个虚拟表或者recordset内。假如数据表有效地规一化,或许你会经常从某一个表中选出特定的信息再从另一个表中选出关联信息。这样做就需要简单的“同等连接(equijoin)”。</p><p>为了了解实际的连接操作,现在让我们假设在一个数据库内存放了某类软件的相关记录。某个表(Software)包含了软件产品的名称、软件的版本以及其他有关细节:</p><p><img height="157" src="mk
MSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/200310121338147907.gif" width="413" alt=""/></p><p></p><p>另一个表(Releases)则存储了软件发布历史的信息,其中包括发布日期和发布状态等(比如测试版、当前版、过时等):</p><p><img height="177" src="mk
MSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/2003101213382533944.gif" width="312" alt=""/></p><p></p><p>上表中还包含了一个列,内容指向软件表中采用的ID号。所以,通过这种索引软件表的方式,你就知道发布表中software_ID 等于 2的软件是Rome。</p><p>你采用连接组合信息,这样就不需要在两个表之间来回折腾了。不过,除了组合信息之外还可以通过连接把有关信息合并。这样,只要发布表内的software_ID 匹配软件表内的ID,你就把匹配信息一起放到一个记录内。</p><p>代码如下:<br/>SQL = "SELECT * FROM Software, Releases WHERE software.ID = releases.softwareID"</p><p>仔细分析以上的语句,首先注意到两个表名列在了FROM的后面。再根据所采用的连接,今后你可能还会发现语法会有所变化(或者连接类型有变),但是以上的语法是最基本的,显示了数据的联合选择方式。这里的WHERE 子句用来比较特定的ID值。在Software 表内,存在ID 列。同样的,Releases 表内则有个software_ID 列。为了明确你在WHERE 子句里要比较的值,你用表名作为前缀,后面还加上了一个点号(.)。</p><p>以下是连接选取数据之后的结果: </p><p><img height="134" src="mk
MSITStore:E:\Documents%20and%20Settings\Administrator\桌面\200622221424550480\20057210142669.chm::/images/2003101213385325535.gif" width="433" alt=""/></p><p></p><p>注意:在创建连接的时候要仔细考虑选出数据的列。以上代码采用 * 通配符是为了让读者关注于SELECT 代码行的其他部分。但是,正如你从上图看到的那样,你无法选出softwareID 列,因为这一列没有作为recordset部分的增加值。它的作用就是为WHERE 子句所用。</p><p></p><p> </p>
作者:
翔羽
时间:
2006-2-24 09:19
<p><strong>ASP访问SQL Server内置对象</strong></p><p></p><hr/><p>平常我们只听说过ADO等一类ASP对象,但在ASP中还有个鲜为人知的专门SQL Server的ASP访问对象,它就是SQLOLE.SQLServer对象。SQLOLE.SQLServer可以直接访问SQL Server的系统属性。以Set oSQLServer = CreateObject ("SQLOLE.SQLServer")语句将产生一个SQL Server服务器对象。 </p><p>---- 若要查看此服务器中数据库的集合,可用语句: </p><p></p><p>For Each SQLDB In oSQLServer.Databases<br/>Response.Write SQLDB.Name ‘将列出所有的数据库,如Pubs等<br/>Next</p><p>---- 若要查看某数据库中(如PUBS数据库)数据表的集合,可用语句: </p><p></p><p>pubDatabase=oSQLServer.Databases(“pubs”)<br/>’oSQLServer是前面创建的SQL Server服务器对象<br/>For Each DBTable In pubDatabase.Tables<br/>Response.Write DBTable.Name<br/>Next</p><p>---- 下面的语句将列出数据库中(PUBS数据库)数据视图 </p><p></p><p>pubDatabase =oSQLServer.Databases(“pubs”)<br/>’oSQLServer是前面创建的SQL Server服务器对象<br/>For Each DBView In pubDatabase.Views<br/>Response.Write DBView.Text<br/>Next</p><p>---- 以下语句将列出数据库中(PUBS数据库)存贮过程 </p><p></p><p>pubDatabase =oSQLServer.Databases(“pubs”)<br/>’oSQLServer是前面创建的SQL Server服务器对象<br/>For Each DBSP In pubDatabase.StoredProcedures<br/>Response.Write DBSP.Text<br/>Next</p><p>---- 程序运行的结果(取数据表名): </p><p>---- 取存贮过程的结果: </p><p>---- 一个完整的小例子源码附后(其它功能读者可加入)。 </p><p></p><p>< %@ LANGUAGE = VBScript % ></p><p>< HTML ><br/>< HEAD ><br/>< META NAME="GENERATOR" Content=<br/>"Microsoft Developer Studio" ><br/>< META HTTP-EQUIV="Content-Type"<br/>content="text/html; charset=gb2312" ></p><p>< TITLE >< /TITLE ><br/>< /HEAD ></p><p>< %<br/>On Error Resume Next<br/>Dim oSQLServer<br/>Set oSQLServer = CreateObject ("SQLOLE.SQLServer")</p><p><br/>strServer = "dep"<br/>strLogin = "sa"<br/>strPwd = ""</p><p><br/>oSQLServer.Connect strServer,strLogin,strPwd</p><p></p><p>% ></p><p><br/>< BODY BGCOLOR=#ffffff ><br/>数据库列表<br/>< SELECT NAME="Database" ><br/>< %<br/>For Each SQLDB In oSQLServer.Databases<br/>If Not SQLDB.SystemObject Then<br/>Response.Write "< OPTION VALUE=<br/>""" & SQLDB.Name & """ >" & SQLDB.Name</p><p>& " "<br/>End If<br/>Next<br/>Set oSQLServer = Nothing<br/>% ><br/>< /SELECT ><br/>< /BODY ><br/>< /HTML ></p>
作者:
翔羽
时间:
2006-2-24 09:19
<p><strong>ASP中正则表达式的应用</strong></p><hr/><p> 一、正则表达式概述 <br/>如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。 <br/>请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:data1.dat、data2.dat等等。如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名:data.dat、data1.dat、data12.dat等等,尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。 <br/>在我们编写ASP程序时,经常会判断一个字符串的有效性,如;一个串是否是数字、是否是有效的Email地址等等。如果不使用正则表达式,那么判断的程序会很长,并且容易出错,如果使用正则表达式,这些判断就是一件很轻松的工作了。后面我们将介绍如何判断数字和Email地址的有效性。 <br/>在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。 <br/>使用正则表达式,能完成些什么事情呢? <br/>测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。 <br/>替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。 <br/>根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。 <br/>例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。那么,正则表达式语法的语法是如何呢? <br/>一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文 <br/>字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 <br/>这里有一些可能会遇到的正则表达式示例: <br/>/^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。 <br/>/\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。 <br/>/<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 HTML 标记。</p><p> 二、正则表达式在VBScript中的应用 <br/> VBScript使用RegExp对象、Matches集合以及Match对象提供正则表达式支持功能。我们还是先看一个例子。 <br/><% <br/>Function RegExpTest(patrn, strng) <br/>Dim regEx, Match, Matches '建立变量。 <br/>Set regEx = New RegExp '建立正则表达式。 <br/>regEx.Pattern = patrn '设置模式。 <br/>regEx.IgnoreCase = True '设置是否区分字符大小写。 <br/>regEx.Global = True '设置全局可用性。 <br/>Set Matches = regEx.Execute(strng) '执行搜索。 <br/>For Each Match in Matches '遍历匹配集合。 <br/>RetStr = RetStr & "Match found at position " <br/>RetStr = RetStr & Match.FirstIndex & ". Match Value is '" <br/>RetStr = RetStr & Match.Value & "'." & "<BR>" <br/>Next <br/>RegExpTest = RetStr <br/>End Function <br/>response.write RegExpTest("[ij]s.", "IS1 Js2 IS3 is4") <br/>%> <br/>在这个例子中,我们查找字符串中有无is或者js这两个词,忽略大小写。运行的结果如下: <br/>Match found at position 0. Match Value is 'IS1'. <br/>Match found at position 4. Match Value is 'Js2'. <br/>Match found at position 8. Match Value is 'IS3'. <br/>Match found at position 12. Match Value is 'is4'. <br/>下面我们就介绍这三个对象和集合。 <br/> 1、RegExp对象 是最重要的一个对象,它有几个属性,其中: <br/> ○Global 属性,设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 False。 <br/> ○IgnoreCase 属性,设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则IgnoreCase 属性为 False;否则为 True。缺省值为 False。 <br/> ○Pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是一个 RegExp 对象变量。 <br/> 2、Match 对象 <br/> 匹配搜索的结果是存放在Match对象中,提供了对正则表达式匹配的只读属性的访问。 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的 Match 对象属性都是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。 <br/> ○FirstIndex 属性,返回在搜索字符串中匹配的位置。FirstIndex 属性使用从零起算的偏移量,该偏移量是相对于 <br/>搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0 <br/> ○Length 属性,返回在字符串搜索中找到的匹配的长度。 <br/> ○Value 属性,返回在一个搜索字符串中找到的匹配的值或文本。 <br/> 3、Matches 集合 <br/> 正则表达式 Match 对象的集合。Matches 集合中包含若干独立的 Match 对象,只能使用 RegExp 对象的 Execute 方法来创建之。与独立的 Match 对象属性相同,Matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索引。 <br/> 学习了这三个对象和集合,如何应用于字符串的判断和替换呢?regExp对象的三个方法正好解决了这个问题,它们是Replace方法、Test方法和Execute方法。 <br/> 1、Replace 方法 <br/> 替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 Replace 方法的用法。 <br/><% <br/>Function ReplaceTest(patrn, replStr) <br/>Dim regEx, str1 ' 建立变量。 <br/>str1 = "The quick brown fox jumped over the lazy dog." <br/>Set regEx = New RegExp ' 建立正则表达式。 <br/>regEx.Pattern = patrn ' 设置模式。 <br/>regEx.IgnoreCase = True ' 设置是否区分大小写。 <br/>ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。 <br/>End Function <br/>Response.write ReplaceTest("fox", "cat") & "<BR>" ' 将 'fox' 替换为 'cat'。 <br/>Response.write ReplaceTest("(\S+)(\s+)(\S+)", "$3$2$1") ' 交换词对. <br/>%> <br/> 2、Test 方法 <br/> 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。 <br/> 如果找到了匹配的模式,Test方法返回True;否则返回False。下面的代码说明了Test 方法的用法。 <br/><% <br/>Function RegExpTest(patrn, strng) <br/>Dim regEx, retVal ' 建立变量。 <br/>Set regEx = New RegExp ' 建立正则表达式。 <br/>regEx.Pattern = patrn ' 设置模式。 <br/>regEx.IgnoreCase = False ' 设置是否区分大小写。 <br/>retVal = regEx.Test(strng) ' 执行搜索测试。 <br/>If retVal Then <br/>RegExpTest = "找到一个或多个匹配。" <br/>Else <br/>RegExpTest = "未找到匹配。" <br/>End If <br/>End Function <br/>Response.write RegExpTest("is.", "IS1 is2 IS3 is4") <br/>%> <br/> 3、Execute 方法 <br/> 对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。 <br/> Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。<br/><br/> 三、JavaScript中正则表达式的使用 <br/> 在JavaScript 1.2版以后,JavaScript也支持正则表达式。 <br/> 1、replace <br/> replace在一个字符串中通过正则表达式查找替换相应的内容。replace并不改变原来的字符串,只是重新生成了一个新的字符串。如果需要执行全局查找或忽略大小写,那幺在正则表达式的最后添加g和i。 <br/>例: <br/><SCRIPT> <br/>re = /apples/gi; <br/>str = "Apples are round, and apples are juicy."; <br/>newstr=str.replace(re, "oranges"); <br/>document.write(newstr) <br/></SCRIPT> <br/>结果是:"oranges are round, and oranges are juicy." <br/>例: <br/><SCRIPT> <br/>str = "Twas the night before Xmas..."; <br/>newstr=str.replace(/xmas/i, "Christmas"); <br/>document.write(newstr) <br/></SCRIPT> <br/>结果是:"Twas the night before Christmas..." <br/></p>
作者:
翔羽
时间:
2006-2-24 09:19
例: <br/><SCRIPT> <br/>re = /(\w+)\s(\w+)/;str = "John Smith"; <br/>newstr = str.replace(re, "$2, $1"); <br/>document.write(newstr) <br/></SCRIPT> <br/>结果是:"Smith, John". <br/> 2、search <br/>search通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置,否则返回-1。 <br/>search(regexp) <br/><SCRIPT> <br/>function testinput(re, str){ <br/>if (str.search(re) != -1) <br/>midstring = " contains "; <br/>else <br/>midstring = " does not contain "; <br/>document.write (str + midstring + re.source); <br/>} <br/>testinput(/^[1-9]/i,"123") <br/></SCRIPT> <br/> 3、match <br/> match方法执行全局查找,查找结果存放在一个数组里。 <br/>例一: <br/><SCRIPT> <br/>str = "For more information, see Chapter 3.4.5.1"; <br/>re = /(chapter \d+(\.\d)*)/i; <br/>found = str.match(re); <br/>document.write(found); <br/></SCRIPT> <br/>显示结果:Chapter 3.4.5.1,Chapter 3.4.5.1,.1 <br/>例二: <br/><SCRIPT> <br/>str = "abcDdcba"; <br/>newArray = str.match(/d/gi); <br/>document.write(newArray); <br/></SCRIPT> <br/>显示结果D, d.<p> 四、示例<br/>1 、判断数字的正确性 <br/><%@ Language=VBScript %> <br/><script language="javascript" runat="server"> <br/>function isNumeric(strNumber) { <br/>return (strNumber.search(/^(-|\+)?\d+(\.\d+)?$/) != -1); <br/>} <br/>function isUnsignedNumeric(strNumber) { <br/>return (strNumber.search(/^\d+(\.\d+)?$/) != -1); <br/>} <br/>function isInteger(strInteger) { <br/>return (strInteger.search(/^(-|\+)?\d+$/) != -1); <br/>} <br/>function isUnsignedInteger(strInteger) { <br/>return (strInteger.search(/^\d+$/) != -1); <br/>} <br/></script> <br/><HTML> <br/><BODY> <br/><b>判断数字的正确性</b> <br/><% <br/>Dim strTemp <br/>strTemp = CStr(Request.Form("inputstring")) <br/>If strTemp = "" Then strTemp = "0" <br/>%> <br/><TABLE BORDER="1" CELLPADDING="4" CELLSPACING="2"> <br/><TR> <br/><TD ALIGN="right"><B>原始字符串</B></TD> <br/><TD><%= strTemp %></TD> <br/></TR> <br/><TR> <br/><TD ALIGN="right"><B>数字</B></TD> <br/><TD><%=isNumeric(strTemp)%></TD> <br/></TR> <br/><TR> <br/><TD ALIGN="right"><B>非负数字</B></TD> <br/><TD><%=isUnsignedNumeric(strTemp)%></TD> <br/></TR> <br/><TR> <br/><TD ALIGN="right"><B>整数</B></TD> <br/><TD><%=isInteger(strTemp)%></TD> <br/></TR> <br/><TR> <br/><TD ALIGN="right"><B>非负整数()</B></TD> <br/><TD><%=isUnsignedInteger(strTemp)%></TD> <br/></TR> <br/></TABLE> <br/><FORM ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>" METHOD="post"> <br/>请输入一个数字:<BR> <br/><INPUT TYPE="text" NAME="inputstring" SIZE="50"></INPUT><BR> <br/><INPUT TYPE="submit" Value="提交"></INPUT><BR> <br/></FORM> <br/></BODY> <br/></HTML> <br/>2、判断Email地址的正确性 <br/><% <br/>Function isemail(strng) <br/>isemail = false <br/>Dim regEx, Match <br/>Set regEx = New RegExp <br/>regEx.Pattern = "^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$" <br/>regEx.IgnoreCase = True <br/>Set Match = regEx.Execute(strng) <br/>if match.count then isemail= true <br/>End Function <br/>%></p><p> 五、总结 <br/> 上面我们介绍了正则表达式的基本概念,以及在VBScript和JavaScript中如何使用正则表达式,同时,通过一些实例让大家有了感性的认识。正则表达式的应用范围很广,能为大家解决很多实际中的问题。本文介绍的内容只是一些初步的知识,还有很多语法规则需要大家继续学习,在实践中发现问题,解决问题。<br/></p>
作者:
翔羽
时间:
2006-2-24 09:20
<p><strong>ASP 中 Split 函数的实例</strong></p><hr/><p> 大家有碰到过要想取一字符串里的某些值而无从下手?有没有觉得看书或教材对split的写法糊里糊涂……如果有此疑问的话,请看下面我对例子的解释,相信您会对这个有一定的了解。 </p><p> 我先介绍一下Split函数的用法:<br/> 返回值数组 = Split("字符串","分割符")</p><p><br/> 假设变量strURL保存着URL值,如strURL = "ftp://username:password@server",这是我们在IE中登录到FTP上时的URL形式,如果我们想把其中的username和password取出来的话,该怎么办呢?当然解决的方法有许多,在这里我们只介绍用Split来解决的方法。首先,我们找出分割符。我们发现在这个字符串中,username和password之间有个冒号把它们隔开了,所以我们就把这个冒号作为Split函数的"分割符"来分割整个字符串,最后达到取username和password的目的。代码如下: <br/>strURL = "ftp://username:password@server"<br/>aryReturn = Split(strURL,":")</p><p> 这样我们就把字符串用冒号分割开了,分割后的结果保存在aryReturn中(aryReturn是一个数组)。 </p><p> 下面我们就来看看这个最终的结果吧,因为Split函数最终返回的是一个数组,所以我们主要就是显示数组中的元素了,就要涉及到一些跟数组有关的函数:IsArray()判断是否数组的函数,LBound()取数组的下标,UBound()取数组的上标。 </p><p><br/>Response.Write("返回值是否为数组:" & IsArray(aryReturn) & "<br>")<br/>For i = LBound(aryReturn) To UBound(aryReturn)<br/>Response.Write("返回值数组中的元素[" & i & "]:" & Right(aryReturn(i),Len(aryReturn(i))-2) & "<br>")<br/>Next </p><p> 通过上面的代码,我们看到字符串被分割成三个部分,即:"ftp"、"//username"、"password@server"。我们要取username和password需要进一步的处理,我就不多说了,直接给出代码。<br/> 取username的代码:<br/>strUsername = Right(aryReturn(1),Len(aryReturn(1))-2) <br/> 取password的代码:</p><p><br/>'取password我们又用到Split函数了,不过这回的分割符是"@" <br/>aryTemp = Split(aryReturn(2),"@") <br/>strPassword = aryTemp(0) <br/>'我们可以顺便取出server<br/>strServer = aryTemp(1) </p><p> 分割符可以是一个字符,也可以是一个字符串。如:<br/>aryReturn = Split("ftp://username:password@server,"//") </p><p> 注意:<br/> 1.一般来说,ASP中可以不声明变量,使用Split函数时,如果要声明返回值的变量的话,只能用Dim,而不能用Redim。虽然说其返回是一个数组,应该是用Redim也可以,但在实际使用过程中是不行。不知是怎么回事?<br/> 2. 如果用Split函数来分割一个字符串中并不存在的分割符时,将返回整个字符串,其结果是只有一个元素的数组。</p><p> 后话,对于要取一字符串中的某些字符或部分,只要抓住规律,再加上用split就可以很好做成各种效果。写此文,希望对大家的学习有所帮助,同时也希望各路高手能够指点一二!<br/></p>
作者:
翔羽
时间:
2006-2-24 09:20
<p><strong>ASP 中 DateDiff 函数详解</strong></p><hr/><p>DateDiff 函数 </p><p>描述 <br/>返回两个日期之间的时间间隔。 <br/>语法 <br/>DateDiff(interval, date1, date2 [,firstdayofweek][, firstweekofyear]]) <br/>DateDiff 函数的语法有以下参数: </p><p>参数 描述 <br/>interval 必选。字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔。有关数值,请参阅“设置”部分。 <br/>date1, date2 必选。日期表达式。用于计算的两个日期。 <br/>firstdayofweek 可选。指定星期中第一天的常数。如果没有指定,则默认为星期日。有关数值,请参阅“设置”部分。 <br/>firstweekofyear 可选。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。有关数值,请参阅“设置”部分。 </p><p><br/>设置 <br/>interval 参数可以有以下值: <br/>设置 描述 <br/>yyyy 年 <br/>q 季度 <br/>m 月 <br/>y 一年的日数 <br/>d 日 <br/>w 一周的日数 <br/>ww 周 <br/>h 小时 <br/>m 分钟 <br/>s 秒 </p><p><br/>firstdayofweek 参数可以有以下值: </p><p>常数 值 描述 <br/>vbUseSystem 0 使用区域语言支持 (NLS) API 设置。 <br/>vbSunday 1 星期日(默认) <br/>vbMonday 2 星期一 <br/>vbTuesday 3 星期二 <br/>vbWednesday 4 星期三 <br/>vbThursday 5 星期四 <br/>vbFriday 6 星期五 <br/>vbSaturday 7 星期六 </p><p><br/>firstweekofyear 参数可以有以下值: </p><p>常数 值 描述 <br/>vbUseSystem 0 使用区域语言支持 (NLS) API 设置。 <br/>vbFirstJan1 1 由 1 月 1 日所在的星期开始(默认)。 <br/>vbFirstFourDays 2 由在新年中至少有四天的第一周开始。 <br/>vbFirstFullWeek 3 由在新的一年中第一个完整的周开始。 </p><p><br/>说明 <br/>DateDiff 函数用于判断在两个日期之间存在的指定时间间隔的数目。例如可以使用 DateDiff 计算两个日期相差的天数,或者当天到当年最后一天之间的星期数。 <br/>要计算 date1 和 date2 相差的天数,可以使用“一年的日数”(“y”)或“日”(“d”)。当 interval 为“一周的日数”(“w”)时,DateDiff 返回两个日期之间的星期数。如果 date1 是星期一,则 DateDiff 计算到 date2 之前星期一的数目。此结果包含 date2 而不包含 date1。如果 interval 是“周”(“ww”),则 DateDiff 函数返回日历表中两个日期之间的星期数。函数计算 date1 和 date2 之间星期日的数目。如果 date2 是星期日,DateDiff 将计算 date2,但即使 date1 是星期日,也不会计算 date1。 </p><p>如果 date1 晚于 date2,则 DateDiff 函数返回负数。 </p><p>firstdayofweek 参数会对使用“w”和“ww”间隔符号的计算产生影响。 </p><p>如果 date1 或 date2 是日期文字,则指定的年度会成为日期的固定部分。但是如果 date1 或 date2 被包括在引号 (" ") 中并且省略年份,则在代码中每次计算 date1 或 date2 表达式时,将插入当前年份。这样就可以编写适用于不同年份的程序代码。 </p><p>在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。</p>
作者:
翔羽
时间:
2006-2-24 09:20
<p><strong>存贮过程(SQL样版) </strong></p><hr/><p>今天发个SQL存贮过程给大家认识</p><p><br/>CREATE PROCEDURE login_verify</p><p>(<br/>@community_id int, --拿值<br/>@username varchar(20),<br/>@password varchar(40),<br/>@result tinyint output<br/>)</p><p>AS</p><p>set nocount ON</p><p><br/>declare @service_deadline_date smalldatetime,@community_setting_max_online_count int ---定义一个变量为 短日期格式</p><p>select @community_setting_max_online_count=community_setting_max_online_count,@service_deadline_date=service_deadline_date from community_info where community_id=@community_id --这里是求最大登录人数</p><p>if datediff(d,@service_deadline_date,getdate())>10 --其实这个是限制用户的使用期,求当前日期与库中的记录日期如时大于10天,则返回@result =11<br/>begin<br/>set @result=11 --超过使用期<br/>return<br/>end</p><p><br/>if (select count(*) from online_user where =@community_setting_max_online_count">community_id=@community_id)>=@community_setting_max_online_count --根据库中的记录设定与当前人数比较<br/>begin<br/>set @result=10 --超出在线人数限制 --返回@result=10<br/>return<br/>end</p><p><br/>declare @stamia int,@last_update_stamia_date smalldatetime,@level_id int --定义变量 整型 短日期型 整型<br/>declare @userid int ,@user_role int<br/>select @userid=userid,@user_role=user_role,@stamia=stamia,@last_update_stamia_date=last_update_stamia_date,@level_id=level_id from user_info where username=@username and password=@password and community_id=@community_id and user_type=0</p><p>--从用户信息表中,将一些信息写入到定义的三个变量中</p><p>if @userid is not null ----如果@userid 不变null值<br/>begin --用户名和密码校验成功<br/>set @result=1 --检验成功<br/>return<br/>end <br/>else<br/>begin<br/>set @result=0 ---登录失败<br/>end</p><p>set nocount OFF</p><p>GO</p><p>我们给上面的过程取个名login_verify叫做</p><p>写成是ASP代码中调用安全认证的地方</p><p>'''事先已经定义好conn</p><p>Set cmd.ActiveConnection=conn<br/>cmd.CommandText="login_verify"<br/>cmd.CommandType=&H0004</p><p>@community_id int, --拿值<br/>@username varchar(20),<br/>@password varchar(40),<br/>@result int</p><p>cmd.Parameters.Append cmd.CreateParameter("@community_id",3)<br/>cmd.Parameters.Append cmd.CreateParameter("@username ",200)<br/>cmd.Parameters.Append cmd.CreateParameter("@password",200)</p><p>cmd("@community_id")=session("community_id")<br/>cmd("@username")=request("userid")<br/>cmd("@password")=request("userid")</p><p>cmd.execute</p><p>dim result</p><p>result=cmd("@result")</p><p>conn.close</p><p>if trim(result)="1" then</p><p></p><p>'''''''''''''登录成功的提示与操作</p><p>else</p><p>''''''''''''''''''''''登录失败的提示与操作</p><p>end if</p>
作者:
翔羽
时间:
2006-2-24 09:20
<p><strong>存储过程使用大全</strong></p><hr/><p>1,调用没有参数的存储过程<br/><%<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>%><br/>2,一个输入的参数的存储过程<br/><%<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>%><br/>3,一个输入参数和一个输出的参数<br/><%<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/>%><br/>4,一个输入参数,一个输出参数,和一个返回值<br/><%<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/>%></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>
作者:
翔羽
时间:
2006-2-24 09:21
二、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>< !--#INCLUDE VIRTUAL="ADOVBS.inc"-- > ’<br/>包含VBSCRIPT的常量定义文件</p><p>< %</p><p>Set DataConn=Sever.CreateObject("ADODB.Connection") <br/>'建立连接对象</p><p>Dataconn.Open"DSN=user;SERVER=APP_SERVER;<br/>UID=sa
WD=;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>% ></p><p>The Check Result is < %=cmdTemp("RetValue")% > <br/>'输出返回值</p><p><%DataConn.Close '关闭数据库连接%></p><p>//用户输入界面</p><p><HTML><br/><HEAD>< TITLE>Registration Page</TITLE></HEAD> <br/><H2>请输入用户名和密码:</H2> <br/><FORM METHOD="
OST" ACTION="CheckPass.asp"><br/><p>用户名: <br/><input name="UserName" type="TEXT"><br/></p><br/><p> 密 码: <br/><input name="UserPwd" type="
ASSWORD"><br/><input type="submit" name="submit" value="确定"><br/></p><br/></FORM> </BODY><br/></HTML></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>
作者:
翔羽
时间:
2006-2-24 09:21
<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 "<center><table border=1 cellpadding =0 cellspacing =0 bordercolordark=#ffffff bordercolorlight=#cccc88><tr onclick="&b&".style.display=''><td bgcolor=#cccc88>" & b & "</td></tr><tr id="&b&" style=display:none><td>"<br/>Response.Write "<TEXTAREA rows=6 cols=70 style='font-color:#ccc888;bgcolor:#ffffc'>"<br/>Response.Write b<br/>for each element in a.parameters<br/>c=element<br/>c="'" & replace(c,"'","''") & "'"<br/>d=d & vbcrlf & element.name &"="& c &","<br/>next <br/>d=left(d,len(d)-1)<br/>Response.Write d<br/>Response.Write "</TEXTAREA></td></tr></table></center>"<br/>end sub<br/></p>
作者:
翔羽
时间:
2006-2-24 09:21
<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 销售额 > 销售目标 <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/> < %<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/> %><br/> < table border=1>< tr><br/> < %<br/> for i=0 to howmanyfields<br/> %><br/> < td>< b>< %=rstemp(i).name%>< /B>< /TD><br/> < % next %><br/> < /tr><br/> < %<br/> do while not rstemp.eof<br/> %><br/> < tr><br/> < % for i = 0 to howmanyfields<br/> thisvalue=rstemp(i)<br/> If isnull(thisvalue) then<br/> thisvalue="?<br/> ' 如果字段为空,则将变量 thisvalue 的值定义为一个空格 <br/> end if%><br/> < td valign=top>< %=thisvalue%>< /td><br/> < % next %><br/> < /tr><br/> < %rstemp.movenext<br/> loop%><br/> < /table><br/> < %<br/> rstemp.close<br/> set rstemp=nothing<br/> conntemp.close<br/> set conntemp=nothingend sub%><br/><br/> 完成了 SUB 的定义过程,在下面几个 ASP 程序中我们只要加入想要使用的 SQL 查询语句,并调用该过程就可以非常方便的得到查询结果。将以下四段代码分别保存为 asp11a.asp、asp11b.asp、asp11c.asp、asp11d.asp 四个 .asp 文件。 <br/><br/> < HEAD>< TITLE>asp11a.asp< /TITLE>< /HEAD><br/> < HTML>< body bgcolor="#FFFFFF"><br/> < %<br/> call query2table("select * from publishers where name like 'A%%'")<br/>' 将表 publishers 中所有姓名中有字母 A 的记录查询出来 <br/> %><br/> < !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML><br/><br/><br/> < HEAD>< TITLE>asp11b.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF"><br/> < %<br/> call query2table("select * from titles where Year_Published > = 1998")<br/>' 将表 titles 中所有发表年份大于或等于 1998 年的记录查询出来 <br/> %><br/> < !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML><br/><br/><br/> < HEAD>< TITLE>asp11c.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF"><br/> < %<br/> call query2table("select * from publishers where amount>10000 and sex='male'")<br/>' 将表 publishers 中所有数量大于 10000 且性别为男的记录查询出来 <br/> %><br/> < !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML><br/><br/><br/> < HEAD>< TITLE>asp11d.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF"><br/> < %<br/> call query2table("select * from publishers where state< > 'NY'")<br/>'将表 publishers 中所有所在城市不为纽约的记录查询出来。<br/> %><br/> < !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML><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>
作者:
翔羽
时间:
2006-2-24 09:22
< %<br/>If Application("NumVisits")< 999 then<br/>Application("NumVisits")=999<br/>End If<br/>Application.Lock<br/>Application("NumVisits")=Application("NumVisits")+1<br/>Application.Unlock<br/>%><br/>欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !<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<'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/>
作者:
翔羽
时间:
2006-2-24 09:22
<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/><%= "'auth_user' is " & request.servervariables("auth_user")%><br/><
><br/><%= "'auth_type' is " & request.servervariables("auth_type")%><br/><
><br/><%= "connection string is " & session("your_connectionstring")%><br/><
> <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>
作者:
翔羽
时间:
2006-2-24 09:22
<p><strong>asp的19个基本技巧 </strong></p><hr/><p>1. 现在的日期时间命令是<br/><%=now%> 即可</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/><% for i=1 to 5 %><br/><font size=<% =i %> color=#00ffff><br/>快速ASP<br/></font><br/><br><br/><% next %></p><p>5.传送字符串到用户端<br/>response.write string<br/>如:<% response.write "Welcome" %></p><p>6.链接到指定的URL地址<br/>response.redirect url<br/>如:<br/><% response.redirect "homepage.asp"<br/>%></p><p>*但是如果此.ASP的文件内容已经传送到用户断,则再用redirect时会发生错误。</p><p>7.其他语言与ASP的结合:<br/>如:早上显示早安,下午显示你好<br/><%<br/>if time>+#12:00:00 AM# and time<#12:00:00 PM #<br/>then<br/>greeting="早安!"<br/>else<br/>greeting="你好!"<br/>end if<br/>%><br/><%=greeting %></p><p>8.<script>标记在ASP中的应用<br/>例:</p><p><html><br/><body><br/><% call function1 %><br/></body><br/></html><br/><script runat=server language=javascript><br/>function function1()<br/>{<br/>...<br/>}<br/></script></p><p>9.#include 包括其它文件<br/><!--#include virtual|file="filename"--><br/>virtual指虚拟的文件地址。<br/>file 代表绝对的文件地址。<br/>如:<br/><!--#include virtual="/booksamp/test.asp"--><br/><!--#include file="/test/test.asp"--></p><p>而且可以层层嵌套。另外#include 不能在<%--%>之内</p><p>10.ASP取得表格输入数据的方法<br/>:GET POST<br/>一.get:用户端将数据加到URL后,格式为”?字段1=输入数据1&字段2=输入数据2&...",<br/>再将其送到服务器。<br/>如: action为www.abc.com, 字段Name输入数据为jack,字段age的数据为15,则用get方法为<br/>http://www.abc.com?Name=jack&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&Age=15"><br/>按此〈/A〉〈p〉<br/>Name:<%=request.QueryString("Name")%)<br/>Age:<%=request.QeueryString("Age")%)<br/>* get 范例<br/>·aspturm.asp:<br/><form action="asp1b.asp" method="get"><br/>姓名: <input type=text name="input1" value="Your name"><br/><p><br/>特征: <select name="input2"><br/><option>cool!<br/><option>handsome<br/><option>warmhearted<br/></select><br/><input type=submit value="ok"><br/></form><br/>asp1b.asp的内容<br/><html><body><br/><% =request.querystring("input1") %> hi, your character is<br/><%= request.querystring("input2") %><br/></body></html><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/><%<br/>forI=1 to request.fron("input1").count<br/>response.write request.From("input1")(I)&"<br>"<br/>next<br/>%><br/>若input1有两个值则都显示出<br/>*若未采用index指定读取哪个.可用<br/>〈%<br/>for each item request.From("input"))<br/>repomse.write item &"<br>"<br/>next<br/>%><br/>也可用" for each x in tewuest.From"重复取得所有字段的输入值。</p><p><% for each x in request.Form %><br/>request.From (<%=x%)=<%=request.Form<br/>(x)%> <br><br/><% next %></p><p><br/>12.<br/>获取客户端TCP/IP端口的方法:<br/>如: tcp/ip port is <%=request("server_port")%><br/>使用server_port可以得到接收HTTP request的连接port信息</p><p><br/>13.<br/>通过HTTP_ACCEPT_LANGUAGE的HTTP表头信息,可以得到用户端的使用语言<br/>环境.<br/>以下例子判断用户端的语言环境,给出不同的页面.<br/><% language=request.servervariables("HTTP_ACCEPT_LANGUAGE")<br/>if language="en" then %><br/><!--#include file="english.asp"><br/><% else %><br/><!--#include file="china.asp"><br/><% end if%></p><p>14.主页保留的期限<br/>如果用户端浏览器在一个主页保留的期限内,再度浏览此主页,则原在用<br/>户端硬盘上的主页内容将被显示.<br/>response.expires[=number]<br/>其中NUMBER为记录数据盒(PAGE BOX)的保留期限,单位是分钟.<br/>或:<br/>response.expiresabsolute[=[date][time]]<br/>如:设定一个主页保留期到某个日子.</p>
作者:
翔羽
时间:
2006-2-24 09:23
<p>15.连接到指定的URL地址<br/>如:你希望确认用户已经看过INDEX.HTM,则可以检查是否已经看过,如<br/>尚未确认,则自动连接到首页<br/><%<br/>if not session("BEEN_to_home_page") then<br/>response.redirect "index.asp"<br/>end if<br/>%></p><p>16.判断是回到本页还是第一次进入<br/><%<br/>if user_has_been_here_before then<br/>response.write "<h3 align=center> Welcome Back<br/>again"<br/>else<br/>response.write "Welcome!"<br/>end if<br/>%></p><p><br/>17.显示数据库中的图片与超级连接</p><p><%<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/>%></p><p><p><br/><tabel><br/><tr><br/><% for i=0 to rs.fields.count-1 %><br/><td><br/><b><br/><%=rs(i).name %><br/></b><br/></td><br/><% next %><br/></tr><br/><% do while not rs.eof %><br/><tr><br/><% for i=0 to rs.fields.count-1 %><br/><td valign =top><br/><%<br/>if rs(i).name="image" then<br/>response.write "<img src="""&rs(i)&""" >"<br/>else<br/>if rs(i).name="url" then<br/>response.write "<a href="""&rs(i)&""">"&rs(i)&"</a>"<br/>else<br/>response.write rs(i)<br/>end if<br/>end if<br/>%><br/></td><br/><%next%><br/></tr><br/><% rs.movenext<br/>loop<br/>rs.close<br/>conn.close<br/>%><br/></html></p><p></p><p>18. 用ASP取得浏览器信息<br/><%<br/>set a=server.creatobject("MSWC.BROWSERTYPE")<br/>msg="您使用的浏览器是:"+a.browser+"version"+a.version<br/>%><br/><%=msg%></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程序段必须放在<html>标记<br/>之前。而且不可以有任何的其他html代码<br/>@ COOKIES中必须使用expires设定有效期, COOKIES才能真正的<br/>写入客户端硬盘中。如:<br/>response.cookies("待写入的名称“).expires=#july 1,1998#<br/>或response.cookies("名称").expires=DATE+365</p><p></p><p> </p>
作者:
翔羽
时间:
2006-2-24 09:23
<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><%</p><p>... ...</p><p>if session("s_in")<>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")="游客" & 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")<>"" then '如果用户已经通过登录框登录<br/>rs.open "select * from online where id='" & session.sessionID & "'",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>%></p><p>... ...</p><p><head></p><p>... ...</p><p><script language=javascript><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/></script></p><p>... ...</p><p></head></p><p>... ...</p><p>==========================================================</p><p>onceonline.asp</p><p><%<br/>rs.open "select tt from online where id='" & session.sessionID & "'",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())>60",conn,3,1 '删除超时用户<br/>%></p><p>==============================================================</p><p>这样,基本保证了数据库中用户列表的实时性,误差取决于更新时间和删除时间的差值大小和服务器的处理速度,建议不要将删除超时用户的时间间隔取的过于小,那样有可能会导致在线用户0人的失误。</p>
作者:
翔羽
时间:
2006-2-24 09:23
<p><strong>一个很简单的验证码程序</strong></p><hr/><p>主程序共三个 </p><p>我的调用方式 <script language="javascript" src="/verify/num.asp"></script> <br/>验证方式 if trim(Loginnum)<>trim(session("Loginnum")) then <br/>Response.Write Error("验证码错误!") <br/>Response.End <br/>end if </p><p><br/>num.asp </p><p><% <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 <--- 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 & Hex(Asc(strTemp) * intKey)& Hex(intKey) <br/>Next </p><p>EncryptString = CharHexSet & "|" & Hex(intOffSet + intKey) & "|" & 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 & 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 <> "" 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/>%> <br/>document.write("<img src='/verify/count.asp?sksid=<%=num2%>'>") ' 这里是调用图片的路径 </p><p>count.asp </p><p><br/><!--#include file="numimg.asp"--> </p><p><% <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 <--- 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 & Hex(Asc(strTemp) * intKey)& Hex(intKey) <br/>Next </p><p>EncryptString = CharHexSet & "|" & Hex(intOffSet + intKey) & "|" & 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 & 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 <> "" 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/>%> </p>
作者:
翔羽
时间:
2006-2-24 09:24
<% <br/>Dim Image <br/>Dim Width, Height <br/>Dim num <br/>Dim digtal <br/>Dim Length <br/>Dim sort <br/>Length = 4 '自定计数器长度 <p>Redim sort( Length ) </p><p>num=cint(DeCryptString(request.querystring("sksid"))) <br/>digital = "" <br/>For I = 1 To Length -Len( num ) '补0 <br/>digital = digital & "0" <br/>Next <br/>For I = 1 To Len( num ) <br/>digital = digital & Mid( num, I, 1 ) <br/>Next <br/>For I = 1 To Len( digital ) <br/>sort(I) = Mid( digital, I, 1 ) <br/>Next <br/>Width = 8 * Len( digital ) '图像的宽度 <br/>Height = 10 '图像的高度,在本例中为固定值 </p><p><br/>Response.ContentType="image/x-xbitmap" </p><p>hc=chr(13) & chr(10) </p><p>Image = "#define counter_width " & Width & hc <br/>Image = Image & "#define counter_height " & Height & hc <br/>Image = Image & "static unsigned char counter_bits[]={" & hc </p><p>For I = 1 To Height <br/>For J = 1 To Length <br/>Image = Image & a(sort(J),I) & "," <br/>Next <br/>Next </p><p>Image = Left( Image, Len( Image ) - 1 ) '去掉最后一个逗号 <br/>Image = Image & "};" & hc <br/>%> <br/><% <br/>Response.Write Image </p><p>%> </p><p></p><p>numimg.asp </p><p></p><p><% <br/>Dim a(10,10) </p><p>a(0,1) = "0x3c" '数字0 <br/>a(0,2) = "0x66" <br/>a(0,3) = "0xc3" <br/>a(0,4) = "0xc3" <br/>a(0,5) = "0xc3" <br/>a(0,6) = "0xc3" <br/>a(0,7) = "0xc3" <br/>a(0,8) = "0xc3" <br/>a(0,9) = "0x66" <br/>a(0,10)= "0x3c" </p><p>a(1,1) = "0x18" '数字1 <br/>a(1,2) = "0x1c" <br/>a(1,3) = "0x18" <br/>a(1,4) = "0x18" <br/>a(1,5) = "0x18" <br/>a(1,6) = "0x18" <br/>a(1,7) = "0x18" <br/>a(1,8) = "0x18" <br/>a(1,9) = "0x18" <br/>a(0,10)= "0x7e" </p><p><br/>a(2,1) = "0x3c" '数字2 <br/>a(2,2) = "0x66" <br/>a(2,3) = "0x60" <br/>a(2,4) = "0x60" <br/>a(2,5) = "0x30" <br/>a(2,6) = "0x18" <br/>a(2,7) = "0x0c" <br/>a(2,8) = "0x06" <br/>a(2,9) = "0x06" <br/>a(2,10)= "0x7e" </p><p>a(3,1) = "0x3c" '数字3 <br/>a(3,2) = "0x66" <br/>a(3,3) = "0xc0" <br/>a(3,4) = "0x60" <br/>a(3,5) = "0x1c" <br/>a(3,6) = "0x60" <br/>a(3,7) = "0xc0" <br/>a(3,8) = "0xc0" <br/>a(3,9) = "0x66" <br/>a(3,10)= "0x38" </p><p>a(4,1) = "0x38" '数字4 <br/>a(4,2) = "0x3c" <br/>a(4,3) = "0x36" <br/>a(4,4) = "0x33" <br/>a(4,5) = "0x33" <br/>a(4,6) = "0x33" <br/>a(4,7) = "0xff" <br/>a(4,8) = "0x30" <br/>a(4,9) = "0x30" <br/>a(4,10)= "0xfe" </p><p>a(5,1) = "0xfe" '数字5 <br/>a(5,2) = "0xfe" <br/>a(5,3) = "0x06" <br/>a(5,4) = "0x06" <br/>a(5,5) = "0x3e" <br/>a(5,6) = "0x60" <br/>a(5,7) = "0xc0" <br/>a(5,8) = "0xc3" <br/>a(5,9) = "0x66" <br/>a(5,10)= "0x3c" </p><p>a(6,1) = "0x60" '数字6 <br/>a(6,2) = "0x30" <br/>a(6,3) = "0x18" <br/>a(6,4) = "0x0c" <br/>a(6,5) = "0x3e" <br/>a(6,6) = "0x63" <br/>a(6,7) = "0xc3" <br/>a(6,8) = "0xc3" <br/>a(6,9) = "0x66" <br/>a(6,10) ="0x3c" </p><p>a(7,1) = "0xff" '数字7 <br/>a(7,2) = "0xc0" <br/>a(7,3) = "0x60" <br/>a(7,4) = "0x30" <br/>a(7,5) = "0x18" <br/>a(7,6) = "0x18" <br/>a(7,7) = "0x18" <br/>a(7,8) = "0x18" <br/>a(7,9) = "0x18" <br/>a(7,10)= "0x18" </p><p>a(8,1) = "0x3c" '数字8 <br/>a(8,2) = "0x66" <br/>a(8,3) = "0xc3" <br/>a(8,4) = "0x66" <br/>a(8,5) = "0x3c" <br/>a(8,6) = "0x66" <br/>a(8,7) = "0xc3" <br/>a(8,8) = "0xc3" <br/>a(8,9) = "0x66" <br/>a(8,10)= "0x3c" </p><p>a(9,1) = "0x3c" '数字9 <br/>a(9,2) = "0x66" <br/>a(9,3) = "0xc3" <br/>a(9,4) = "0xc3" <br/>a(9,5) = "0x66" <br/>a(9,6) = "0x3c" <br/>a(9,7) = "0x18" <br/>a(9,8) = "0x0c" <br/>a(9,9) = "0x06" <br/>a(9,10)= "0x03" </p><p>%><br/></p>
作者:
翔羽
时间:
2006-2-24 09:24
<strong>分页代码例子<hr/></strong><p><br/><%''本程序文件名为:Pages.asp%><br/><%''包含ADO常量表文件adovbs.inc,可从"\Program Files\Common Files\System\ADO"目录下拷贝%><br/><!--#Include File="adovbs.inc"--><br/><%''*建立数据库连接,这里是Oracle8.05数据库<br/>Set conn=Server.CreateObject("ADODB.Connection") <br/>conn.Open "
rovider=msdaora.1;Data Source=YourSrcName;User ID=YourUserID
assword=YourPassword;" </p><p>Set rs=Server.CreateObject("ADODB.Recordset") ''创建Recordset对象<br/>rs.CursorLocation=adUseClient ''设定记录集指针属性<br/>''*设定一页内的记录总数,可根据需要进行调整 <br/>rs.PageSize=10 </p><p>''*设置查询语句 <br/>StrSQL="Select ID,姓名,住址,电话 from 通讯录 Order By ID" <br/>rs.Open StrSQL,conn,adOpenStatic,adLockReadOnly,adCmdText<br/>%><br/><HTML><br/><HEAD><br/><title>分页示例</title><br/><script language=javascript><br/>//点击"[第一页]"时响应:<br/>function PageFirst()<br/>{ <br/>document.MyForm.CurrentPage.selectedIndex=0;<br/>document.MyForm.CurrentPage.onchange();<br/>}<br/>//点击"[上一页]"时响应:<br/>function PagePrior()<br/>{ <br/>document.MyForm.CurrentPage.selectedIndex--;<br/>document.MyForm.CurrentPage.onchange();<br/>}<br/>//点击"[下一页]"时响应:<br/>function PageNext()<br/>{ <br/>document.MyForm.CurrentPage.selectedIndex++;<br/>document.MyForm.CurrentPage.onchange(); <br/>}<br/>//点击"[最后一页]"时响应:<br/>function PageLast()<br/>{ <br/>document.MyForm.CurrentPage.selectedIndex=document.MyForm.CurrentPage.length-1;<br/>document.MyForm.CurrentPage.onchange();<br/>}<br/>//选择"第?页"时响应:<br/>function PageCurrent()<br/>{ //Pages.asp是本程序的文件名<br/>document.MyForm.action='Pages.asp?Page='+(document.MyForm.CurrentPage.selectedIndex+1)<br/>document.MyForm.submit();<br/>} <br/></Script><br/></HEAD><br/><BODY bgcolor="#ffffcc" link="#008000" vlink="#008000" alink="#FF0000""><br/><br/><%IF rs.Eof THEN<br/>Response.Write("<font size=2 color=#000080>[数据库中没有记录!]</font>")<br/>ELSE <br/>''指定当前页码<br/>If Request("CurrentPage")="" Then<br/>rs.AbsolutePage=1<br/>Else<br/>rs.AbsolutePage=CLng(Request("CurrentPage"))<br/>End If <br/><br/>''创建表单MyForm,方法为Get<br/>Response.Write("<form method=Get name=MyForm>") <br/>Response.Write("<p align=center><font size=2 color=#008000>")<br/>''设置翻页超链接<br/>if rs.PageCount=1 then <br/>Response.Write("[第一页] [上一页] [下一页] [最后一页] ")<br/>else <br/>if rs.AbsolutePage=1 then<br/>Response.Write("[第一页] [上一页] ")<br/>Response.Write("[<a href=javascript
ageNext()>下一页</a>] ") <br/>Response.Write("[<a href=javascript
ageLast()>最后一页</a>] ") <br/>else <br/>if rs.AbsolutePage=rs.PageCount then<br/>Response.Write("[<a href=javascript
ageFirst()>第一页</a>] ") <br/>Response.Write("[<a href=javascript
agePrior()>上一页</a>] ") <br/>Response.Write("[下一页] [最后一页] ")<br/>else<br/>Response.Write("[<a href=javascript
ageFirst()>第一页</a>] ") <br/>Response.Write("[<a href=javascript
agePrior()>上一页</a>] ") <br/>Response.Write("[<a href=javascript
ageNext()>下一页</a>] ") <br/>Response.Write("[<a href=javascript
ageLast()>最后一页</a>] ") <br/>end if<br/>end if<br/>end if<br/><br/>''创建下拉列表框,用于选择浏览页码<br/>Response.Write("第<select size=1 name=CurrentPage onchange=PageCurrent()>") <br/>For i=1 to rs.PageCount <br/>if rs.AbsolutePage=i then<br/>Response.Write("<option selected>"&i&"</option>") ''当前页码<br/>else<br/>Response.Write("<option>"&i&"</option>")<br/>end if <br/>Next <br/>Response.Write("</select>页/共"&rs.PageCount&"页 共"&rs.RecordCount&"条记录</font><p>") <br/>Response.Write("</form>")<br/><br/>''创建表格,用于显示<br/>Response.Write("<table align=center cellspacing=1 cellpadding=1 border=1") <br/>Response.Write(" bordercolor=#99CCFF bordercolordark=#b0e0e6 bordercolorlight=#000066>")<br/><br/>Response.Write("<tr bgcolor=#ccccff bordercolor=#000066>") <br/><br/>Set Columns=rs.Fields <br/><br/>''显示表头<br/>For i=0 to Columns.Count-1<br/>Response.Write("<td align=center width=200 height=13>")<br/>Response.Write("<font size=2><b>"&Columns(i).name&"</b></font></td>") <br/>Next<br/>Response.Write("</tr>")<br/>''显示内容<br/>For i=1 to rs.PageSize <br/>Response.Write("<tr bgcolor=#99ccff bordercolor=#000066>") <br/>For j=0 to Columns.Count-1 <br/>Response.Write("<td><font size=2>"&Columns(j)&"</font></td>") <br/>Next<br/>Response.Write("</tr>")<br/><br/>rs.movenext <br/>if rs.EOF then exit for <br/>Next<br/><br/>Response.Write("</table>") </p><p>END IF<br/>%><br/></BODY><br/></HTML><br/></p>
作者:
翔羽
时间:
2006-2-24 09:24
<strong>新闻生成的例子<hr/></strong><p>====================================asptohtml1.asp<br/><html><br/><head><br/><title>Untitled Document</title><br/><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br/></head></p><p><body bgcolor="#FFFFFF" text="#000000"><br/><div align="center"><br/><form name="form1" method="post" action="asptohtml2.asp"><br/>标题: <br/><input type="text" name="biaoti"><br/><br><br/>正文:<br/><textarea name="neirong"></textarea><br/><br><br/><input type="submit" name="Submit" value="Submit"><br/></form><br/></div><br/></body><br/></html><br/>=========================asptohtml2.asp<br/><%<br/>biaoti=request("biaoti")<br/>neirong=request("neirong")<br/>set fileobj=server.createobject("scripting.filesystemobject")<br/>filepath=server.mappath("./")&"/"&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&".html"<br/>response.write filepath<br/>set filewrite=fileobj.opentextfile(filepath,2,true)<br/>filewrite.write biaoti&"<br>"<br/>filewrite.write neirong<br/>set fileobj=nothing<br/>%></p><p><br/>这样呢会在你的当前目录下生成一个根据日期及时分钟为文件名的.html文件,这样你需要做得就是把这个文件名,及文件的标题保存到一个表里,然后再输入这个表就可以了<br/>如:表中的字段有id,biaoti,timee(分别为,文件的id编号,带连接的文件名,生成时间)<br/>当然,你还可以再加上你需的字段,我这里只是举一个例子<br/>在html文件生成了后,你需要向这个表中的biaoti填加一条记录(如:<a href=文件名>提交后的文件名</a>)</p><p>最后你只要输出这个表的所有内容就行了</p>
作者:
翔羽
时间:
2006-2-24 09:24
<p><strong>利用XMLHTTP 从其他页面获取数据</strong></p><hr/><p>我们在编写ASP代码的时候,大家都知道可以通过post或者get获得form表单的数据,那么我们如何直接获得其他页面上的数据呢?这就要借助xmlhttp协议了。xmlhttp是xmldom技术的一部分。</p><p>下面的代码就是一个很简单的例子,我们利用xmlhttp技术,把http://www.xxxx.com/站点首页的代码以xml的形式完全获取,并且在页面中输出。</p><p><%<br/>Dim objXMLHTTP, xml<br/>Set xml = Server.CreateObject("Microsoft.XMLHTTP")<br/><br/>xml.Open "GET", "http://www.codetoad.com/", False<br/>' Pull the data from the web page<br/>xml.Send</p><p>Response.write "Here's the html we now have in our xml object"<br/>Response.write "<BR><BR><BR>"<br/>Response.Write "<xmp>"<br/>Response.Write xml.responseText<br/>Response.Write "</xmp>"<br/>Response.write "<BR><BR><BR>"<br/>Response.write " Now here's how the page looks:<BR><BR>"<br/>Response.Write xml.responseText</p><p>Set xml = Nothing<br/>%></p><p><br/>下面是另一个实例</p><p><%<br/>dim objHTTP , objXML , objXSL<br/>set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")<br/>objHTTP.open "GET", "http://p.moreover.com/cgi-local/page?c=Pop%20music%20reviews&o=xml", false<br/>objHTTP.send<br/>set objXML = objHTTP.responseXML<br/>set objXSL=Server.CreateObject("microsoft.xmldom")<br/>objXSL.async=false</p><p>objXSL.load(Server.MapPath("style.xsl"))</p><p>if (objXSL.parseError.errorCode = 0) then<br/>Response.Write(objXML.transformnode(objXSL))<br/>else<br/>Response.Write "Error: " & objXSL.parseError.reason & " URL:" & objXSL.url<br/>end if</p><p>Set objHTTP = Nothing<br/>Set objXML = Nothing<br/>Set objXSL = Nothing<br/>%></p><p>style.xsl:<br/><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"><br/><xsl:template match="/"></p><p><html><br/><head><br/><TITLE>moreover...</TITLE><br/></head><br/><body BGCOLOR="ffffff"></p><p></p><p><br/><DIV ALIGN="center"><br/><TABLE BGCOLOR="ffffff" BORDER="0" CELLPADDING="4" CELLSPACING="0" WIDTH="100%"></p><p><xsl:for-each select="moreovernews/article"><br/><br/><TR VALIGN="middle"><br/><TD ALIGN="left" BGCOLOR="ffffff"><br/><br/><br/><xsl:attribute name="HREF"><br/><xsl:value-of select="url"/><br/></xsl:attribute><br/><xsl:attribute name="TARGET"><br/>_blank<br/></xsl:attribute><br/><br/><xsl:value-of select="headline_text"/><br/><br/><br/><br/><br/><br/><xsl:attribute name="HREF"><br/><xsl:value-of select="document_url"/><br/></xsl:attribute><br/><xsl:attribute name="TARGET"><br/>_blank<br/></xsl:attribute><br/><br/><xsl:value-of select="source"/><br/><br/><br/><br/><xsl:attribute name="HREF"><br/><xsl:value-of select="access_registration"/><br/></xsl:attribute><br/><xsl:attribute name="TARGET"><br/>_blank<br/></xsl:attribute><br/><br/><xsl:value-of select="access_status"/><br/><br/><br/><br/><xsl:value-of select="harvest_time"/> GMT<br/><br/></TD><br/></TR><br/><br/></xsl:for-each></p><p><br/></TABLE><br/></DIV><br/></body><br/></html><br/></xsl:template><br/></xsl:stylesheet><br/></p>
作者:
翔羽
时间:
2006-2-24 09:25
<p><strong>防止从外部提交数据的方法</strong></p><hr/><p>第一种做法,屏蔽特殊字符和关键字</p><p>fqys=request.servervariables("query_string") </p><p>dim nothis(18) </p><p>nothis(0)="net user" </p><p>nothis(1)="xp_cmdshell" </p><p>nothis(2)="/add" </p><p>nothis(3)="exec%20master.dbo.xp_cmdshell" </p><p>nothis(4)="net localgroup administrators" </p><p>nothis(5)="select" </p><p>nothis(6)="count" </p><p>nothis(7)="asc" </p><p>nothis(8)="char" </p><p>nothis(9)="mid" </p><p>nothis(10)="'" </p><p>nothis(11)=":" </p><p>nothis(12)="""" </p><p>nothis(13)="insert" </p><p>nothis(14)="delete" </p><p>nothis(15)="drop" </p><p>nothis(16)="truncate" </p><p>nothis(17)="from" </p><p>nothis(18)="%" </p><p>errc=false </p><p>for i= 0 to ubound(nothis) </p><p>if instr(FQYs,nothis(i))<>0 then </p><p>errc=true </p><p>end if </p><p>next </p><p>if errc then </p><p>response.write "<script language=""javascript"">" </p><p>response.write "parent.alert('很抱歉!你正在试图攻击本服务器或者想取得本服务器最高管理权!将直接转向首页..');" </p><p>response.write "self.location.href='default.asp';" </p><p>response.write "</script>" </p><p>response.end </p><p>end if </p><hr/><p>第二种可以防止客户从本地提交到网站上</p><p><% </p><p>server_v1=Cstr(Request.ServerVariables("HTTP_REFERER")) </p><p>server_v2=Cstr(Request.ServerVariables("SERVER_NAME")) </p><p>if mid(server_v1,8,len(server_v2))<>server_v2 then </p><p>response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>" </p><p>response.write "<tr><td style=font:9pt Verdana>" </p><p>response.write "你提交的路径有误,禁止从站点外部提交数据请不要乱该参数!" </p><p>response.write "</td></tr></table></center>" </p><p>response.end </p><p>end if </p><p>%> </p><hr/><p>第三。这样可以防止在输入框上打上or 1=1 的字样 </p><p>If Instr(request("username"),"=")>0 or </p><p>Instr(request("username"),"%")>0 or </p><p>Instr(request("username"),chr(32))>0 or </p><p>Instr(request("username"),"?")>0 or </p><p>Instr(request("username"),"&")>0 or </p><p>Instr(request("username"),";")>0 or </p><p>Instr(request("username"),",")>0 or </p><p>Instr(request("username"),"'")>0 or </p><p>Instr(request("username"),"?")>0 or </p><p>Instr(request("username"),chr(34))>0 or </p><p>Instr(request("username"),chr(9))>0 or </p><p>Instr(request("username"),"?")>0 or </p><p>Instr(request("username"),"$")>0 or </p><p>Instr(request("username"),">")>0 or </p><p>Instr(request("username"),"<")>0 or </p><p>Instr(request("username"),"""")>0 then </p>
作者:
翔羽
时间:
2006-2-24 09:25
<p><strong>ASP用JMail、CDO发送邮件 </strong></p><hr/><p> 前一段时间有发过一个简单的JMAIL邮件发邮件的代码,今天就把这个代码做一个具体的注解,并增加了另外两个格式的代码,并举几个简单的例子:<br/> 首先是jmail.smtpmail的核心代码:</p><p><%<br/>Set jmail = Server.CreateObject("JMAIL.SMTPMail") '创建一个JMAIL对象<br/>jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE<br/>jmail.logging = true '启用使用日志<br/>jmail.Charset = "GB2312" '邮件文字的代码为简体中文<br/>jmail.ContentType = "text/html" '邮件的格式为HTML的<br/>jmail.ServerAddress = "Server Address" '发送邮件的服务器<br/>jmail.AddRecipient Email '邮件的收件人<br/>jmail.SenderName = "SenderName" '邮件发送者的姓名<br/>jmail.Sender = "Email Address" '邮件发送者的邮件地址<br/>jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值<br/>jmail.Subject = "Mail Subject" '邮件的标题<br/>jmail.Body = "Mail Body" '邮件的内容<br/>jmail.AddRecipientBCC Email '密件收件人的地址<br/>jmail.AddRecipientCC Email '邮件抄送者的地址<br/>jmail.Execute() '执行邮件发送<br/>jmail.Close '关闭邮件对象<br/>%></p><p> w3 Jmail4.3组件重新设计了其内部结构——使用Message对象代替原来的单一对象Jmail.smtpmail发送邮件,有些方法需要身份验证的(如163、yahoo等),可以用下面的方法解决:<br/><%<br/>Set jmail = Server.CreateObject("JMAIL.Message") '建立发送邮件的对象<br/>jmail.silent = true '屏蔽例外错误,返回FALSE跟TRUE两值j<br/>mail.logging = true '启用邮件日志<br/>jmail.Charset = "GB2312" '邮件的文字编码为国标<br/>jmail.ContentType = "text/html" '邮件的格式为HTML格式<br/>jmail.AddRecipient Email '邮件收件人的地址<br/>jmail.From = "Email From for Sender" '发件人的E-MAIL地址<br/>jmail.MailServerUserName = "UserName of Email" '登录邮件服务器所需的用户名<br/>jmail.MailServerPassword = "
assword of Email" '登录邮件服务器所需的密码<br/>jmail.Subject = "Mail Subject" '邮件的标题 <br/>jmail.Body = "Mail Body" '邮件的内容<br/>jmail.Prority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值<br/>jmail.Send("Server Address") '执行邮件发送(通过邮件服务器地址)<br/>jmail.Close() '关闭对象<br/>%></p><p> 再讲一下微软自带的CDONTS组件的发信的方法: </p><p><%<br/>Set cdomail = Server.CreateObject("CDONTS.NewMail") '建立邮件对象<br/>cdomail.Subject = "Mail Subject" '邮件标题<br/>cdomail.From = "Sender's Mail" '发件人的地址<br/>cdomail.To = "Email will from" '收件人的地址<br/>cdomail.Body = "Mail Body" '邮件的内容<br/>cdomail.Send '执行发送<br/>%></p><p> 这种方法发送邮件是最简单的,同时也带来一定的问题,就是很少有服务器会开这项服务!</p><p><br/> 我们写程序,一般情况下都是说要代码模块化,这样方便维护,同时也方便移植。因此,我在这里将这个发邮件的写成一个子程,在调用的时候可以直接调用(当然,如果你高兴写成函数的话也是可以的,这个主要是看个人兴趣):</p><p><%<br/>'参数说明<br/>'Subject : 邮件标题<br/>'MailAddress : 发件服务器的地址,如smtp.163.com<br/>'Email : 收件人邮件地址<br/>'Sender : 发件人姓名<br/>'Content : 邮件内容<br/>'Fromer : 发件人的邮件地址</p><p>Sub SendAction(subject, mailaddress, email, sender, content, fromer) <br/>Set jmail = Server.CreateObject("JMAIL.SMTPMail") '创建一个JMAIL对象<br/>jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE<br/>jmail.logging = true '启用使用日志<br/>jmail.Charset = "GB2312" '邮件文字的代码为简体中文<br/>jmail.ContentType = "text/html" '邮件的格式为HTML的<br/>jmail.ServerAddress = mailaddress '发送邮件的服务器<br/>jmail.AddRecipient Email '邮件的收件人<br/>jmail.SenderName = sender '邮件发送者的姓名<br/>jmail.Sender = fromer '邮件发送者的邮件地址<br/>jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值<br/>jmail.Subject = subject '邮件的标题<br/>jmail.Body = content '邮件的内容<br/>'由于没有用到密抄跟抄送,这里屏蔽掉这两句,如果您有需要的话,可以在这里恢复<br/>'jmail.AddRecipientBCC Email '密件收件人的地址<br/>'jmail.AddRecipientCC Email '邮件抄送者的地址<br/>jmail.Execute() '执行邮件发送<br/>jmail.Close '关闭邮件对象<br/>End Sub<br/><br/>'调用此Sub的例子<br/>Dim strSubject,strEmail,strMailAdress,strSender,strContent,strFromer<br/>strSubject = "这是一封用JMAIL发送的测试邮件"<br/>strContent = "JMail组件发送测试成功!"<br/>strEmail = "runbing@eyou.com"<br/>strFromer = "runbing@eyou.com"<br/>strMailAddress = "mail.ubbcn.com"</p>
作者:
翔羽
时间:
2006-2-24 09:25
<p><strong>IP限制函数</strong></p><hr/><p>大家如果还有好的建议算法,就联系我!!:)</p><p>“******************************<br/>“Function CheckIp(cInput_Ip,cBound_Ip)<br/>“Created by qqdao, qqdao@263.net 2001/11/28<br/>“说明:首先需要根据;号循环,然后判断是否含有"-",如果有则进行拆分处理,最后判断是否在范围内<br/>“参数: cInput_Ip,代检查的ip<br/>“ cBound_Ip,给定的范围格式为,单个ip,和范围ip,范围ip最后使用”-“分割,如果是“*”则必须放到最后一位<br/>“ 每个范围后添加":ALLOW"表示允许登陆,添加":REFUSE"表示拒绝登陆。多个范围用”;“隔开<br/>“ 例如192.168.1*.*:ALLOW;192.168.1.1:ALLOW;192.168.1.1-10:REFUSE"<br/>“返回值: true/false<br/>“更新:2001/12/05 支持ALLOW,REFUSE支持’*‘,不想对?支持,因为和*差不多<br/>“******************************<br/>function CheckIp(cInput_Ip,cBound_Ip)<br/>dim cSingle_Ip,cTemp_IP,cStart_IP,cEnd_Ip<br/>CheckIp = false<br/>cSingle_Ip=split(cBound_Ip,";")</p><p>for i=0 to ubound(cSingle_Ip)<br/>if Instr(cSingle_Ip(i),"REFUSE") <> 0 then “就是拒绝了<br/>cTemp_IP = left(cSingle_Ip(i),instr(cSingle_Ip(i),":")-1)</p><p>if Instr(cTemp_IP,"*") <> 0 then “是宽范围<br/>cStart_IP = left(cTemp_IP,instr(cTemp_IP,"*")-1)<br/>if left(cInput_Ip,len(cStart_IP))=cStart_IP then<br/>CheckIp = false<br/>exit function<br/>end if<br/>end if</p><p>if Instr(cTemp_IP,"-") = 0 then<br/>cStart_IP = cTemp_IP<br/>cEnd_Ip = cTemp_IP<br/>else<br/>cStart_IP = left(cTemp_IP,instr(cTemp_IP,"-")-1)<br/>cEnd_Ip = left(cStart_IP,InStrRev(cStart_IP,".")-1)+"."+mid(cTemp_IP,instr(cTemp_IP,"-")+1)<br/>end if</p><p>if Ip2Str(cInput_Ip)>=Ip2Str(cStart_IP) and Ip2Str(cInput_Ip)<=Ip2Str(cEnd_Ip) then<br/>CheckIp = false<br/>exit function<br/>end if</p><p>elseif Instr(cSingle_Ip(i),"ALLOW") <> 0 then “允许</p><p>cTemp_IP = left(cSingle_Ip(i),instr(cSingle_Ip(i),":")-1)</p><p>if Instr(cTemp_IP,"*") <> 0 then “是宽范围<br/>cStart_IP = left(cTemp_IP,instr(cTemp_IP,"*")-1)<br/>if left(cInput_Ip,len(cStart_IP))=cStart_IP then<br/>CheckIp = true<br/>end if<br/>end if</p><p>if Instr(cTemp_IP,"-") = 0 then<br/>cStart_IP = cTemp_IP<br/>cEnd_Ip = cTemp_IP<br/>else<br/>cStart_IP = left(cTemp_IP,instr(cTemp_IP,"-")-1)<br/>cEnd_Ip = left(cStart_IP,InStrRev(cStart_IP,".")-1)+"."+mid(cTemp_IP,instr(cTemp_IP,"-")+1)<br/>end if</p><p>if Ip2Str(cInput_Ip)>=Ip2Str(cStart_IP) and Ip2Str(cInput_Ip)<=Ip2Str(cEnd_Ip) then<br/>CheckIp =true<br/>else<br/>CheckIp =false<br/>end if<br/>end if<br/>next</p><p>end function</p><p><br/>“******************************<br/>“Function Ip2Str(cIp)<br/>“Created by qqdao, qqdao@263.net 2001/11/28<br/>“参考动网ip算法<br/>“参数:cIp ip地址<br/>“返回值: 转换后数值<br/>“******************************<br/>function Ip2Str(cIp)<br/>Dim str1,str2,str3,str4<br/>Dim cIp_Temp<br/>if cIp="127.0.0.1" then cIp="192.168.0.1"<br/>str1=left(cIp,instr(cIp,".")-1)<br/>cIp_Temp=mid(cIp,instr(cIp,".")+1)<br/>str2=left(cIp_Temp,instr(cIp_Temp,".")-1)<br/>cIp_Temp=mid(cIp_Temp,instr(cIp_Temp,".")+1)<br/>str3=left(cIp_Temp,instr(cIp_Temp,".")-1)<br/>str4=mid(cIp_Temp,instr(cIp_Temp,".")+1)</p><p>if isNumeric(str1)=0 or isNumeric(str2)=0 or isNumeric(str3)=0 or isNumeric(str4)=0 then</p><p>else<br/>Ip2Str=cint(str1)*256*256*256+cint(str2)*256*256+cint(str3)*256+cint(str4)-1<br/>end if</p><p>end function <br/></p>
作者:
翔羽
时间:
2006-2-24 09:25
<p><strong>IP地址分段计算</strong></p><hr/><p><script language="JScript" Runat="Server"><br/>function IPDeCode(EIP){<br/>var Ip1,Ip2,Ip3,Ip4;<br/>Ip1 = moveByteR(EIP & 0xff000000,3);<br/>Ip2 = moveByteR(EIP & 0x00ff0000,2);<br/>Ip3 = moveByteR(EIP & 0x0000ff00,1);<br/>Ip4 = EIP & 0x000000ff;<br/>return Ip1 + "." + Ip2 + "." + Ip3 + "." + Ip4;<br/>}</p><p><br/>function moveByteL(num,bytenum){<br/>return num <<= (bytenum*8)<br/>}</p><p>function moveByteR(num,bytenum){<br/>return num >>>= (bytenum*8)<br/>}</p><p></script></p><p><br/>在vbs中没有位操作,这样在一个页面中用到了js和vbs,并不好,如果用vbs也可以,不过罗嗦了一些,而且有一点注意,如果在vbs中split("202.102.29.6","."),会得到202,102,29三个数,得不到最后一个6,所以需要将ip换成split("202.102.29.6" & ".",".")<br/>我用vbs做的,由于没有位操作,所以做得比较麻烦<br/><%<br/>function ip2int(ipstr)<br/>dim iptemp,max<br/>iptemp = split(ipstr&".",".")<br/>max = ubound(iptemp)<br/>if max <> 4 then<br/>exit function<br/>end if</p><p>dim a,b,i<br/>a = "&H"<br/>for i = 0 to 3<br/>b = Hex(iptemp(i))<br/>if len(b) = 1 then<br/>b = "0"&b<br/>end if<br/>a = a&b<br/>next<br/>ip2int = CLng(a)<br/>end function</p><p>function int2ip(ip)<br/>dim iptemp,a,ipstr,i,length<br/>iptemp = Hex(ip)<br/>length = 8 - len(iptemp)<br/>for i = 1 to length<br/>iptemp = "0" & iptemp<br/>next<br/>a = left(iptemp,2)<br/>a = "&H" & a<br/>i = CInt(a)<br/>a = CStr(i)<br/>ipstr = a & "."<br/>a = mid(iptemp,3,2)<br/>a = "&H" & a<br/>i = CInt(a)<br/>a = CStr(i)<br/>ipstr = ipstr & a & "."<br/>a = mid(iptemp,5,2)<br/>a = "&H" & a<br/>i = CInt(a)<br/>a = CStr(i)<br/>ipstr = ipstr & a & "."<br/>a = right(iptemp,2)<br/>a = "&H" & a<br/>i = CInt(a)<br/>a = CStr(i)<br/>ipstr = ipstr & a<br/>int2ip = ipstr<br/>end function</p><p>dim testIP,testInt<br/>testIP="202.102.29.6"<br/>testInt = ip2int(testIP)<br/>response.write testIP & " will be encoded to <font color=red>" & testInt & "</font><br>"<br/>response.write testIP & " will be dencoded to <font color=red>" & int2ip(testInt) & "</font><br>"<br/>%></p>
作者:
翔羽
时间:
2006-2-24 09:26
<p><strong>身份证验证代码函数</strong></p><hr/><p>Function CheckCardId(e)</p><p>arrVerifyCode = Split("1,0,x,9,8,7,6,5,4,3,2", ",")</p><p>Wi = Split("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2", ",")</p><p>Checker = Split("1,9,8,7,6,5,4,3,2,1,1", ",")<br/><br/>If Len(e) < 15 Or Len(e) = 16 Or Len(e) = 17 Or Len(e) > 18 Then<br/>CheckCardId= "身份证号共有 15 码或18位"<br/>CheckCardId = False<br/>Exit Function<br/>End If<br/><br/>Dim Ai<br/>If Len(e) = 18 Then<br/>Ai = Mid(e, 1, 17)<br/>ElseIf Len(e) = 15 Then<br/>Ai = e<br/>Ai = Left(Ai, 6) & "19" & Mid(Ai, 7, 9)<br/>End If<br/>If Not IsNumeric(Ai) Then<br/>CheckCardId= "身份证除最后一位外,必须为数字!"<br/><br/>Exit Function<br/>End If<br/>Dim strYear, strMonth, strDay<br/>strYear = CInt(Mid(Ai, 7, 4))<br/>strMonth = CInt(Mid(Ai, 11, 2))<br/>strDay = CInt(Mid(Ai, 13, 2))</p><p>BirthDay = Trim(strYear) + "-" + Trim(strMonth) + "-" + Trim(strDay)<br/>If IsDate(BirthDay) Then<br/>If DateDiff("yyyy",Now,BirthDay)<-140 or cdate(BirthDay)>date() Then<br/><br/>CheckCardId= "身份证输入错误!"</p><p>Exit Function<br/>End If<br/>If strMonth > 12 Or strDay > 31 Then<br/>CheckCardId= "身份证输入错误!"</p><p>Exit Function<br/>End If<br/>Else<br/>CheckCardId= "身份证输入错误!"</p><p>Exit Function<br/>End If<br/>Dim i, TotalmulAiWi<br/>For i = 0 To 16<br/>TotalmulAiWi = TotalmulAiWi + CInt(Mid(Ai, i + 1, 1)) * Wi(i)<br/>Next<br/>Dim modValue<br/>modValue = TotalmulAiWi Mod 11<br/>Dim strVerifyCode<br/>strVerifyCode = arrVerifyCode(modValue)<br/>Ai = Ai & strVerifyCode<br/>CheckCardId = Ai<br/><br/>If Len(e) = 18 And e <> Ai Then<br/>CheckCardId= "身份证号码输入错误!"<br/>Exit Function<br/>End If<br/>End Function</p><p>response.write CheckCardId("528337194801020025") '''''''''这个不知是谁的身份证,我一试就出来了~~~~~~~~~哈哈</p><p></p><p>'''''这个如果返回的是输入的身份证,则表明正确,否则会提示出错...</p>
作者:
翔羽
时间:
2006-2-24 09:26
<p><strong>Cookie读写例子</strong></p><hr/><p>writecookie.asp <br/><br/><%@ Language=VBScript <br/>%> <br/><%Response.Buffer=true%> <br/><HTML> <br/><HEAD> <br/><META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <br/><TITLE>写Cookie的示例</TITLE> <br/></HEAD> <br/><BODY> <br/><br/><% <br/>Response.Write "写Cookie:<br/>" <br/>Response.Cookies("Cookie1")("key1") = "KeyValue1" <br/>Response.Cookies("Cookie1")("key1") = "KeyValue2" <br/>Response.Cookies("Cookie1").Expires = "July 31, 1999" <br/><br/>Response.Cookies("Cookie2")("key2") = "KeyValue1" <br/>Response.Cookies("Cookie2")("key2") = "KeyValue2" <br/>Response.Cookies("Cookie2").Expires = "July 31, 1999" <br/>'Response.Cookies("Cookie2").Path = "/testasp/" <br/>'这个在使用的时候要注意 <br/>'是指定在那个目录的文件才可以读取这个cookie的内容。 <br/>'在本例子中。只有在testasp这目录下的文件才可以读取 <br/>'Cookie2的内容。 <br/>%> <br/><br/></BODY> <br/></HTML> <br/><br/>------------------------------------------------------- <br/>readwrite.asp <br/><br/><%@ Language=VBScript %> <br/><HTML> <br/><HEAD> <br/><META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <br/><TITLE>读Cookie的示例</TITLE> <br/></HEAD> <br/><BODY> <br/><br/><%Response.Write "读取Cookie:<br/>" <br/><br/>dim cookie,key <br/> <br/> for each cookie in Request.Cookies <br/>if Request.Cookies(cookie).haskeys then <br/>Response.Write "<br/>Cookie 名字:"&cookie&"<BR>--------------<BR>" <br/>for each key in Request.Cookies(cookie) <br/><br/>Response.Write "Key 名字:"&key&",值:"&Request.Cookies(cookie)(ke <br/>y)&"<BR>" <br/>next <br/>else <br/>Response.Write "Cookie 名字:"&Request.Cookies(cookie)&"<BR>" <br/>end if <br/> <br/> next <br/> <br/>%> <br/></BODY> <br/></HTML> <br/></p>
作者:
翔羽
时间:
2006-2-24 09:26
<strong>用Asp隐藏文件路径,实现防盗链 </strong><p></p><strong><hr/></strong> 如果我们知道一个静态文件的实际路径如:http://www.xx.com/download/51windows.pdf,如果服务器没有作特别的限制设置,我们就可以毫不费力的把它下载下来!当网站提供51windows.pdf下载时,怎么样才能让下载者无法得到他的实际路径呢!本文就来介绍如何使用Asp来隐藏文件的实际下载路径。 <p> 我们在管理网站文件时,可以把扩展名一样的文件放在同一个目录下,起一个比较特别名字,例如放pdf文件目录为the_pdf_file_s,把下面代码另存为down.asp,他的网上路径为http://www.xx.com/down.asp,我们就可以用http://www.xx.com/down.asp?FileName=51windows.pdf来下载这个文件了,而且下载者无法看到这个文件实际下载路径的!在down.asp中我们还可以设置下载文件是否需要登陆,判断下载的来源页是否为外部网站,从而可以做到防止文件被盗链。</p><p>示例代码:</p><p><%<br/>From_url = Cstr(Request.ServerVariables("HTTP_REFERER"))<br/>Serv_url = Cstr(Request.ServerVariables("SERVER_NAME"))<br/>if mid(From_url,8,len(Serv_url)) <> Serv_url then<br/>response.write "非法链接!" '防止盗链<br/>response.end<br/>end if</p><p>if Request.Cookies("Logined")="" then<br/>response.redirect "/login.asp" '需要登陆!<br/>end if<br/>Function GetFileName(longname)'/folder1/folder2/file.asp=>file.asp<br/>while instr(longname,"/")<br/>longname = right(longname,len(longname)-1)<br/>wend<br/>GetFileName = longname<br/>End Function<br/>Dim Stream<br/>Dim Contents<br/>Dim FileName<br/>Dim TrueFileName<br/>Dim FileExt<br/>Const adTypeBinary = 1<br/>FileName = Request.QueryString("FileName")<br/>if FileName = "" Then<br/>Response.Write "无效文件名!"<br/>Response.End<br/>End if<br/>FileExt = Mid(FileName, InStrRev(FileName, ".") + 1)<br/>Select Case UCase(FileExt)<br/>Case "ASP", "ASA", "ASPX", "ASAX", "MDB"<br/>Response.Write "非法操作!"<br/>Response.End<br/>End Select<br/>Response.Clear<br/>if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then<br/>Response.ContentType = "image/*" '对图像文件不出现下载对话框<br/>else<br/>Response.ContentType = "application/ms-download"<br/>end if<br/>Response.AddHeader "content-disposition", "attachment; filename=" & GetFileName(Request.QueryString("FileName"))<br/>Set Stream = server.CreateObject("ADODB.Stream")<br/>Stream.Type = adTypeBinary<br/>Stream.Open<br/>if lcase(right(FileName,3))="pdf" then '设置pdf类型文件目录<br/>TrueFileName = "/the_pdf_file_s/"&FileName<br/>end if <br/>if lcase(right(FileName,3))="doc" then '设置DOC类型文件目录<br/>TrueFileName = "/my_D_O_C_file/"&FileName<br/>end if<br/>if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then<br/>TrueFileName = "/all_images_/"&FileName '设置图像文件目录<br/>end if<br/>Stream.LoadFromFile Server.MapPath(TrueFileName)<br/>While Not Stream.EOS<br/>Response.BinaryWrite Stream.Read(1024 * 64)<br/>Wend<br/>Stream.Close<br/>Set Stream = Nothing<br/>Response.Flush<br/>Response.End<br/>%></p>
作者:
翔羽
时间:
2006-2-24 09:27
<p><strong>ASP进度条</strong></p><hr/><p>前段时间研究了一个进度条,大致的思想是<br/>在后台处理数据时,前台页面同时计数显示Proess Bar<br/>使用了layer来显示<br/>用法:<br/>1。引用<br/><script language="javascript" src="ShowProcessBar.js"></script><br/>2。在提交Button或<A>或<span> 加扩展属性<br/>IsShowProcessBar="True"</p><p><br/>文件ShowProcessBar.js如下</p><p>AddProcessbar();<br/>var bwidth=0;<br/>var swidth = document.all.waiting.clientWidth;</p><p>function CheckIsProcessBar(obj)<br/>{<br/>if (obj.IsShowProcessBar=="True") <br/>{<br/>return false;<br/>} <br/>else<br/>{<br/>return true;<br/>}<br/>}</p><p>function CheckClick(e)<br/>{<br/>if (e == 1)<br/>{<br/>if (bwidth<swidth*0.98){<br/>bwidth += (swidth - bwidth) * 0.025;<br/>if (document.all)document.sbar.width = bwidth;<br/>else document.rating.clip.width = bwidth;<br/>setTimeout('CheckClick(1);',150);</p><p>}<br/>}<br/>else<br/>{<br/>if(document.all)<br/>{<br/>if(document.all.waiting.style.visibility == 'visible')<br/>{document.all.waiting.style.visibility = 'hidden';<br/>bwidth = 1;}<br/>whichIt = event.srcElement;</p><p>while (CheckIsProcessBar(whichIt))<br/>{<br/>whichIt = whichIt.parentElement;<br/>if (whichIt == null)return true;<br/>}</p><p><br/>document.all.waiting.style.pixelTop = (document.body.offsetHeight - document.all.waiting.clientHeight) / 2 + document.body.scrollTop;<br/>document.all.waiting.style.pixelLeft = (document.body.offsetWidth - document.all.waiting.clientWidth) / 2 + document.body.scrollLeft;<br/>document.all.waiting.style.visibility = 'visible';<br/>if(!bwidth)CheckClick(1);<br/>bwidth = 1;</p><p>}</p><p>else<br/>{</p><p>if(document.waiting.visibility == 'show')<br/>{document.waiting.visibility = 'hide';<br/>document.rating.visibility = 'hide';<br/>bwidth = 1;}<br/>if(e.target.href.toString() != '')<br/>{<br/>document.waiting.top = (window.innerHeight - document.waiting.clip.height) / 2 + self.pageYOffset;<br/>document.waiting.left = (window.innerWidth - document.waiting.clip.width) / 2 + self.pageXOffset;<br/>document.waiting.visibility = 'show';<br/>document.rating.top = (window.innerHeight - document.waiting.clip.height) / 2 + self.pageYOffset+document.waiting.clip.height-10;<br/>document.rating.left = (window.innerWidth - document.waiting.clip.width) / 2 + self.pageXOffset;<br/>document.rating.visibility = 'show';<br/>if(!bwidth)CheckClick(1);<br/>bwidth = 1;<br/>}<br/>}<br/>return true;<br/>}<br/>}</p><p>function AddProcessbar()<br/>{</p><p>var Str=""<br/>Str+= "<div id=waiting style=position:absolute;top:50px;left:100px;z-index:1;visibility:hidden >";<br/>Str+= "<layer name=waiting visibility=visible zIndex=2 >"<br/>Str+= "<table border=2 cellspacing=1 cellpadding=0 bordercolorlight=#FFFFFF bordercolordark=#C0C0C0 bgcolor=#E0E0E0>"<br/>Str+= " <tr>"<br/>Str+= " <td bgcolor=#E0E0E0 height=30px width=300px align=center>"<br/>Str+= " <font color=black>系統正在處理中...</font>"<br/>Str+= " </td>"<br/>Str+= " </tr>"<br/>Str+= " <tr>"<br/>Str+= " <td bgcolor=#E0E0E0>"<br/>Str+= " <img width=1 height=10 name=sbar style=background-color:#6699cc>"<br/>Str+= " </td>"<br/>Str+= " </tr>"<br/>Str+= "</table> "<br/>Str+= "</layer>"<br/>Str+= "</div>"<br/>document.write(Str)</p><p>if(document.all)document.onclick = CheckClick; <br/>}</p><p><br/>测试文件TestShowBar.HTML</p><p><HTML><br/><HEAD><br/><script language="javascript" src="ShowProcessBar.js"></script><br/></HEAD><br/><BODY><br/><A href="error.asp" IsShowProcessBar="True">A Href</a><br/><BR><br/><BR><br/><span onclick="location.href='error.asp'" style="cursor:hand" IsShowProcessBar="True"><font color=blue>Span</font></span><br/><BR><br/><form action="error.asp"><br/><input type=Submit value="Submit"><br/><input type=button value="normal button" IsShowProcessBar="True"><br/></form><br/><
IsShowProcessBar="True">AAAAAAAAAAAAA</P><br/></BODY><br/></HTML> </p>
作者:
翔羽
时间:
2006-2-24 09:27
<p><strong>ASP生成柱型体,折线图,饼图源代码</strong></p><hr/><p><%<br/>function table2(total,table_x,table_y,all_width,all_height,line_no)<br/>'参数含义(传递的数组,横坐标,纵坐标,图表的宽度,图表的高度,折线条数)<br/>'纯ASP代码生成图表函数2——折线图<br/>'作者:龚鸣(Passwordgm) QQ:25968152 MSN:passwordgm@sina.com Email:passwordgm@sina.com<br/>'本人非常愿意和ASP,VML,FLASH的爱好者在HTTP://topclouds.126.com进行交流和探讨<br/>'版本1.0 最后修改日期 2003-8-11<br/>'非常感谢您使用这个函数,请您使用和转载时保留版权信息,这是对作者工作的最好的尊重。</p><p>line_color="#69f"<br/>left_width=70<br/>total_no=ubound(total,1)</p><p>temp1=0<br/>for i=1 to total_no<br/>for j=1 to line_no<br/>if temp1<total(i,j) then temp1=total(i,j)<br/>next<br/>next<br/>temp1=int(temp1)<br/>if temp1>9 then<br/>temp2=mid(cstr(temp1),2,1)<br/>if temp2>4 then <br/>temp3=(int(temp1/(10^(len(cstr(temp1))-1)))+1)*10^(len(cstr(temp1))-1)<br/>else<br/>temp3=(int(temp1/(10^(len(cstr(temp1))-1)))+0.5)*10^(len(cstr(temp1))-1)<br/>end if<br/>else<br/>if temp1>4 then temp3=10 else temp3=5<br/>end if<br/>temp4=temp3<br/>response.write "<v:rect id='_x0000_s1027' alt='' style='position:absolute;left:"&table_x+left_width&"px;top:"&table_y&"px;width:"&all_width&"px;height:"&all_height&"px;z-index:-1' fillcolor='#9cf' stroked='f'><v:fill rotate='t' angle='-45' focus='100%' type='gradient'/></v:rect>"<br/>for i=0 to all_height-1 step all_height/5<br/>response.write "<v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+length&"px,"&table_y+all_height-length-i&"px' to='"&table_x+all_width+left_width&"px,"&table_y+all_height-length-i&"px' strokecolor='"&line_color&"'/>"<br/>response.write "<v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+(left_width-15)&"px,"&table_y+i&"px' to='"&table_x+left_width&"px,"&table_y+i&"px'/>"<br/>response.write ""<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x&"px;top:"&table_y+i&"px;width:"&left_width&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='right'>"&temp4&"</td></tr></table></v:textbox></v:shape>"<br/>temp4=temp4-temp3/5<br/>next<br/>response.write "<v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width&"px,"&table_y+all_height&"px' to='"&table_x+all_width+left_width&"px,"&table_y+all_height&"px'/>"<br/>response.write "<v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width&"px,"&table_y&"px' to='"&table_x+left_width&"px,"&table_y+all_height&"px'/>"</p><p>dim line_code<br/>redim line_code(line_no,5)<br/>for i=1 to line_no<br/>line_temp=split(total(0,i),",")<br/>line_code(i,1)=line_temp(0)<br/>line_code(i,2)=line_temp(1)<br/>line_code(i,3)=line_temp(2)<br/>line_code(i,4)=line_temp(3)<br/>line_code(i,5)=line_temp(4)<br/>next<br/>for j=1 to line_no<br/>for i=1 to total_no-1<br/>x1=table_x+left_width+all_width*(i-1)/total_no<br/>y1=table_y+(temp3-total(i,j))*(all_height/temp3)<br/>x2=table_x+left_width+all_width*i/total_no<br/>y2=table_y+(temp3-total(i+1,j))*(all_height/temp3)<br/>response.write "<v:line id=""_x0000_s1025"" alt="""" style='position:absolute;left:0;text-align:left;top:0;z-index:1' from="""&x1&"px,"&y1&"px"" to="""&x2&"px,"&y2&"px"" coordsize=""21600,21600"" strokecolor="""&line_code(j,1)&""" strokeweight="""&line_code(j,2)&""">"<br/>select case line_code(j,3)<br/>case 1<br/>case 2<br/>response.write "<v:stroke dashstyle='1 1'/>"<br/>case 3<br/>response.write "<v:stroke dashstyle='dash'/>"<br/>case 4<br/>response.write "<v:stroke dashstyle='dashDot'/>"<br/>case 5<br/>response.write "<v:stroke dashstyle='longDash'/>"<br/>case 6<br/>response.write "<v:stroke dashstyle='longDashDot'/>"<br/>case 7<br/>response.write "<v:stroke dashstyle='longDashDotDot'/>"<br/>case else<br/>end select<br/>response.write "</v:line>"&CHR(13)<br/>select case line_code(j,4)<br/>case 1<br/>case 2<br/>response.write "<v:rect id=""_x0000_s1027"" style='position:absolute;left:"&x1-2&"px;top:"&y1-2&"px;width:4px;height:4px; z-index:2' fillcolor="""&line_code(j,1)&""" strokecolor="""&line_code(j,1)&"""/>"&CHR(13)<br/>case 3<br/>response.write "<v
val id=""_x0000_s1026"" style='position:absolute;left:"&x1-2&"px;top:"&y1-2&"px;width:4px;height:4px;z-index:1' fillcolor="""&line_code(j,1)&""" strokecolor="""&line_code(j,1)&"""/>"&CHR(13)<br/>end select<br/>next<br/>select case line_code(j,4)<br/>case 1<br/>case 2<br/>response.write "<v:rect id=""_x0000_s1027"" style='position:absolute;left:"&x2-2&"px;top:"&y2-2&"px;width:4px;height:4px; z-index:2' fillcolor="""&line_code(j,1)&""" strokecolor="""&line_code(j,1)&"""/>"&CHR(13)<br/>case 3<br/>response.write "<v
val id=""_x0000_s1026"" style='position:absolute;left:"&x2-2&"px;top:"&y2-2&"px;width:4px;height:4px;z-index:1' fillcolor="""&line_code(j,1)&""" strokecolor="""&line_code(j,1)&"""/>"&CHR(13)<br/>end select<br/>next</p><p>for i=1 to total_no<br/>response.write "<v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+all_width*(i-1)/total_no&"px,"&table_y+all_height&"px' to='"&table_x+left_width+all_width*(i-1)/total_no&"px,"&table_y+all_height+15&"px'/>"<br/>response.write ""<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x+left_width+all_width*(i-1)/total_no&"px;top:"&table_y+all_height&"px;width:"&all_width/total_no&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='left'>"&total(i,0)&"</td></tr></table></v:textbox></v:shape>"<br/>next</p><p>tb_height=30<br/>response.write "<v:rect id='_x0000_s1025' style='position:absolute;left:"&table_x+all_width+20&"px;top:"&table_y&"px;width:100px;height:"&line_no*tb_height+20&"px;z-index:1'/>"<br/>for i=1 to line_no<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x+all_width+25&"px;top:"&table_y+10+(i-1)*tb_height&"px;width:60px;height:"&tb_height&"px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='left'>"&line_code(i,5)&"</td></tr></table></v:textbox></v:shape>"<br/>response.write "<v:rect id='_x0000_s1040' alt='' style='position:absolute;left:"&table_x+all_width+80&"px;top:"&table_y+10+(i-1)*tb_height+4&"px;width:30px;height:20px;z-index:1' fillcolor='"&line_code(i,1)&"'><v:fill color2='"&line_code(i,1)&"' rotate='t' focus='100%' type='gradient'/></v:rect>"<br/>next</p><p>end function<br/>%></p><p><%<br/>function table1(total,table_x,table_y,thickness,table_width,all_width,all_height,table_type)<br/>'参数含义(传递的数组,横坐标,纵坐标,柱子的厚度,柱子的宽度,图表的宽度,图表的高度,图表的类型)<br/>'纯ASP代码生成图表函数1——柱状图<br/>'作者:龚鸣(Passwordgm) QQ:25968152 MSN:passwordgm@sina.com Email:passwordgm@sina.com<br/>'本人非常愿意和ASP,VML,FLASH的爱好者在HTTP://topclouds.126.com进行交流和探讨<br/>'版本2.0 最后修改日期 2003-7-22<br/>'非常感谢您使用这个函数,请您使用和转载时保留版权信息,这是对作者工作的最好的尊重。<br/>dim tb_color(7,2)<br/>tb_color(1,1)="#d1ffd1"<br/>tb_color(2,1)="#ffbbbb"<br/>tb_color(3,1)="#ffe3bb"<br/>tb_color(4,1)="#cff4f3"<br/>tb_color(5,1)="#d9d9e5"<br/>tb_color(6,1)="#ffc7ab"<br/>tb_color(7,1)="#ecffb7"</p><p>tb_color(1,2)="#00ff00"<br/>tb_color(2,2)="#ff0000"<br/>tb_color(3,2)="#ff9900"<br/>tb_color(4,2)="#33cccc"<br/>tb_color(5,2)="#666699"<br/>tb_color(6,2)="#993300"<br/>tb_color(7,2)="#99cc00"</p><p>line_color="#69f"<br/>left_width=70<br/>length=thickness/2<br/>total_no=ubound(total,1)</p><p>temp1=0<br/>for i=1 to total_no<br/>if temp1<total(i,1) then temp1=total(i,1)<br/>next<br/>temp1=int(temp1)<br/>if temp1>9 then<br/>temp2=mid(cstr(temp1),2,1)<br/>if temp2>4 then <br/>temp3=(int(temp1/(10^(len(cstr(temp1))-1)))+1)*10^(len(cstr(temp1))-1)<br/>else<br/>temp3=(int(temp1/(10^(len(cstr(temp1))-1)))+0.5)*10^(len(cstr(temp1))-1)<br/>end if<br/>else<br/>if temp1>4 then temp3=10 else temp3=5<br/>end if<br/>temp4=temp3<br/>response.write "<!--[if gte vml 1]><v:rect id='_x0000_s1027' alt='' style='position:absolute;left:"&table_x+left_width&"px;top:"&table_y&"px;width:"&all_width&"px;height:"&all_height&"px;z-index:-1' fillcolor='#9cf' stroked='f'><v:fill rotate='t' angle='-45' focus='100%' type='gradient'/></v:rect><![endif]-->"<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width&"px,"&table_y+all_height&"px' to='"&table_x+all_width+left_width&"px,"&table_y+all_height&"px'/><![endif]-->"<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width&"px,"&table_y&"px' to='"&table_x+left_width&"px,"&table_y+all_height&"px'/><![endif]-->"</p><p>select case table_type<br/>case "A"<br/>table_space=(all_width-table_width*total_no)/total_no<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+length&"px,"&table_y&"px' to='"&table_x+left_width+length&"px,"&table_y+all_height-length&"px' strokecolor='"&line_color&"'/><![endif]-->"<br/>for i=0 to all_height-1 step all_height/5<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width&"px,"&table_y+all_height-length-i&"px' to='"&table_x+left_width+length&"px,"&table_y+all_height-i&"px' strokecolor='"&line_color&"'/><![endif]-->"<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+length&"px,"&table_y+all_height-length-i&"px' to='"&table_x+all_width+left_width&"px,"&table_y+all_height-length-i&"px' strokecolor='"&line_color&"'/><![endif]-->"<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+(left_width-15)&"px,"&table_y+i&"px' to='"&table_x+left_width&"px,"&table_y+i&"px'/><![endif]-->"<br/>response.write "<!--[if gte vml 1]>"<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x&"px;top:"&table_y+i&"px;width:"&left_width&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='right'>"&temp4&"</td></tr></table></v:textbox></v:shape><![endif]-->"<br/>temp4=temp4-temp3/5<br/></p>
作者:
翔羽
时间:
2006-2-24 09:27
next<br/>for i=1 to total_no<br/>temp_space=table_x+left_width+table_space/2+table_space*(i-1)+table_width*(i-1)<br/>response.write "<v:rect id='_x0000_s1025' alt='' style='position:absolute;left:"<br/>response.write temp_space<br/>response.write "px;top:"<br/>response.write table_y+all_height*(1-(total(i,1)/temp3))<br/>response.write "px;width:"&table_width&"px;height:"&all_height*(total(i,1)/temp3)&"px;z-index:1' fillcolor='"&tb_color(i,2)&"'>"<br/>response.write "<v:fill color2='"&tb_color(i,1)&"' rotate='t' type='gradient'/>"<br/>response.write "<o:extrusion v:ext='view' backdepth='"&thickness&"pt' color='"&tb_color(i,2)&"' on='t'/>"<br/>response.write "</v:rect>"<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&temp_space&"px;top:"&table_y+all_height*(1-(total(i,1)/temp3))-table_width&"px;width:"&table_space+15&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='center'>"&total(i,1)&"</td></tr></table></v:textbox></v:shape>"<p>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&temp_space-table_space/2&"px;top:"&table_y+all_height+1&"px;width:"&table_space+table_width&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='center'>"&total(i,2)&"</td></tr></table></v:textbox></v:shape>"<br/>next<br/>Case "B"<br/>table_space=(all_height-table_width*total_no)/total_no<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+length&"px,"&table_y+all_height-length&"px' to='"&table_x+left_width+all_width&"px,"&table_y+all_height-length&"px' strokecolor='"&line_color&"'/><![endif]-->"<br/>for i=0 to all_width-1 step all_width/5<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+i&"px,"&table_y+all_height-length&"px' to='"&table_x+left_width+length+i&"px,"&table_y+all_height&"px' strokecolor='"&line_color&"'/><![endif]-->"<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+length+i&"px,"&table_y+all_height-length&"px' to='"&table_x+left_width+length+i&"px,"&table_y&"px' strokecolor='"&line_color&"'/><![endif]-->"<br/>response.write "<!--[if gte vml 1]><v:line id='_x0000_s1027' alt='' style='position:absolute;left:0;text-align:left;top:0;flip:y;z-index:-1' from='"&table_x+left_width+i+all_width/5&"px,"&table_y+all_height&"px' to='"&table_x+left_width+i+all_width/5&"px,"&table_y+all_height+15&"px'/><![endif]-->"<br/>response.write "<!--[if gte vml 1]>"<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x+left_width+i+all_width/5-left_width&"px;top:"&table_y+all_height&"px;width:"&left_width&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='right'>"&temp4&"</td></tr></table></v:textbox></v:shape><![endif]-->"<br/>temp4=temp4-temp3/5<br/>next</p><p>for i=1 to total_no<br/>temp_space=table_space/2+table_space*(i-1)+table_width*(i-1)<br/>response.write "<v:rect id='_x0000_s1025' alt='' style='position:absolute;left:"<br/>response.write table_x+left_width<br/>response.write "px;top:"<br/>response.write table_y+temp_space<br/>response.write "px;width:"&all_width*(total(i,1)/temp3)&"px;height:"&table_width&"px;z-index:1' fillcolor='"&tb_color(i,2)&"'>"<br/>response.write "<v:fill color2='"&tb_color(i,1)&"' rotate='t' angle='-90' focus='100%' type='gradient'/>"<br/>response.write "<o:extrusion v:ext='view' backdepth='"&thickness&"pt' color='"&tb_color(i,2)&"' on='t'/>"<br/>response.write "</v:rect>"<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x+left_width+all_width*(total(i,1)/temp3)+thickness/2&"px;top:"&table_y+temp_space&"px;width:"&table_space+15&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='center'>"&total(i,1)&"</td></tr></table></v:textbox></v:shape>"</p><p>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x&"px;top:"&table_y+temp_space&"px;width:"&left_width&"px;height:18px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='right'>"&total(i,2)&"</td></tr></table></v:textbox></v:shape>"<br/>next<br/>case else<br/>end select</p><p>end function<br/>%></p><p><%<br/>function table3(total,table_x,table_y,all_width,all_height,table_type)<br/>'参数含义(传递的数组,横坐标,纵坐标,图表的宽度,图表的高度,图表的类型)<br/>'纯ASP代码生成图表函数3——饼图<br/>'作者:龚鸣(Passwordgm) QQ:25968152 MSN:passwordgm@sina.com Email:passwordgm@sina.com<br/>'本人非常愿意和ASP,VML,FLASH的爱好者在HTTP://topclouds.126.com进行交流和探讨<br/>'版本1.0 最后修改日期 2003-8-11<br/>'非常感谢您使用这个函数,请您使用和转载时保留版权信息,这是对作者工作的最好的尊重。<br/>tb_height=30</p><p>dim tb_color(7,2)<br/>tb_color(1,1)="#d1ffd1"<br/>tb_color(2,1)="#ffbbbb"<br/>tb_color(3,1)="#ffe3bb"<br/>tb_color(4,1)="#cff4f3"<br/>tb_color(5,1)="#d9d9e5"<br/>tb_color(6,1)="#ffc7ab"<br/>tb_color(7,1)="#ecffb7"</p><p>tb_color(1,2)="#00ff00"<br/>tb_color(2,2)="#ff0000"<br/>tb_color(3,2)="#ff9900"<br/>tb_color(4,2)="#33cccc"<br/>tb_color(5,2)="#666699"<br/>tb_color(6,2)="#993300"<br/>tb_color(7,2)="#99cc00"</p><p>total_no=ubound(total,1)<br/>totalpie=0<br/>for i=1 to total_no<br/>totalpie=totalpie+total(i,1)<br/>next</p><p>
reAngle=0<br/>for i=1 to total_no<br/>response.write "<v:shape id='_x0000_s1025' alt='' style='position:absolute;left:"&table_x&"px;top:"&table_y&"px;width:"&all_width&"px;height:"&all_height&"px;z-index:1' coordsize='1500,1400' o:spt='100' adj='0,,0' path='m750,700ae750,700,750,700,"&int(23592960*PreAngle)&","&int(23592960*total(i,1)/totalpie)&"xe' fillcolor='"&tb_color(i,1)&"' strokecolor='#FFFFFF'><v:fill color2='"&tb_color(i,2)&"' rotate='t' focus='100%' type='gradient'/><v:stroke joinstyle='round'/><v:formulas/><v:path o:connecttype='segments'/></v:shape>"&CHr(13)<br/>
reAngle=PreAngle+total(i,1)/totalpie<br/>next</p><p>if table_type="A" then<br/>response.write "<v:rect id='_x0000_s1025' style='position:absolute;left:"&table_x+all_width+20&"px;top:"&table_y+20&"px;width:100px;height:"&total_no*tb_height+20&"px;z-index:1'/>"<br/>for i=1 to total_no<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x+all_width+25&"px;top:"&table_y+30+(i-1)*tb_height&"px;width:60px;height:"&tb_height&"px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='left'>"&total(i,0)&"</td></tr></table></v:textbox></v:shape>"<br/>response.write "<v:rect id='_x0000_s1040' alt='' style='position:absolute;left:"&table_x+all_width+80&"px;top:"&table_y+30+(i-1)*tb_height+3&"px;width:30px;height:20px;z-index:1' fillcolor='"&tb_color(i,1)&"'><v:fill color2='"&tb_color(i,2)&"' rotate='t' focus='100%' type='gradient'/></v:rect>"<br/>'显示比例数<br/>' response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&table_x+all_width+110&"px;top:"&table_y+30+(i-1)*tb_height&"px;width:60px;height:"&tb_height&"px;z-index:1'>"<br/>' response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='left'>"&formatnumber(total(i,1)*100/totalpie,2,-1)&"%</td></tr></table></v:textbox></v:shape>"<br/>next<br/>end if</p>
作者:
翔羽
时间:
2006-2-24 09:28
<p>if table_type="B" then<br/>pie=3.14159265358979<br/>TempPie=0<br/>for i=1 to total_no<br/>TempAngle=pie*2*(total(i,1)/(TotalPie*2)+TempPie)<br/>x1=table_x+all_width/2+cos(TempAngle)*all_width*3/8<br/>y1=table_y+all_height/2-sin(TempAngle)*all_height*3/8<br/>x2=table_x+all_width/2+cos(TempAngle)*all_width*3/4<br/>y2=table_y+all_height/2-sin(TempAngle)*all_height*3/4<br/>if x2>table_x+all_width/2 then<br/>x3=x2+20<br/>x4=x3<br/>else<br/>x3=x2-20<br/>x4=x3-100<br/>end if<br/>response.write "<v
val id='_x0000_s1027' style='position:absolute;left:"&x1-2&"px;top:"&y1-2&"px;width:4px;height:4px; z-index:2' fillcolor='#111111' strokecolor='#111111'/>"&CHR(13)<br/>response.write "<v:line id='_x0000_s1025' alt='' style='position:absolute;left:0;text-align:left;top:0;z-index:1' from='"&x1&"px,"&y1&"px' to='"&x2&"px,"&y2&"px' coordsize='21600,21600' strokecolor='#111111' strokeweight='1px'></v:line>"<br/>response.write "<v:line id='_x0000_s1025' alt='' style='position:absolute;left:0;text-align:left;top:0;z-index:1' from='"&x2&"px,"&y2&"px' to='"&x3&"px,"&y2&"px' coordsize='21600,21600' strokecolor='#111111' strokeweight='1px'></v:line>"<br/>response.write "<v:shape id='_x0000_s1025' type='#_x0000_t202' alt='' style='position:absolute;left:"&x4&"px;top:"&y2-10&"px;width:100px;height:20px;z-index:1'>"<br/>response.write "<v:textbox inset='0px,0px,0px,0px'><table cellspacing='3' cellpadding='0' width='100%' height='100%'><tr><td align='left'>"&total(i,0)&" "&formatnumber(total(i,1)*100/totalpie,2,-1)&"%</td></tr></table></v:textbox></v:shape>"<br/>TempPie=TempPie+total(i,1)/TotalPie<br/>next<br/>end if</p><p>end function<br/>%></p><p>纯ASP代码生成图表函数1——柱状图调用示例<br/><%<br/>dim total(7,2)<br/>total(1,1)=200<br/>total(2,1)=800<br/>total(3,1)=1000<br/>total(4,1)=600<br/>total(5,1)=1222<br/>total(6,1)=3213<br/>total(7,1)=8</p><p>total(1,2)="中国经营报"<br/>total(2,2)="招聘网"<br/>total(3,2)="51Job"<br/>total(4,2)="新民晚报"<br/>total(5,2)="新闻晚报"<br/>total(6,2)="南方周末"<br/>total(7,2)="羊城晚报"</p><p>total_no=7<br/>%><br/><html xmlns:v="urn:schemas-microsoft-com:vml" xmlns
="urn:schemas-microsoft-com
ffice
ffice"><br/><!--[if !mso]><br/><style><br/>v\:* { behavior: url(#default#VML) }<br/>o\:* { behavior: url(#default#VML) }<br/>.shape { behavior: url(#default#VML) }<br/></style><br/><![endif]--><br/><head><br/><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br/><title></title><br/><style><br/>TD { FONT-SIZE: 9pt}<br/></style></head><br/><body topmargin=5 leftmargin=0 scroll=AUTO><br/><%call table1(total,200,20,20,30,400,200,"A")%><br/><%call table1(total,200,320,20,20,400,250,"B")%><br/></body><br/></html></p>
作者:
翔羽
时间:
2006-2-25 12:36
<p><strong>asp实现批量录入数据的实现</strong></p><hr/><p>批量录入在数据库的应用中比较广泛的,关于批量录入的方法也有好多种。<br/>下面我就结合我实际中的应用,谈一下儿我是怎么实现的。<br/>主要用到的是form的集合的概念,通过循环取的所有的集合内数据。<br/>考虑到大家看着方便,我把它集成到了一个页面。<br/>下面是具体的代码: <br/>batchInput.asp<br/><%<br/>'#####################################<br/>'File Function:批量录入数据<br/>'Author:Myhon<br/>'Date:2003-8-19<br/>'#####################################</p><p>'向数据库写入数据<br/>SUB writeData()<br/>dim recCnt,i<br/>dim fieldName1,fieldName2,fieldName3<br/>dim conn<br/>dim sqlStr,connStr<br/>connStr="
rovider=SQLOLEDB.1;Initial Catalog=myDatabase;Data Source=myhon;User Id=sa
ASSWORD="<br/>set conn=Server.CreateObject("ADODB.Connection")<br/>conn.open connStr '建立数据库连接</p><p>recCnt=request.form("stu_num").count '取得共有多少条记录<br/>'批量录入数据<br/>for i=1 to recCnt<br/>fieldName1=trim(request.form("fieldName1")(i))<br/>fieldName2=trim(request.form("fieldName2")(i))<br/>fieldName3=trim(request.form("fieldName3")(i))<br/>sqlStr="insert into myTable(fieldName1,fieldName2,fieldName3) values('"<br/>sqlStr=sqlStr & fieldName1 & "','"<br/>sqlStr=sqlStr & fieldName2 & "','"<br/>sqlStr=sqlStr & fieldName3 & "')"<br/>'response.write sqlStr<br/>conn.execute(sqlStr)<br/>next<br/>END SUB</p><p>'显示成批录入的界面<br/>SUB InputData()<br/>dim recCnt,i<br/>%><br/><form name="bathInputData" action="" method="post"><br/><% <br/>recCnt=cint(request.form("recCnt"))<br/>for i=1 to recCnt<br/>%><br/><input type="text" name="fieldName1"><br/><input type="text" name="fieldName2"><br/><input type="text" name="fieldName3"><br/><%<br/>next<br/>%><br/><br><br/><input type="submit" name="action" value="提交"><br/></form><br/><%<br/>END SUB</p><p>'指定要批量录入多少条记录<br/>SUB assignHowMuch()<br/>%></p><p><!------指定要录入多少条记录--------------><br/><form name="form1" action="" method="post"><br/>您要录入的记录的条数:<input type="text" name="recCnt"><br/><input type="submit" name="action" value="下一步>>"><br/></form><br/><%<br/>END SUB</p><p>if request.form("action")="下一步>>" then<br/>Call InputData() '显示成批录入界面<br/>elseif request.form("action")="提交" then Call writeData() '向数据库批量写入数据<br/>else<br/>Call assignHowMuch() '显示指定录入多少条记录的界面<br/>end if<br/><br/>%><br/></p>
作者:
翔羽
时间:
2006-2-25 12:36
<p><strong>在SQL Server中保存和输出图片</strong></p><hr/><p>介绍 <br/><br/><br/>有时候我们需要保存一些binary data进数据库。SQL Server提供一个叫做image的特殊数据类型供我们保存binary data。Binary data可以是图片、文档等。在这篇文章中我们将看到如何在SQL Server中保存和输出图片。 <br/><br/><br/>建表 <br/><br/><br/>为了试验这个例子你需要一个含有数据的table(你可以在现在的库中创建它,也可以创建一个新的数据库),下面是它的结构: <br/><br/><br/>Column Name <br/>Datatype <br/>
urpose <br/><br/>ID <br/>Integer <br/>identity column Primary key <br/><br/>IMGTITLE <br/>Varchar(50) <br/>Stores some user friendly title to identity the image <br/><br/>IMGTYPE <br/>Varchar(50) <br/>Stores image content type. This will be same as recognized content types of ASP.NET <br/><br/>IMGDATA <br/>Image <br/>Stores actual image or binary data. <br/><br/><br/><br/><br/>保存images进SQL Server数据库 <br/><br/><br/>为了保存图片到table你首先得从客户端上传它们到你的web服务器。你可以创建一个web form,用TextBox得到图片的标题,用HTML File Server Control得到图片文件。确信你设定了Form的encType属性为multipart/form-data。 <br/><br/><br/>Stream imgdatastream = File1.PostedFile.InputStream; <br/><br/>int imgdatalen = File1.PostedFile.ContentLength; <br/><br/>string imgtype = File1.PostedFile.ContentType; <br/><br/>string imgtitle = TextBox1.Text; <br/><br/>byte[] imgdata = new byte[imgdatalen]; <br/><br/>int n = imgdatastream.Read(imgdata,0,imgdatalen); <br/><br/>string connstr= <br/><br/>((NameValueCollection)Context.GetConfig <br/><br/>("appSettings"))["connstr"]; <br/><br/>SqlConnection connection = new SqlConnection(connstr); <br/><br/>SqlCommand command = new SqlCommand <br/><br/>("INSERT INTO ImageStore(imgtitle,imgtype,imgdata) <br/><br/>VALUES ( @imgtitle, @imgtype,@imgdata )", connection ); <br/><br/><br/><br/>SqlParameter paramTitle = new SqlParameter <br/><br/>("@imgtitle", SqlDbType.VarChar,50 ); <br/><br/>paramTitle.Value = imgtitle; <br/><br/>command.Parameters.Add( paramTitle); <br/><br/><br/><br/>SqlParameter paramData = new SqlParameter <br/><br/>( "@imgdata", SqlDbType.Image ); <br/><br/>paramData.Value = imgdata; <br/><br/>command.Parameters.Add( paramData ); <br/><br/><br/><br/>SqlParameter paramType = new SqlParameter <br/><br/>( "@imgtype", SqlDbType.VarChar,50 ); <br/><br/>paramType.Value = imgtype; <br/><br/>command.Parameters.Add( paramType ); <br/><br/><br/><br/>connection.Open(); <br/><br/>int numRowsAffected = command.ExecuteNonQuery(); <br/><br/>connection.Close(); <br/><br/><br/><br/>从数据库中输出图片 <br/><br/><br/><br/>现在让我们从数据库中取出我们刚刚保存的图片,在这儿,我们将直接将图片输出至浏览器。你也可以将它保存为一个文件或做任何你想做的。 <br/><br/><br/><br/>private void Page_Load(object sender, System.EventArgs e) <br/><br/>{ <br/><br/>string imgid =Request.QueryString["imgid"]; <br/><br/>string connstr=((NameValueCollection) <br/><br/>Context.GetConfig("appSettings"))["connstr"]; <br/><br/>string sql="SELECT imgdata, imgtype FROM ImageStore WHERE id = " <br/><br/>+ imgid; <br/><br/>SqlConnection connection = new SqlConnection(connstr); <br/><br/>SqlCommand command = new SqlCommand(sql, connection); <br/><br/>connection.Open(); <br/><br/>SqlDataReader dr = command.ExecuteReader(); <br/><br/>if(dr.Read()) <br/><br/>{ <br/><br/>Response.ContentType = dr["imgtype"].ToString(); <br/><br/>Response.BinaryWrite( (byte[]) dr["imgdata"] ); <br/><br/>} <br/><br/>connection.Close(); <br/><br/>} <br/><br/><br/><br/>在上面的代码中我们使用了一个已经打开的数据库,通过datareader选择images。接着用Response.BinaryWrite代替Response.Write来显示image文件。</p>
作者:
翔羽
时间:
2006-2-25 12:37
<p><strong>asp中对ip进行过滤限制函数</strong></p><p></p><hr/><p><%<br/>'获取访问者的地址<br/>ip=Request.ServerVariables("REMOTE_ADDR") </p><p>'允许的IP地址段为10.0.0.0~10.68.63.255<br/>allowip1="10.0.0.0"<br/>allowip2="10.68.10.71"</p><p>response.write checkip(ip,allowip1,allowip2)</p><p><br/>function checkip(ip,allowip1,allowip2)<br/>dim check(4)<br/>checkip=false<br/>ipstr=split(ip,".")<br/>allow1=split(allowip1,".")<br/>allow2=split(allowip2,".")<br/>if cint(allow1(0))>cint(allow2(0)) then '判断IP地址段是否合法<br/>response.write "IP地址段出错!"<br/>exit function<br/>end if<br/>for i=0 to ubound(ipstr)<br/>if cint(allow1(i))<cint(allow2(i)) then<br/>if cint(allow1(i))=cint(ipstr(i)) then<br/>check(i)=true<br/>checkip=true<br/>exit for<br/>else<br/>if cint(ipstr(i))<cint(allow2(i)) then<br/>check(i)=true<br/>checkip=true<br/>exit for<br/>else<br/>if cint(ipstr(i))>cint(allow2(i)) then<br/>check(i)=false<br/>checkip=false<br/>exit for<br/>else<br/>check(i)=true<br/>checkip=true<br/>end if<br/>end if<br/>end if<br/>else<br/>if cint(allow1(i))>cint(ipstr(i)) or cint(allow1(i))<cint(ipstr(i)) then<br/>check(i)=false<br/>checkip=false<br/>if i<>ubound(ipstr) then<br/>exit for<br/>end if<br/>else<br/>check(i)=true<br/>end if<br/>end if<br/>next</p><p>if (check(0)=true and check(1)=true and check(2)=true and check(3)=false) and (cint(allow2(2))>cint(ipstr(2))) then<br/>checkip=true<br/>end if</p><p>end function<br/>%></p>
作者:
翔羽
时间:
2006-2-25 12:37
<p><strong>不用Golobal和session实现在线人数统计 </strong></p><hr/><p>实现在线人数统计最常用的方法就是golobal.asa结合session做,但这种方法有两个不利:<br/>1、每个session要占用12k的服务器内存空间,为了人数+1就要付出12k内存的代价。<br/>2、golobal.asa要放在网站的根目录下才会起作用,而且根目录只能有一个golobal,矛盾突出。<br/>为此,有一种使用cookie和application在asp文件中实现在线统计的方法,欢迎批评指正,共同探讨:<br/>第一步:做一个框架,包含隐藏框架(count.asp)<br/>第二步:编写count.asp<br/><%<br/>user=request.cookies("21bbsusername")<br/>totaluser=application("user")<br/>if instr(totaluser,user)=0 then<br/>application.lock<br/>application("user")=totaluser&";"&user<br/>application.unlock<br/>end if<br/>%><br/><html><br/><head><br/><meta http-equiv="refresh" content="2"><br/></head><br/><body><br/></body><br/></html><br/>第三步:显示<br/>user=split(application("user"),";")<br/>num=ubound(user)<br/>response.write num </p>
作者:
翔羽
时间:
2006-2-25 12:38
<p><strong>Flash和Asp数据库的结合应用</strong></p><hr/><p> 在看这个例子之前,先讲讲Flash和Asp结合的原理,其实懂一点ASP的朋友都知道ASP是基于HTML的. <br/> 其实Flash和Asp接口的原理和纯ASP文件之间交互的原理是一样的,简单地说就是页面之间的数据交换。了解了这一点之后,我们来看看下面这个简单的例子: <br/> 这个例子是把ACCESS内的数据读出来,并在Flash内显示出来。这个例子一共有三个主要文件,一个是ACCESS的数据库文件employees.mdb,它有一个employees表,有四个字段:ID,Namelast,Lastname,Position。 </p><p> 现在我们就来看看这个例子的制作过程吧。第一个影帧,ACTION是stop,有一个供用户输入查询字段的文本框:strSearch,一个按钮:submit,它的ACTION是 </p><p> 于 (放开) </p><p> 跳至并播放 (2) </p><p> 退出于 </p><p> 第二个影帧的ACTION是:载入参数 ("employee.asp", 0, vars=GET) </p><p> 这个ACTION的作用是通过ASP文件把ACCESS数据库内符合用户查询条件的数据读出来。 </p><p><br/> 第三个影帧的ACTION是: </p><p> 如果(NameFirst ne "") </p><p> 跳至并停止 (9) </p><p> 退出如果 </p><p> 意思是如果NameFirst不等于空值的话,就跳到第九个影帧;否则将会执行下去(即播放下一个影帧)。 </p><p> 第4-7个影帧都没有ACTION哦。 </p><p> 第八个影帧的ACTION是: </p><p> 跳至并播放 (3) </p><p> 回过头来再看看第三个影帧看看,呵呵,懂了吧? </p><p> 如果没有符合的数据的话,就一直读到有为止;读到了就跳到第九个影帧哦。 </p><p> 那么再来看看第九个影帧: </p><p> 一共有三个文本框:NameFirst,NameLast,Position </p><p> 数据库内符合查询条件的数据将会显示在他们之中哦! </p><p> 还有一个按钮:Do It Again </p><p> 它的ACTION是: </p><p> 于 (放开) </p><p> 跳至并停止 (1) </p><p> 退出于 </p><p> 好了,再来看看employee.asp这个文件吧: </p><p>Dim oRS, oConn ’定义两个变量 <br/>Set oRS = Server.CreateObject("ADODB.Recordset") ’定义oRS为RECORDSET对象 <br/>Set oConn = Server.CreateObject("ADODB.Connection") ’定义oConn为CONNECTION对象 <br/>oConn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)}; <br/>DBQ=" & Server.MapPath("employees.mdb") <br/>oRS.Open "SELECT * FROM Employees", oConn, 2, 3 <br/>’嘿嘿,这两句不用说了吧?打开数据库哦 <br/>oRS.Find "NameLast = ’" & UCase(Request.QueryString("strSearch")) & "’" <br/>’找到符合条件的数据 </p>
作者:
翔羽
时间:
2006-2-25 12:38
<p><strong>产生一个密码,并记录到数据库,然后发送给用户</strong></p><hr/><p><br/>This article Generates a password random, Requires a database and Mails the Password.</p><p></p><p><%@language="vbscript" %></p><p></p><p>******************************<br/><% <br/>'code by Manikantan<br/>'Web Developer <br/>'3rd Agenda<br/>'Nungambakkam, Chennai India <br/>%></p><p></p><p><% </p><p></p><p>set mail= server.CreateObject("cdonts.newmail") <br/>mail.subject="Thank You for Registering" <br/>mail.to = mailid mail.from ="Webmaster@thesite" <br/>mail.body= "This is the Initial Password to our site...." & vbcrlf <br/>&href='mailto:mailid="user@ursite.com'>mailid="user@ursite.com"<br/>address="address"</p><p></p><p><br/>'other data like phone number as per the member database in the site<br/>'all these values are obtained from the request method from a .htm which submits to this file<br/>'Mainly employed in registration<br/>'Assumes You have cdonts.dll installed in the web server.</p><p></p><p>set conn = server.CreateObject("adodb.connection")<br/>conn.Open "dsn","uid","pwd"<br/>set rec= conn.Execute("select count(*) from membertable")<br/>id = cint(rec.fields(0))+1 <br/>r=rnd *50<br/>Response.Write r & "<br>"<br/>for i = 0 to 20<br/>if cint(r)>0 and cint(r)<26 then str=str +chr(97 + cint(r))<br/>r=rnd *100<br/>next </p><p></p><p>Response.Write str<br/>pwd=left(str,2)<br/>pwd=pwd & id<br/>pwd=pwd & right(str,2)<br/>pwd=pwd & second(time)</p><p></p><p>'An Update Query can be Passed from here for the username ,password and other details or can be triggered <br/>from another page 'when the user responds to the mail...Something like sending a url as a mail and on <br/>click of the url in the mail..call another page 'which updates ..so we can be sure that only confirmed <br/>users are updated</p><p></p><p>%><br/><br><br/><% <br/>set mail= server.CreateObject("cdonts.newmail")<br/>mail.subject="Thank You for Registering"<br/>mail.to = mailid<br/>mail.from ="Webmaster@thesite"<br/>mail.body= "This is the Initial Password to our site...." & vbcrlf & "Change it if You Want" & vbcrlf & <br/>pwd & vbcrlf & "Thank You for Using the Site"<br/>mail.send<br/>%></p>
作者:
翔羽
时间:
2006-2-25 12:39
<p><strong>会员系统“找回密码”的制作方法</strong></p><hr/><p>会员注册以后,有些会员可能会遇到忘记登录密码的问题,因而网站具备“找回密码”功能不仅是必须的,而且是服务贴心的具体表现之一。在此,levitian写了一个“找回密码”的小教程,供初学动态网站设计的朋友们借鉴,希望对大家有所帮助。<br/><br/>●相关说明:<br/>·levitian假设您已经作好了会员系统,接下来准备作“找回密码”功能但还没有作,或者您不知道怎么作这个功能,那么刚好可以看看本教程。<br/>·国内大多数服务器都支持Jmail邮件组件,因而levitian就使用该组件实现邮件发送功能;<br/>·传统的“找回密码”功能要使用“密码取回问题”和“密码取回答案”等字段,但levitian认为大可不必这么繁琐,反正最终目的是将密码发进用户的邮箱里,而用户的邮箱只有自己可以收发邮件,那么以上这两个字段就可以省略了。实际上只要填上用户名和自己的邮箱,按“找回密码”,启动Jmail邮件组件把密码发至用户邮箱--就这么简单!<br/>·levitian用的是Dreamweaver MX,您用Dreamweaver UltraDev当然也没问题了。<br/>·本系统主要用到了DW服务器行为中的“登录用户”和“插入”菜单中的“文件头标签”中的“刷新”子功能。用户不知道登录密码没关系,他可以用自己的用户名和邮箱找回密码,但如果该用户的邮箱是假的(胡填的),或根本没有在自己的注册资料中填邮箱,或者他输入了别人的邮箱,那么他也就无法进入找回密码的页面,当然也就无法找回自己的密码了~<br/><br/>好了,说了一大堆废话:) 赶快GO →<br/><br/>●步骤一:制作相关的ASP页面<br/>我们需要增加三个页面,一个页面是“找回密码登录页面”,这里我命名为getbackpass.asp;另一个是“密码发送成功报告页面”,这里我命名为getbackpassok.asp;第三个页面为邮箱不存在或用户名不正确时显示错误信息的页面,这里我命名为getbackpassfail.asp。<br/><br/>●步骤二:在会员登录页面增加“找回密码”文本型链接或图片型链接<br/>在会员登录界面中输入文本“找回密码”或者插入一张图片,将其链接至找回密码登录页面getbackpass.asp;如果您想把“找回密码”链接放在其它页面,当然没问题了。<br/><br/>●步骤三:制作找回密码登录页面getbackpass.asp<br/>·打开找回密码登录页面getbackpass.asp,建立表单域,插入两个文本域,第一个命名为MemberName,第二个命名为MemberEmail(您的会员信息数据表中的会员姓名字段和会员邮箱字段如不是MemberName和MemberEmail,请修改成相应的字段名),接下来插入一个“按钮”,命名为“取回密码”。<br/>·打开服务器行为面板,点击“+”,选择“用户身份验证”中的“登录用户”,在“登录用户”面板中,我主要说说以下项目的设置:<br/>使用连接验证:我们选择已经定义好的DSN连接<br/>表格:我们选择会员注册信息表单<br/>用户名列:我们选择MemberName<br/>密码列:我们选择MemberEmail<br/>如果登录成功转到:我们选择getbackpassok.asp<br/>如果登录失败转到:我们选择getbackpassfail.asp<br/>基于以下项限制访问:我们选择“用户名和密码”<br/>OK!可以按“确定”按钮了。<br/>·加入表单验证代码<br/>为防止用户不填表单就登录,可加入以下代码,让用户必须填写内容:<br/>将DW切换到源代码视图,首先,将以下代码加入<head> </head>之间:<br/><br/><script language="JavaScript"><br/><!--<br/>function checkdata() {<br/>if (document.form1.MemberName.value=="") {<br/>window.alert ("请输入用户名 !")<br/>return false<br/>}<br/>if (document.form1.MemberEmail.value=="") {<br/>window.alert ("请输入您的邮箱 !")<br/>return false<br/>}<br/>return true<br/>}<br/>//--><br/></script><br/><br/>接下来,在<form>标签里插入以下代码:onSubmit="return checkdata()"<br/>这样,表单验证就作好了。<br/><br/>●步骤四:制作密码发送成功报告页面getbackpassok.asp<br/>·打开密码发送成功报告页面getbackpassok.asp,输入文本“密码已发至您的邮箱中,请查询密码后登录本站!”<br/>·建立数据集member,您当然可以用其它的数据集名称:<br/>连接:一栏选择您定义的DSN连接<br/>表格:一栏选择会员信息数据表member<br/>列:一栏选定会员ID、用户名、密码和邮箱这四个字段<br/>筛选:MemberName=阶段变量MM_Username<br/>排序:不用填<br/>至此,数据集就建立好了。在筛选里,我们之所以用阶段变量(Session Variable),是因为我们需要筛选出找回密码的用户。使用DW服务器行为的“登录用户”行为以后,登录者的名称(数据库中的MemberName字段)就自动保存在名为MM_Username的Session变量中。这们使用“MemberName=阶段变量MM_Username”作为筛选条件,自然可以筛选出想找回密码的用户了。<br/>·接下来我们加入Jmail邮件发送代码。将Dreamweaver设计界面切换到显示代码视图,找见如下代码:<br/><%<br/>Dim member__MMColParam<br/>member__MMColParam = "1"<br/>If (Session("MM_Username") <> "") Then <br/>member__MMColParam = Session("MM_Username")<br/>End If<br/>%><br/><%<br/>set member = Server.CreateObject("ADODB.Recordset")<br/>member.ActiveConnection = MM_spsguavaskirtdate_STRING<br/>member.Source = "SELECT MemberID, MemberName, Password, MemberEmail FROM Member WHERE MemberName = '" + Replace(member__MMColParam, "'", "''") + "'"<br/>member.CursorType = 0<br/>member.CursorLocation = 2<br/>member.LockType = 3<br/>member.Open()<br/>member_numRows = 0<br/>%><br/>这是数据集形成的代码,然后在倒数第二行,即%>上一行,插入以下Jmail组件代码:<br/>Set JMail = Server.CreateObject("JMail.SMTPMail") <br/>JMail.ServerAddress = "mail.emaichina.net:25"<br/>JMail.Sender = "emai@emaichina.net" <br/>JMail.Subject = "您的登录密码"<br/>JMail.AddRecipient(member.Fields.Item("MemberEmail").Value)<br/>JMail.Body = "尊敬的用户您好,首先感谢您使用我们的服务!." & vbCrLf & vbCrLf<br/>JMail.Body = JMail.Body & "您的用户名是:" &(member.Fields.Item("MemberName").Value) & vbCrLf <br/>JMail.Body = JMail.Body & "您的注册邮箱是:" &(member.Fields.Item("MemberEmail").Value) & vbCrLf <br/>JMail.Body = JMail.Body & "您的登录密码是:" &(member.Fields.Item("
assword").Value) & vbCrLf<br/>JMail.Body = JMail.Body & "请妥善保管您的密码,如再次遗忘密码,请登录至http://www.emaichina.net/member/memberpage/getbackpass.asp 取回您的密码,谢谢您使用本系统。" & vbCrLf<br/>JMail.Body = JMail.Body & "顺祝商祺!" & vbCrLf<br/>JMail.Body = JMail.Body & "译媒艺术咨询有限公司"<br/>JMail.Priority = 3<br/>JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")<br/>JMail.Execute<br/><br/>以上代码简单说明如下:<br/>JMail.ServerAddress= 后面填上您的SMTP服务器,如"mail.emaichina.net:25,千万别忘了填端口号:25;<br/>JMail.Sender= 后面填上您的邮箱,如emai@emaichina.net,请确保此邮箱可以正常收发邮件;<br/>JMail.Subject = 后面输入信件标题,如"您的登录密码",切记,文本之间一定要加上“"”;<br/>JMail.AddRecipient后面插入数据集member中的邮箱字段,如(member.Fields.Item("MemberEmail").Value);<br/>JMail.Body =后面输入信件的称谓部分,如: "尊敬的用户您好,首先感谢您使用我们的服务!." & vbCrLf & vbCrLf<br/>JMail.Body = 后面开始输入信件内容,如果是动态内容,那么插入数据集中的相应字段,如果是静态内容,则直接输入文本即可。每一段使用一个JMail.Body =,结尾都加上vbCrLf,有多少段就拷贝粘贴多少个JMail.Body =,这样就可以写出来一封完整的找回密码回复信。<br/>关于vbCrLf说明:vbCrLf的作用是换行,您想空一行就加一个 vbCrLf,想空两行就加两个vbCrLf…但在vbCrLf和vbCrLf之间一定要加“&”符号将它们隔开,否则会出现错误提示。<br/></p>
作者:
翔羽
时间:
2006-2-25 12:39
●制作显示错误信息页面getbackpassfail.asp<br/>如果用户名、密码错误或用户名和密码根本不存在,那么系统会转到显示错误信息页面,并且在2秒后自动返回“找回密码登录页面”。下面是制作方法:<br/>打开getbackpassfail.asp,在页面中输入文本“您的邮箱不存在,请确认您在注册资料中填写了邮箱! ”,然后,打开DW软件菜单中的→插入”→“文件头标签”→“刷新”,“延迟”填上2,就是2秒,如果您想让页面保持时间更长,也可以填3秒、5秒甚至10秒;“操作”选择“转到URL”,填上getbackpass.asp,这样这个页面2秒钟后就会自动回到“找回密码登录页面”了。<br/>OK!这个页面就做好了,很简单!<br/><br/>●测试这个找回密码系统<br/>以上系统作好后,您可以测试一下。如果您在本地测试,并且不是用的Win98操作系统,那么需要安装Jmail邮件组件(这个组件可去下载网站下载,是免费的);如果您用的是Win98操作系统或您的计算机中没有安装Jmail邮件组件,那么,可把这个系统上传到支持Jmail邮件组件的服务器空间上,试着找回密码,如果没问题,说明您成功了。如果有问题,请仔细查看制作步骤或代码有没有错误,这里祝您好运!<br/>说明:学会“找回密码系统”的制作方法后,您可以举一反三作一个会员注册后的邮件自动回复系统,也相当简单,大家可以试一下。<br/><br/>●“找回密码”邮件样式<br/>以下是levitian测试本系统后,在Foxmail收到的邮件,样式基本上这样的:<br/>------------------------------------------------<br/>尊敬的用户您好,首先感谢您使用我们的服务!.<br/><br/>您的用户名是:levi<br/>您的注册邮箱是:levitian@163.com<br/>您的登录密码是:741127<br/>请妥善保管您的密码,如再次遗忘密码,请登录至http://www.emaichina.net/member/memberpage/getbackpass.asp 取回您的密码,谢谢您使用本系统。<br/>顺祝商祺!<br/>
作者:
翔羽
时间:
2006-2-25 12:40
<p><strong>从数据库中动态选取下拉列表的方法</strong></p><hr/><p>有一页填表的页面,其中有几个下拉表单是通过一个表的某个字段动态<br/>生成,比如省下面的城市名,希望选择某一个省即可自动在另一下拉表<br/>单内生成城市名,.....然后提交给asp处理加入到另外一个表内。</p><p><form name=f1 METHOD="
OST"><br/><%<br/>OpenDB objConn, "xxxx"<br/>Set RSClass = objConn.Execute("SELECT * FROM class Order by fldClass")<br/>If RSClass.EOF Then <br/>Response.Write "没有记录。<BR>"</p><p>Else</p><p>Response.Write "<SELECT NAME=""class"" style=""FONT-SIZE: 9pt"" SIZE=10" & _<br/>" ONCHANGE=""classselected(this);"" >"<br/>sJavaScript = "function classselected(elem){" &_<br/>vbCrlf & _<br/>"for (var i = document.f1.sort.options.length; i >= 0; i--){" & vbCrlf & _<br/>"document.f1.sort.options
= null;" & _ <br/>vbCrlf<br/>Do Until RSClass.EOF<br/>If sLastClass <> RSClass("fldClass") Then<br/>sLastClass = RSClass("fldClass")<br/>Response.Write "<OPTION VALUE=" & RSClass("fldID") & ">" & sLastClass & "</OPTION>"<br/>sJavaScript = sJavaScript & "}" & vbCrlf & _<br/>"if (elem.options[elem.selectedIndex].value==" & _<br/>RSClass("fldID") & "){" & vbCrlf<br/>End If<br/>sJavaScript = sJavaScript & _<br/>"document.f1.sort.options[document." & _<br/>"f1.sort.options.length] = new Option('" & _<br/>RSClass("fldSort") & "','" & RSClass("fldID") & "');" & _<br/>vbCrlf<br/>RSClass.MoveNext<br/>Loop<br/>Response.Write "</SELECT>"<br/>Response.Write "<SELECT NAME=""sort"" style=""FONT-SIZE: 9pt"" SIZE=10>"<br/>Response.Write "<OPTION>[请选择]</OPTION>"<br/>Response.Write "</SELECT>"<br/><br/>sJavaScript = sJavaScript & vbCrlf & "}" & vbCrlf & "}" & vbCrlf<br/>Response.Write "<SCR" & "IPT LANGUAGE=""JavaScript"">" & vbCrlf<br/>Response.Write sJavaScript & vbCrlf & "</SCR" & "IPT>" & vbCrlf<br/>End If<br/>RSClass.Close<br/>Set RSClass = Nothing%><br/></form></p>
作者:
翔羽
时间:
2006-2-25 12:40
<strong>在asp中加密与解密对应的函数<hr/></strong><p>在ASP中加密方法有对应的解密方法好象不多,现在根据前辈资料整理出在asp中加密与解密函数 </p><p>rsa.asp <br/><% <br/>rem 在ASP中实现加密与解密,加密方法:根据RSA <br/>rem 联系:hnsoso@sina.com <br/>Class clsRSA </p><p> Public PrivateKey <br/> Public PublicKey <br/> Public Modulus <br/> <br/> <br/> <br/> Public Function Crypt(pLngMessage, pLngKey) <br/> On Error Resume Next <br/> Dim lLngMod <br/> Dim lLngResult <br/> Dim lLngIndex <br/> If pLngKey Mod 2 = 0 Then <br/> lLngResult = 1 <br/> For lLngIndex = 1 To pLngKey / 2 <br/> lLngMod = (pLngMessage ^ 2) Mod Modulus <br/> ' Mod may error on key generation <br/> lLngResult = (lLngMod * lLngResult) Mod Modulus <br/> If Err Then Exit Function <br/> Next <br/> Else <br/> lLngResult = pLngMessage <br/> For lLngIndex = 1 To pLngKey / 2 <br/> lLngMod = (pLngMessage ^ 2) Mod Modulus <br/> On Error Resume Next <br/> ' Mod may error on key generation <br/> lLngResult = (lLngMod * lLngResult) Mod Modulus <br/> If Err Then Exit Function <br/> Next <br/> End If <br/> Crypt = lLngResult <br/> End Function </p><p></p><p> Public Function Encode(ByVal pStrMessage) <br/> Dim lLngIndex <br/> Dim lLngMaxIndex <br/> Dim lBytAscii <br/> Dim lLngEncrypted <br/> lLngMaxIndex = Len(pStrMessage) <br/> If lLngMaxIndex = 0 Then Exit Function <br/> For lLngIndex = 1 To lLngMaxIndex <br/> lBytAscii = Asc(Mid(pStrMessage, lLngIndex, 1)) <br/> lLngEncrypted = Crypt(lBytAscii, PublicKey) <br/> Encode = Encode & NumberToHex(lLngEncrypted, 4) <br/> Next <br/> End Function <br/> <br/> Public Function Decode(ByVal pStrMessage) <br/> Dim lBytAscii <br/> Dim lLngIndex <br/> Dim lLngMaxIndex <br/> Dim lLngEncryptedData <br/> Decode = "" <br/> lLngMaxIndex = Len(pStrMessage) <br/> For lLngIndex = 1 To lLngMaxIndex Step 4 <br/> lLngEncryptedData = HexToNumber(Mid(pStrMessage, lLngIndex, 4)) <br/> lBytAscii = Crypt(lLngEncryptedData, PrivateKey) <br/> Decode = Decode & Chr(lBytAscii) <br/> Next <br/> End Function <br/> <br/> Private Function NumberToHex(ByRef pLngNumber, ByRef pLngLength) <br/> NumberToHex = Right(String(pLngLength, "0") & Hex(pLngNumber), pLngLength) <br/> End Function </p><p> Private Function HexToNumber(ByRef pStrHex) <br/> HexToNumber = CLng("&h" & pStrHex) <br/> End Function </p><p>End Class <br/>%> </p><p></p><p>test.asp <br/><!--#INCLUDE FILE="RSA.asp"--> <br/><% <br/>function Encryptstr(Message) <br/>Dim LngKeyE <br/>Dim LngKeyD <br/>Dim LngKeyN <br/>Dim StrMessage <br/>Dim ObjRSA </p><p><br/> LngKeyE = "32823" <br/> LngKeyD = "20643" <br/> LngKeyN = "29893" <br/> StrMessage = Message <br/> <br/> Set ObjRSA = New clsRSA <br/> <br/> <br/> ObjRSA.PublicKey = LngKeyE <br/> ObjRSA.Modulus = LngKeyN <br/> Encryptstr = ObjRSA.Encode(StrMessage) <br/> Set ObjRSA = Nothing <br/>end function </p><p></p><p><br/>function decryptstr(Message) <br/>Dim LngKeyE <br/>Dim LngKeyD <br/>Dim LngKeyN <br/>Dim StrMessage <br/>Dim ObjRSA </p><p><br/> LngKeyE = "32823" <br/> LngKeyD = "20643" <br/> LngKeyN = "29893" <br/> StrMessage = Message <br/> <br/> Set ObjRSA = New clsRSA </p><p> ObjRSA.PrivateKey =LngKeyD <br/> ObjRSA.Modulus=LngKeyN <br/> decryptstr=ObjRSA.Decode(StrMessage) <br/> Set ObjRSA = Nothing <br/>end function </p><p></p><p>dim last,first <br/>first="sohu" <br/>Response.Write "加密前为:"&first <br/>last=Encryptstr(first) <br/>Response.Write "加密后为"&last <br/>Response.Write "解密后为" &decryptstr(last) </p><p>%></p>
作者:
翔羽
时间:
2006-2-25 12:41
<p><strong>使用ASP生成HTML文件</strong></p><hr/><p><!--index.htm--></p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br/>"http://www.w3.org/TR/html4/loose.dtd"><br/><html><br/><head><br/><title>Untitled Document</title><br/><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br/></head></p><p><body><br/><table width="770" border="0" align="center" cellpadding="0" cellspacing="0"><br/><tr><br/><td><form name="form1" method="post" action="send.asp"><br/><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#CCFFFF"><br/><tr><br/><td height="20"><div align="center">发送消息</div></td><br/></tr><br/><tr><br/><td><div align="center"><br/><textarea name="msg" cols="100" rows="6"></textarea><br/></div></td><br/></tr><br/><tr><br/><td><div align="center"><br/><input type="submit" name="Submit" value="Submit"><br/><input type="reset" name="Submit2" value="Reset"><br/></div></td><br/></tr><br/></table><br/></form></td><br/></tr><br/></table><br/></body><br/></html><br/>'//send.asp</p><hr/><p><%<br/>function chan_time(shijian)'转换日期时间函数<br/>s_year=year(shijian)<br/>if len(s_year)=2 then s_year="20"&s_year<br/>s_month=month(shijian)<br/>if s_month<10 then s_month="0"&s_month<br/>s_day=day(shijian)<br/>if s_day<10 then s_day="0"&s_day<br/>s_hour=hour(shijian)<br/>if s_hour<10 then s_hour="0"&s_hour<br/>s_minute=minute(shijian)<br/>if s_minute<10 then s_minute="0"&s_minute<br/>chan_time=s_year & s_month & s_day & s_hour & s_minute<br/>end function</p><p>function chan_data(shijian) '转换日期时间函数<br/>s_year=year(shijian)<br/>if len(s_year)=2 then s_year="20"&s_year<br/>s_month=month(shijian)<br/>if s_month<10 then s_month="0"&s_month<br/>s_day=day(shijian)<br/>if s_day<10 then s_day="0"&s_day<br/>chan_data=s_year & s_month & s_day<br/>end function</p><p>function chan_file(shijian)'转换日期时间函数<br/>s_month=month(shijian)<br/>if s_month<10 then s_month="0"&s_month<br/>s_day=day(shijian)<br/>if s_day<10 then s_day="0"&s_day<br/>s_hour=hour(shijian)<br/>if s_hour<10 then s_hour="0"&s_hour<br/>s_minute=minute(shijian)<br/>if s_minute<10 then s_minute="0"&s_minute<br/>s_ss=second(shijian)<br/>if s_ss<10 then s_ss="0"&s_ss<br/>chan_file = s_month & s_day & s_hour & s_minute & s_ss<br/>end function<br/>top="<html><head><title>news</title></head><body>"<br/>botom="</body></html>"<br/>msg=request.Form("msg")<br/>msg=replace(msg,vbcrlf,"")<br/>msg=replace(msg,chr(9),"") <br/>msg=replace(msg," ","&nbsp;")<br/>msg=replace(msg,"\r\n","<br>")<br/>msg=replace(msg,"\n","<br>")<br/>msg=top&msg&botom<br/>Set fs=Server.CreateObject("Scripting.FileSystemObject")<br/>all_tree2=server.mappath("news")&"\"&chan_data(now)<br/>if (fs.FolderExists(all_tree2)) then'判断今天的文件夹是否存在<br/>else<br/>fs.CreateFolder(all_tree2)<br/>end if <br/>pass=chan_file(now)<br/>randomize '使用系统计时器来初始化乱数产生器<br/>pass=rnd(pass)<br/>pass=get_pass(pass)<br/>pass=left(pass,10)</p><hr/><br/>file1=pass<br/>files=file1&".txt"<br/>filez=all_tree2&"\"&files <p>set ts = fs.createtextfile(filez,true) '写文件<br/>for z=1 to len(msg)<br/>write_now=mid(msg,z,1)<br/>ts.write(write_now)<br/>next<br/>' ts.writeline(all_msg)<br/>ts.close<br/>set ts=nothing '文件生成</p><p>if err.number<>0 or err then%><br/><script language="javascript"><br/>alert("不能完成")<br/></script><br/><%else%><br/><script language="javascript"><br/>alert("已完成")<br/>history.back();<br/></script><br/><%end if<br/>Set MyFile = fs.GetFile(filez) <br/>all_tree2=server.mappath("news")&"\"&chan_data(now)<br/>if (fs.FolderExists(all_tree2)) then<br/>else<br/>fs.CreateFolder(all_tree2)<br/>end if <br/>MyFile.name= left(MyFile.name,len(MyFile.name)-4)&".htm" <br/>set MyFile=nothing <br/>set fs=nothing<br/>set fdir=nothing<br/>function get_pass(pass)</p><p>pass=cstr(pass)<br/>pass=replace(pass," ","")<br/>pass=replace(pass," ","")<br/>pass=replace(pass,"-","")<br/>pass=replace(pass," ","")<br/>pass=replace(pass,":","")<br/>pass=replace(pass,".","")<br/>pass=replace(pass,"+","")<br/>pass=replace(pass,"_","")<br/>pass=replace(pass,"<","")<br/>pass=replace(pass,">","")<br/>pass=replace(pass,"!","")<br/>pass=replace(pass,"@","")<br/>pass=replace(pass,"#","")<br/>pass=replace(pass,"$","")<br/>pass=replace(pass,"%","")<br/>pass=replace(pass,"^","")<br/>pass=replace(pass,"&","")<br/>pass=replace(pass,"*","")<br/>pass=replace(pass,"(","")<br/>pass=replace(pass,")","")<br/>pass=replace(pass,"=","")<br/>pass=replace(pass,"\","")<br/>pass=replace(pass,"/","")<br/>pass=replace(pass,"|","")<br/>get_pass=pass</p>
作者:
翔羽
时间:
2006-2-25 12:41
<p><strong>彩色校验码的制作</strong></p><hr/><p>要读懂这些代码主要是要了解ASP中操作二进制数据的对象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有这个基础,就可以进一步添加更多的功能如加入杂点,渐变底色,数字行列错位,笔画短点,提高被ocr识别的不可能。目前还没有好的识别引擎,昨天下载了个号称能识别图像验证码90%的!把4321识别成 89910,所以图像码还是比较安全的。</p><p>在网上看到有暴力破解的方法,如果我用图像附加码+禁止外部提交+10次密码错误封帐号 +50次密码错误琐死IP+10秒的防刷新间隔注册页,登陆页均要加上+禁止外部提交,这样,暴力破解应该就没戏了。</p><p>Asp文件:Code.Asp<br/>数据文件:body.Fix , Head.Fix<br/>用法:<img src="code.asp"></p><p>Response.buffer = true<br/>NumCode</p><p>Function NumCode()<br/>Response.Expires = -1<br/>Response.AddHeader "
ragma","no-cache"<br/>Response.AddHeader "cache-ctrol","no-cache"<br/>dim zNum,i,j<br/>dim Ados,Ados1<br/>Randomize timer<br/>生成随机四位数字:<br/>zNum = cint(8999*Rnd+1000)<br/>传递给session<br/>Session("GetCode") = zNum<br/>该for循环是将随机数字放入一个下标3的数组,便于提供给后面的阵列变换<br/>dim zimg(3),NStr<br/>NStr=cstr(zNum)<br/>For i=0 to 3<br/>zimg(i)=cint(mid(NStr,i+1,1))<br/>Next<br/>dim Pos</p><p>'定义二个 ADODB.Stream binary对象,作图像数据操作之用:</p><p>set Ados=Server.CreateObject("Adodb.Stream")<br/>Ados.Mode=3<br/>Ados.Type=1<br/>Ados.Open<br/>set Ados1=Server.CreateObject("Adodb.Stream")<br/>Ados1.Mode=3<br/>Ados1.Type=1<br/>Ados1.Open<br/>'载入0~9的数字数据10x100的,Gbr的阵列数据,每个320字节,10个数字3200byte<br/>'BGR一个点,10x10个点一个数字,一个点三个字节(二进制8位,16进制 00~FF)<br/>'一行10个点 30字节 + 行结束标记 00 00 二字节 32字节,所以一个10x100宽小于长的图像每个数字10x10是320字节<br/>'长大于宽的则无行结束标记 0000,直接是300字节<br/>这些就是BMP 24bit的数据详细信息了<br/>‘至于头部,也很简单,包含长宽,图像开始标记等等~~才54字节,远没jpg什么的复杂</p><p>Ados.LoadFromFile(Server.mappath("body.Fix"))<br/>Ados1.write Ados.read(1280)<br/>'第一个for循环,按生成的随机数字顺序从 10X100的数字阵列中提取出相应的四个数字<br/>但是竖排的数字阵列<br/>for i=0 to 3<br/>Ados.Position=(9-zimg(i))*320<br/>Ados1.Position=i*320<br/>Ados1.write ados.read(320)<br/>next<br/>'清空已经用完的ADOS的数据,调入替换新的图像头54字节的头文件 <br/>Ados.LoadFromFile(Server.mappath("head.fix"))<br/>
os=lenb(Ados.read())<br/>Ados.Position=Pos '指定Pos位置,即可再偏移54字节的位置添加图形数据<br/>第二个for循环,进行数字的阵列变换,由竖排的块转换为横排的数字块<br/>方法是隔320字节抽取4次30字节写入ados对象,再抽取偏移第二行的图像数据<br/>30字节是因为bmp 宽大于长时无00 00的行结束标记<br/>for i=0 to 9 step 1<br/>for j=0 to 3<br/>Ados1.Position=i*32+j*320<br/>Ados.Position=Pos+30*j+i*120<br/>Ados.write ados1.read(30)<br/>next<br/>next<br/>Ados.Position=0<br/>response.BinaryWrite直接向客户端发送图像数据<br/>Response.ContentType = "image/BMP"<br/>Response.BinaryWrite Ados.read()<br/>Ados.Close:set Ados=nothing<br/>Ados1.Close:set Ados1=nothing<br/>End Function</p>
作者:
翔羽
时间:
2006-2-25 12:42
<p><strong>远程获取内容,并将内容存在本地电脑上,包括任何文件</strong></p><hr/><p><%<br/>'------------------------------------------------------------------------<br/>'-------------------无垠网域:http://www.5inet.net/ ---------------------<br/>'-------------------作者:嘻哈呵嘿 ,webmaster@5inet.net -----------------<br/>'----------远程获取内容,并将内容存在本地电脑上,包括任何文件!----------<br/>'---------------利用xmlhttp和adodb.stream,酷!绝对原创!-----------------<br/>'On Error Resume Next<br/>'Set the content type to the specific type that you are sending.<br/>'Response.ContentType = "IMAGE/JPEG"<br/>'-------------------------------定义输出格式----------------------------- <br/><br/><br/>
ath=request.querystring("p")<br/>sPath = Path<br/>if left(lcase(path),7) <> "http://" then <br/>'-------------如果前面没有http就是本地文件,交给LocalFile处理------------<br/>LocalFile(path)<br/>else<br/>'--------------------否则为远程文件,交给RemoteFile处理------------------<br/>RemoteFile(Path)<br/>end if<br/>'Response.Write err.Description <br/><br/>sub LocalFile(Path)<br/>'-------------------如果为本地文件则简单的跳转到该页面-------------------<br/>Response.Redirect Path<br/>End Sub<br/><br/>Sub RemoteFile(sPath)<br/>'-------------------------处理远程文件函数------------------------------<br/>FileName = GetFileName(sPath)<br/>'-------------GetFileName为把地址转换为合格的文件名过程-------------<br/>FileName = Server.MapPath("/UploadFile/Cache/" & FileName)<br/>Set objFso = Server.CreateObject("Scripting.FileSystemObject")<br/>'Response.Write fileName<br/>if objFso.FileExists(FileName) Then<br/>'--------------检查文件是否是已经访问过,如是,则简单跳转------------<br/>Response.Redirect "/uploadfile/cache/" & GetFileName(path)<br/>Else<br/>'----------------否则的话就先用GetBody函数读取----------------------<br/>'Response.Write Path<br/>t = GetBody(Path)<br/>'-----------------用二进制方法写到浏览器上--------------------------<br/>Response.BinaryWrite t<br/>Response.Flush<br/>'-----------------输出缓冲------------------------------------------<br/>SaveFile t,GetFileName(path)<br/>'------------------将文件内容缓存到本地路径,以待下次访问-----------<br/>End if <br/>Set objFso = Nothing<br/>End Sub<br/><br/>Function GetBody(url) <br/>'-----------------------本函数为远程获取内容的函数---------------------<br/>'on error resume next<br/>'Response.Write url<br/>Set Retrieval = CreateObject("Microsoft.XMLHTTP") <br/>'----------------------建立XMLHTTP对象-----------------------------<br/>With Retrieval <br/>.Open "Get", url, False, "", "" <br/>'------------------用Get,异步的方法发送-----------------------<br/>.Send <br/>'GetBody = .ResponseText<br/>GetBody = .ResponseBody<br/>'------------------函数返回获取的内容--------------------------<br/>End With <br/>Set Retrieval = Nothing <br/>'response.Write err.Description <br/>End Function<br/><br/>Function GetFileName(str)<br/>'-------------------------本函数为合格化的文件名函数-------------------<br/>str = Replace(lcase(str),"http://","")<br/>str = Replace(lcase(str),"//","/")<br/>str = Replace(str,"/","")<br/>str = replace(str,vbcrlf,"")<br/>GetFileName = str<br/>End Function<br/><br/>sub SaveFile(str,fName)<br/>'-------------------------本函数为将流内容存盘的函数-------------------<br/>'on error resume next<br/>Set objStream = Server.CreateObject("ADODB.Stream")<br/>'--------------建立ADODB.Stream对象,必须要ADO 2.5以上版本---------<br/>objStream.Type = adTypeBinary<br/>'-------------以二进制模式打开-------------------------------------<br/>objStream.Open<br/>objstream.write str<br/>'--------------------将字符串内容写入缓冲--------------------------<br/>'response.Write fname<br/>objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite<br/>'--------------------将缓冲的内容写入文件--------------------------<br/>'response.BinaryWrite objstream.Read <br/>objstream.Close()<br/>set objstream = nothing<br/>'-----------------------关闭对象,释放资源-------------------------<br/>'response.Write err.Description <br/>End sub<br/>%> </p>
作者:
翔羽
时间:
2006-2-26 10:53
<p><strong>ASP代码的对象化</strong></p><hr/><p>提起ASP很多人就认为是一堆HTML脚本和被括在<%和%>之中的一些代码还有就是一些JAVASCRIPT脚本等筹在一起的一些代码的集合,这样的代码,再加上各类的不同格式的注释,看起来就一个字:乱。也不管别人能不能看得懂,只要是能实现自己的目的就可以了,因为ASP的代码也是脚本,给了客户也不可能不被人看到其中的内容,经多包容在DLL中一部分业务逻辑,但是还是觉得ASP代码是最不值钱的代码,没有人回去购买,可以随时从别人的网站中查看源码的形式得到别人辛辛苦苦编写出来的独特风格的东东。这些原因使ASP的发展成为了一种编的快忘的也快的代码,可读性,维护性也是各种语言中最为差的代码。<br/>其实,ASP代码也可以像其他语言一样的面向对象,模块化,将很多页面集成封装到一个类中,运用类中的不同方法来显示不同的页面,这样你可以将同一业务逻辑下的页面和逻辑封装到一个类里,用不同的方法来实现。说了这么多,可能大家的思路都乱了,赶快给大家一点范例来看看:</p><p><%<br/>'****************************************</p><p>'* 类名:clsWebWorkFlowLog </p><p>'* 功能:工作流日志跟踪类</p><p>'* History: </p><p>'* 作成:doface </p><p>'* 日期:2003/10/24 Ver 1.0 </p><p>'* 改动: </p><p>'* 日期:</p><p>'****************************************</p><p>class clsWebWorkFlowLog</p><p>'定义公开属性存放Connection对象<br/>public ActiveConnection<br/><br/>private oResponse<br/><br/>'========================================<br/>'= 过程名:main<br/>'= 参 数:<br/>'= 功 能:主调函数<br/>'= 根据不同动作参数执行不同的操作<br/>'= 返回值:<br/>'========================================<br/>sub main()<br/>select case Request("act")<br/>case "list"<br/>list()<br/>case else<br/>list()<br/>end select<br/>end sub<br/><br/>'========================================<br/>'= 过程名:list<br/>'= 参 数:<br/>'= 功 能:显示列表画面<br/>'= 返回值:<br/>'========================================<br/>sub list()<br/>dim oRs<br/>set oRs = ActiveConnection.execute("select *,(select name from wf_config where id=w.wf_id) as wfname from wf_log w where step_id=1 and user_id=" & session("usr")("uid"))<br/>'(select * from wf_log where id in (select max(id),wf_id,tab_id,rec_id from wf_log group by wf_id,tab_id,rec_id where wf_id= and tab_id=))<br/>%> <p align="left"><img border="0" src="../images/desk/workflow-new.gif" WIDTH="32" HEIGHT="32"><font color="#FF0000"><b>待办事宜:</b></font></p><br/><center></p><p><table bgColor="#FFFFFF" border="1" borderColorDark="#ffffff" borderColorLight="#c0c0c0" cellSpacing="0" width="99%" height="25"><br/><tr><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">流程名称</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">申请人</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">申请时间</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">完成时间</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">状态</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">操作</font></td><br/></tr><%<br/>do while not oRs.eof<br/>dim maxID,Next_id<br/>if glbFunc.getMaxID(oRs("id").value,ActiveConnection,maxID,Next_id) then<br/>%><tr><br/><td bgColor="#ffffff" height="19"><%=oRs("wfname")%></a></td><br/><td bgColor="#ffffff" height="19"><%=session("usr")("name")%>&nbsp;</td><br/><td bgColor="#ffffff" height="19"><%=oRs("exetime")%>&nbsp;</td><br/><td bgColor="#ffffff" height="19">&nbsp;</td><br/><td bgColor="#ffffff" height="19"><%=glbFunc.getCurZT(oRs("id").value,ActiveConnection)%></td><br/><td bgColor="#ffffff" height="19"><p align="left"><a href="../PubExeTab/PubExeTab.asp?act=view&tab_id=<%=oRs("tab_id")%>&id=<%=oRs("rec_id")%>"><img src="../images/action/view.gif" border="0" alt="详细" WIDTH="16" HEIGHT="16"></a>&nbsp;<a href="javascript:newin('wfimage.asp?act=list&id=<%=oRs("wf_id")%>&bz=1&step_id=<%=next_id%>',true,false,false,false,true);"><img src="../images/action/lcchuli.gif" border="0" alt="流程追踪" WIDTH="16" HEIGHT="16"></a>&nbsp;</p></td><%<br/>end if<br/>%></tr><%<br/>oRs.movenext<br/>loop<br/>%></table> </p><p></center><br/><%<br/>end sub<br/></p><p><br/>end class<br/>'****************************************<br/>'* 类结束 <br/>'****************************************</p><p><br/>'****************************************<br/>'ASP页面开始 <br/>'****************************************</p><p>'输出标准HTML头<br/>glbFunc.writeHEAD</p><p>dim oWebWorkFlowLog<br/>set oWebWorkFlowLog = new clsWebWorkFlowLog<br/>set oWebWorkFlowLog.ActiveConnection = glbFunc.getADOConnection</p><p>oWebWorkFlowLog.main </p><p>glbFunc.writeTail()<br/>%></p><p></p><p>可以添加更多的方法,这样这一个类就能完成以前多个ASP文件的功能。访问的时候,在 .ASP之后加上参数(要访问哪个函数)即可区分出来。</p><p><br/></p>
作者:
翔羽
时间:
2006-2-26 10:53
<p><strong>ASP代码的对象化</strong></p><hr/><p>提起ASP很多人就认为是一堆HTML脚本和被括在<%和%>之中的一些代码还有就是一些JAVASCRIPT脚本等筹在一起的一些代码的集合,这样的代码,再加上各类的不同格式的注释,看起来就一个字:乱。也不管别人能不能看得懂,只要是能实现自己的目的就可以了,因为ASP的代码也是脚本,给了客户也不可能不被人看到其中的内容,经多包容在DLL中一部分业务逻辑,但是还是觉得ASP代码是最不值钱的代码,没有人回去购买,可以随时从别人的网站中查看源码的形式得到别人辛辛苦苦编写出来的独特风格的东东。这些原因使ASP的发展成为了一种编的快忘的也快的代码,可读性,维护性也是各种语言中最为差的代码。<br/>其实,ASP代码也可以像其他语言一样的面向对象,模块化,将很多页面集成封装到一个类中,运用类中的不同方法来显示不同的页面,这样你可以将同一业务逻辑下的页面和逻辑封装到一个类里,用不同的方法来实现。说了这么多,可能大家的思路都乱了,赶快给大家一点范例来看看:</p><p><%<br/>'****************************************</p><p>'* 类名:clsWebWorkFlowLog </p><p>'* 功能:工作流日志跟踪类</p><p>'* History: </p><p>'* 作成:doface </p><p>'* 日期:2003/10/24 Ver 1.0 </p><p>'* 改动: </p><p>'* 日期:</p><p>'****************************************</p><p>class clsWebWorkFlowLog</p><p>'定义公开属性存放Connection对象<br/>public ActiveConnection<br/><br/>private oResponse<br/><br/>'========================================<br/>'= 过程名:main<br/>'= 参 数:<br/>'= 功 能:主调函数<br/>'= 根据不同动作参数执行不同的操作<br/>'= 返回值:<br/>'========================================<br/>sub main()<br/>select case Request("act")<br/>case "list"<br/>list()<br/>case else<br/>list()<br/>end select<br/>end sub<br/><br/>'========================================<br/>'= 过程名:list<br/>'= 参 数:<br/>'= 功 能:显示列表画面<br/>'= 返回值:<br/>'========================================<br/>sub list()<br/>dim oRs<br/>set oRs = ActiveConnection.execute("select *,(select name from wf_config where id=w.wf_id) as wfname from wf_log w where step_id=1 and user_id=" & session("usr")("uid"))<br/>'(select * from wf_log where id in (select max(id),wf_id,tab_id,rec_id from wf_log group by wf_id,tab_id,rec_id where wf_id= and tab_id=))<br/>%> <p align="left"><img border="0" src="../images/desk/workflow-new.gif" WIDTH="32" HEIGHT="32"><font color="#FF0000"><b>待办事宜:</b></font></p><br/><center></p><p><table bgColor="#FFFFFF" border="1" borderColorDark="#ffffff" borderColorLight="#c0c0c0" cellSpacing="0" width="99%" height="25"><br/><tr><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">流程名称</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">申请人</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">申请时间</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">完成时间</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">状态</font></td><br/><td bgColor="#808080" height="15"><font color="#FFFFFF">操作</font></td><br/></tr><%<br/>do while not oRs.eof<br/>dim maxID,Next_id<br/>if glbFunc.getMaxID(oRs("id").value,ActiveConnection,maxID,Next_id) then<br/>%><tr><br/><td bgColor="#ffffff" height="19"><%=oRs("wfname")%></a></td><br/><td bgColor="#ffffff" height="19"><%=session("usr")("name")%>&nbsp;</td><br/><td bgColor="#ffffff" height="19"><%=oRs("exetime")%>&nbsp;</td><br/><td bgColor="#ffffff" height="19">&nbsp;</td><br/><td bgColor="#ffffff" height="19"><%=glbFunc.getCurZT(oRs("id").value,ActiveConnection)%></td><br/><td bgColor="#ffffff" height="19"><p align="left"><a href="../PubExeTab/PubExeTab.asp?act=view&tab_id=<%=oRs("tab_id")%>&id=<%=oRs("rec_id")%>"><img src="../images/action/view.gif" border="0" alt="详细" WIDTH="16" HEIGHT="16"></a>&nbsp;<a href="javascript:newin('wfimage.asp?act=list&id=<%=oRs("wf_id")%>&bz=1&step_id=<%=next_id%>',true,false,false,false,true);"><img src="../images/action/lcchuli.gif" border="0" alt="流程追踪" WIDTH="16" HEIGHT="16"></a>&nbsp;</p></td><%<br/>end if<br/>%></tr><%<br/>oRs.movenext<br/>loop<br/>%></table> </p><p></center><br/><%<br/>end sub<br/></p><p><br/>end class<br/>'****************************************<br/>'* 类结束 <br/>'****************************************</p><p><br/>'****************************************<br/>'ASP页面开始 <br/>'****************************************</p><p>'输出标准HTML头<br/>glbFunc.writeHEAD</p><p>dim oWebWorkFlowLog<br/>set oWebWorkFlowLog = new clsWebWorkFlowLog<br/>set oWebWorkFlowLog.ActiveConnection = glbFunc.getADOConnection</p><p>oWebWorkFlowLog.main </p><p>glbFunc.writeTail()<br/>%></p><p></p><p>可以添加更多的方法,这样这一个类就能完成以前多个ASP文件的功能。访问的时候,在 .ASP之后加上参数(要访问哪个函数)即可区分出来。</p><p><br/></p>
作者:
翔羽
时间:
2006-2-26 10:54
<p><strong>轻松实现将上传图片到数据库</strong></p><hr/><p>很久就想自己写一写程序了,不过由于赖就不想写我,今天刚好有空,所以写了这个小小的程序很容易一看就知道的,不多说了就此开始:</p><p> 我们做一个上传的。数据据库的字段就id自动编号 big 字段类型是 OLE 呵呵就简单的那个字段好了<br/> <br/> uppic.asp上传程序名<br/> <br/> <%<br/> dim rs <br/> dim formsize,formdata,bncrlf,divider,datastart,dataend,mydata<br/> formsize=request.totalbytes '取得客户端发过来的大小<br/> formdata=request.binaryread(formsize)'把客户发过来的数据转成二进制作<br/> bncrlf=chrB(13) & chrB(10)<br/> divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1)<br/> datastart=instrb(formdata,bncrlf & bncrlf)+4<br/> dataend=instrb(datastart+1,formdata,divider)-datastart<br/> mydata=midb(formdata,datastart,dataend)'上面总共是取得图片的二进制数据<br/><br/> %><br/> <!--#include file="conn.asp"--><br/> <%<br/> sql="select * from pic order by id desc"<br/> Set rs = Server.CreateObject("ADODB.Recordset")<br/> rs.Open sql,conn,3,2<br/> rs.addnew<br/> rs("big").appendchunk mydata '增加到数据库中<br/> rs.update<br/> set rs=nothing<br/> set conn=nothing<br/> %> <br/> 接下来是显示图片<br/> <br/> display.asp<br/> <br/> <!--#include file="conn.asp"--> '这个大家都知道吧,他就是与数据库连的一个程序了<br/> <% <br/> id=request("id")<br/> set rs=server.createobject("ADODB.recordset") <br/> sql="select * from pic where id=" & id<br/> rs.open sql,conn,1,1 <br/> Response.ContentType = "text/html" '显示图片的格式也可以用<br/> <br/> 'Response.ContentType = "image/gif" 以gif显示<br/> <br/> 'Response.ContentType = "image/jpg" 以jpg显示<br/> Response.BinaryWrite rs("big") '显示图片<br/> rs.close <br/> set rs=nothing <br/> set connGraph=nothing <br/> <br/> %></p><p> </p>
作者:
翔羽
时间:
2006-2-26 10:54
<p><strong>记录集内随机取记录的代码</strong></p><hr/><p><% <br/>' Moving to random record - Steven Jones' Extension<br/>If Not(记录集名称.bof and 记录集名称.eof) Then<br/>' reset the cursor to the beginning<br/>If (记录集名称.CursorType > 0) Then<br/>记录集名称.MoveFirst<br/>Else<br/>记录集名称.Requery<br/>End If</p><p>记录集名称_totalrn = -1<br/>记录集名称_totalrn = 记录集名称.RecordCount ' ony works on some recordsets, but much faster<br/>If (记录集名称_totalrn = -1) Then ' and if it didn't work, we still have to count the records.</p><p>' count the total records by iterating through the recordset<br/>记录集名称_totalrn=0<br/>While (Not 记录集名称.EOF)<br/>记录集名称_totalrn = 记录集名称_totalrn + 1<br/>记录集名称.MoveNext<br/>Wend</p><p>' reset the cursor to the beginning<br/>If (记录集名称.CursorType > 0) Then<br/>记录集名称.MoveFirst<br/>Else<br/>记录集名称.Requery<br/>End If</p><p>End If</p><p>' now do final adjustments, and move to the random record <br/>记录集名称_totalrn = 记录集名称_totalrn - 1<br/>If 记录集名称_totalrn > 0 Then<br/>Randomize<br/>记录集名称.Move Int((记录集名称_totalrn + 1) * Rnd)<br/>End If <br/>End If<br/>' all done; you should always check for an empty recordset before displaying data<br/>%></p>
作者:
翔羽
时间:
2006-2-26 10:54
<p><strong>计算两个时间差的函数</strong></p><hr/><p>'******************************<br/>'||Function TimeDiff(sBegin, sEnd)<br/>'||本函数计算两个时间的差,可以不用更改直接使用<br/>'||作者:machinecat 2001/10/26<br/>'******************************</p><p>'******************************<br/>'注:首先需要判断用户输入的sBegin与sEnd之间的大小<br/>'可以通过DataDiff函数获得两者之间的时间差,不需要进行复杂的时间换算<br/>'******************************</p><p>Function TimeDiff(sBegin, sEnd)<br/>Dim iHourB, iMinuteB, iSecondB, iMiniSecondB<br/>Dim iHourE, iMinuteE, iSecondE, iMiniSecondE<br/>Dim dTimeB, dTimeE, dTimeDiff<br/>Dim iHour, iMinute, iSecond, iMiniSecond</p><p>iHourB = clng(Left(sBegin, 2))<br/>iMinuteB = clng(Mid(sBegin, 4, 2))<br/>iSecondB = clng(Mid(sBegin, 7, 2))<br/>iMiniSecondB = clng(Mid(sBegin, 10, 4))</p><p>iHourE = clng(Left(sEnd, 2))<br/>iMinuteE = clng(Mid(sEnd, 4, 2))<br/>iSecondE = clng(Mid(sEnd, 7, 2))<br/>iMiniSecondE = clng(Mid(sEnd, 10, 4))</p><p>dTimeB = iHourB * 3600 + iMinuteB * 60 + iSecondB + iMiniSecondB / 1000<br/>dTimeE = iHourE * 3600 + iMinuteE * 60 + iSecondE + iMiniSecondE / 1000<br/>dTimeDiff = dTimeE - dTimeB</p><p>iHour = Int(dTimeDiff / 3600)<br/>dTimeDiff = dTimeDiff - iHour * 3600<br/>iMinute = Int(dTimeDiff / 60)<br/>dTimeDiff = dTimeDiff - iMinute * 60<br/>iSecond = Int(dTimeDiff)<br/>dTimeDiff = dTimeDiff - Int(dTimeDiff)<br/>iMiniSecond = dTimeDiff</p><p>TimeDiff = iHour & "小时" & iMinute & "分钟" & iSecond & FormatNumber(iMiniSecond, 3) & "秒"<br/>End Function <br/></p>
作者:
翔羽
时间:
2006-2-26 10:54
<p><strong>网址和邮件地址的转换函数</strong></p><hr/><p><%<br/>function URLconvert(str) <br/>convertstr=str<br/>urlLocation=instr(convertstr,"http://")</p><p>if (urlLocation=0) and (mailLocation=0) then <br/>URLconvert=convertstr<br/>exit function<br/>end if</p><p>if urlLocation<>0 then<br/>rightstr=str<br/>Do while urlLocation<>urlLocationend<br/>urlLocation=instr(rightstr,"http://")<br/>urlLocationend=InStrRev(rightstr,"http://")<br/>finalstr=finalstr&left(rightstr,urlLocation-1)<br/>midurlstr=mid(rightstr,urlLocation+1,1)<br/>do while (asc(midurlstr)>=45) and (asc(midurlstr)<=126)<br/>loopint=loopint+1<br/>midurlstr=mid(rightstr,urlLocation+loopint,1)<br/>if midurlstr="" then exit do<br/>loop<br/>endURLstr=mid(rightstr,urllocation,loopint)<br/>URLstr="<a href="&endURLstr&">"&endURLstr&"</a>"<br/>rightstr=mid(rightstr,urllocation+loopint)<br/>finalstr=finalstr&URLstr<br/>loopint=1<br/>Loop <br/>end if<br/>finalstr=finalstr&rightstr</p><p>convertstr1=finalstr<br/>finalstr=""<br/>mailLocation=instr(convertstr1,"@")<br/>if mailLocation<>0 then<br/>Do while mailLocation<>mailLocationend<br/>mailLocation=instr(convertstr1,"@")<br/>mailLocationend=InStrRev(convertstr1,"@")<br/>mainmidmailstr=mid(convertstr1,mailLocation+1,1)<br/>midmailstr=mainmidmailstr<br/>do while (asc(midmailstr)>=45) and (asc(midmailstr)<=126)<br/>loopint1=loopint1+1<br/>midmailstr=mid(convertstr1,mailLocation-loopint1,1)<br/>loop<br/>firstSTR=mid(convertstr1,mailLocation-loopint1+1,loopint1-1)</p><p>finalstr=finalstr&left(convertstr1,mailLocation-loopint1)</p><p>midmailstr1=mainmidmailstr <br/>do while (asc(midmailstr1)>=45) and (asc(midmailstr1)<=126)<br/>loopint2=loopint2+1<br/>midmailstr1=mid(convertstr1,mailLocation+loopint2,1)<br/>if midmailstr1="" then exit do<br/>loop<br/>secondSTR=mid(convertstr1,mailLocation,loopint2)</p><p>endmailstr=firstSTR&secondSTR<br/>mailstr="<a href=mailto:"&endmailstr&">"&endmailstr&"</a>"<br/>finalstr=finalstr&mailstr<br/>convertstr1=mid(convertstr1,maillocation+loopint2)<br/>loopint1=1<br/>loopint2=1<br/>Loop<br/>end if<br/>finalstr=finalstr&convertstr1<br/>URLconvert=finalstr<br/>end function<br/>%><br/></p>
作者:
翔羽
时间:
2006-2-26 10:55
<p><strong>最简洁的多重查询的解决方案</strong></p><hr/><p>[前言]<br/>我们经常会遇到多重查询问题,而长长的SQL语句往往让人丈二和尚摸不着头脑。特别是客户端部分填入查询条件时,如用普通方法将更是难上加难。<br/>以下巧妙地利用"where 1=1"的恒等式(事实上很多,让它值为TRUE即可)解决此问题。</p><p>[正文概要]</p><p>'subject 信息标题<br/>'company 发布信息的公司名称<br/>'content 发布信息的内容<br/>'address 公司地址<br/>'infomation 公司简介<br/>'note 相关说明<br/>以上值均由FORM提交,然后通过:subject=trim(Request.Form("subject"))等得到相应的值。</p><p><%<br/>'这个函数很关键!---------------------------<br/>Function sql(a,b,sqls)<br/>if b<>"" then '如果客户端没有提交此值,则不会产生相应的SQL语句。<br/>sqls=sqls & " and " & a & " like '%" & b & "%'"<br/>end if<br/>sql=sqls<br/>End Function<br/>'-----------------调用数据库<br/>Set conn=Server.CreateObject("ADODB.Connection")<br/>DBpath=Server.MapPath("/database/mydb.mdb")<br/>Conn.Open "driver={Microsoft Access Driver (*.mdb)};pwd=;dbq=" & DBpath<br/>Set rs=Server.CreateObject("ADODB.Recordset")<br/>sqls="select * from mytable where 1=1 "<br/>'以下调用上面的函数即可,可以很多个调用(理论上是任意)<br/>sqls=sql("subject",subject,sqls)<br/>sqls=sql("company",company,sqls)<br/>sqls=sql("content",content,sqls)<br/>sqls=sql("address",address,sqls)<br/>sqls=sql("infomation",infomation,sqls)<br/>sqls=sql("note",note,sqls)<br/>sqls=sqls & " order by id desc"<br/>rs.open sqls,conn,3,2<br/>%></p>
作者:
翔羽
时间:
2006-2-26 10:56
<p><strong>无限级分类</strong></p><hr/><p>比较简单的一个页面,类似csdn论坛在ns下的左边列表</p><p>描述:</p><p>1.</p><p>数据名:tree.mdb</p><p>表名:tree</p><p>表结构:id(自编) pid(数字) content(文本) link(文本)</p><p>2.</p><p>图片:endnode.gif collapsed.gif back.gif(均在img目录下,可自行修改)</p><p>3.</p><p>代码:</p><p><!--#include file="conn.inc"--><br/><HTML><br/><HEAD><br/><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br/><META NAME="GENERATOR" Content="Microsoft FrontPage 4.0"><br/><TITLE>无限级列表</TITLE><br/><!--<br/>by fason(2003-5-12)<br/>--><br/><style><br/>.node{<br/>font-size:12px;<br/>padding:0 0 2 0;<br/>margin-left:10;<br/>height:22px;<br/>}<br/>img{<br/>vertical-align:middle;<br/>width:11px;<br/>height:11px;<br/>}<br/>a{text-decoration:none;font-size:12px;color:black}<br/>.deeptree{<br/>width:100%;<br/>height:100%;<br/>backgound-color:#f2f2f2;<br/>overflow:auto;<br/>}</p><p></style><br/></HEAD><br/><BODY bgcolor=#f2f2f2><br/><nobr><br/><div class="deeptree"><br/><%<br/>newid=Request.QueryString("id")<br/>if newid="" or CInt(newid)<0 then newid=0<br/>if isNumeric(newid) then<br/>listTree(CInt(newid))<br/>end if</p><p>function listTree(id)<br/>dim rs<br/>dim imgFolder,imgFile<br/>dim link,href,parentHref<br/>dim target,ahref,click<br/>target="main" '所指定的框架名<br/>imgFolder="img/" '默认路径<br/>set rs=conn.execute("select *,(select count(*) from tree where pid = T.id) as children,(select pid from tree where id="&id&") as parent from tree T where pid="&id)<br/>if not rs.eof then<br/>parentHref=Request.ServerVariables("URL")&"?id="&rs("parent")<br/>if id<>0 then Response.Write "<div class='node' nowrap=true><a href='"&parentHref&"' onfocus='blur()'><img src='"&imgFolder&"back.gif' border=0></a> <a href='"&parentHref&"'>上一级目录</a></div>"&VbCrLf<br/>do while not rs.eof <br/>if rs("children")>0 then<br/>img=imgFolder+"collapsed.gif"<br/>href=Request.ServerVariables("URL")&"?id="&rs("id")<br/>click="onclick=""location.href='"&href&"'"""<br/>else<br/>img=imgFolder+"endnode.gif"<br/>href="javascript:void(0)"<br/>end if<br/>if not isNull(rs("link")) then<br/>ahref=rs("link")<br/>else<br/>ahref="javascript:void(0)"<br/>target="_self"<br/>end if<br/>link="<a href='"&ahref&"' target='"&target&"' title='"&rs("content")&"' "&click&">"&rs("content")&"</a>"<br/>Response.Write "<div class='node' nowrap=true><a href='"&href&"' onfocus='blur()'><img src='"&img&"' border=0></a> "&link&"</div>"<br/>rs.movenext<br/>loop<br/>rs.close:set rs=nothing<br/>end if<br/>end function<br/>conn.close:set conn=nothing<br/>%></p><p></div><br/></nobr><br/></BODY><br/></HTML></p><p><br/>conn.inc:</p><p><%<br/>dim conn<br/>set conn = Server.CreateObject("ADODB.Connection")<br/>conn.Open "
rovider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.mappath("tree.mdb") & "
ersist Security Info=False"<br/>%></p><p>4.测试:ie6,ns7,mozilla下测试通过</p>
作者:
翔羽
时间:
2006-2-26 10:56
<p><strong>无组件的数据库的备份与还原</strong></p><hr/><p>看过数据库的备份与还原。大多数都是用组件来完成的。其实可通过sql语句来完成。<br/>由于时间关系,未对参数进行验证和界面美化。代码仅供参考。<br/>共计4个文件:下载地址:http://ad.ceh.com.cn/sql.rar<br/>conn.asp<br/><%<br/>conn="
rovider=SQLOLEDB.1
ersist Security Info=false;Server=127.0.0.1;UID=sa;pwd=www.zhi.net;database=master"<br/>function rec(rs,sql)<br/>set rs = server.CreateObject("ADODB.Recordset")<br/>rs.Activeconnection = conn<br/>rs.Source = sql<br/>rs.CursorType = 0<br/>rs.Cursorlocation = 3<br/>rs.LockType = 1<br/>rs.Open<br/>if rs.eof and rs.bof then<br/>rec= false<br/>else<br/>rec= true<br/>end if<br/>end function<br/>function cmd(sql)<br/>dim cmd1<br/>set cmd1 = server.CreateObject("ADODB.Command")<br/>cmd1.ActiveConnection = conn<br/>cmd1.CommandText = sql<br/>cmd1.CommandType = 1<br/>cmd1.CommandTimeout = 0<br/>cmd1.Prepared = true<br/>cmd1.Execute()<br/>end function<br/>function cdb(rs)<br/>rs.close()<br/>set rs=nothing<br/>end function<br/>%><br/>dev.asp<br/><!--#include file="conn.asp"--><br/><%<br/>if request("AddDev") <> "" then<br/>sql="select name,phyname from master..sysdevices where status=16 and name='"&request("devname")&"'"<br/>rec chk,sql<br/>if chk.eof and chk.bof then<br/>sql = "sp_addumpdevice 'disk','"&request("devname")&"','"&request("phyname")&"'"<br/>cmd sql<br/>response.Write "<script language=javascript>window.location=reload;</script>"<br/>else<br/>response.Write "<script language=javascript>alert('数据库中已存在"&request("devname")&"设备!');window.location='cmd.asp';</script>"<br/>end if<br/>end if<br/>if request("deldev") <> "" then<br/>sql = "sp_dropdevice '"&request("devname")&"'"<br/>cmd sql<br/>response.Write "<script language=javascript>window.location=reload;</script>"<br/>end if<br/>rec li,"select name,phyname from master..sysdevices where status=16"<br/>if li.eof and li.bof then<br/>response.Write "<font color=#ff0000>请新建备份设备用来备份还原数据库</font>"<br/>else<br/>%><style type="text/css"><br/><!--<br/>body {<br/>margin-left: 0px;<br/>margin-top: 0px;<br/>}<br/>--><br/></style><br/><table width="60%" border="0" cellspacing="0"><br/><tr><br/><td width="29%">名称:</td><br/><td width="71%">位置:</td><br/></tr><br/><%<br/>i=0<br/>while not li.eof <br/>i=i+1<br/>%><br/><tr><br/><td><%=li(0)%></td><br/><td><%=li(1)%> <a href='dev.asp?DelDev=1&devname=<%=li(0)%>'>删除此设备</a></td><br/></tr><br/><%<br/>li.movenext<br/>wend<br/>response.Write "<script language=javascript>top.document.all.dev.height='"&(i+1)*25&"';</script>"<br/>cdb li<br/>%><br/></table><br/><%<br/>end if<br/>%><br/>default.asp<br/><%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><br/><!--#include file="conn.asp"--><br/><%<br/>'*************************************************<br/>'数据库备份与还原<br/>'编 程:魔术师·杨(MagicYang.CN)<br/>'完成日期:2004-4-11<br/>'说明:由于时间关系,未对数据做安全性验证。</p>
作者:
翔羽
时间:
2006-2-26 10:56
'*************************************************<br/>%><br/><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><br/><html><br/><head><br/><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br/><title>数据库的备份与还原</title><br/></head><p><br/><body><br/><%</p><p>%><br/><table width="80%" border="0" align="center"><br/><tr><br/><td width="21%" valign="top">数据库设备:</td><br/><td width="79%"><br/><iframe name="dev" src="dev.asp" width="100%" height="200" frameborder="0" scrolling="no"></iframe><br/></td><br/></tr><br/><tr><br/><td>添加设备:</td><br/><td>设备名称:<br/><input name="devname" type="text" id="devname" size="10" maxlength="10"></td><br/></tr><br/><tr><br/><td>&nbsp;</td><br/><td>文件路径:<br/><input name="phyname" type="text" id="phyname" size="20" maxlength="50"><br/><input type="button" value="添加设备" onClick="document.all.dev.src='dev.asp?AddDev=1&devname='+document.all.devname.value+'&phyname='+document.all. phyname.value;"></td><br/></tr><br/><tr><br/><td valign="top">备份/还原:</td><br/><td><br/>数据库名称:<br/><%<br/>rec li,"select name from master..sysdatabases where status=16"<br/><br/>%><br/><select name="b_data"><br/><%<br/>while not li.eof <br/>response.Write "<option value="&li(0)&">"&li(0)&"</option>"<br/>li.movenext<br/>wend<br/>cdb li<br/>%><br/></select><br><br/>备份到设备:<%<br/>rec li,"select name,phyname from master..sysdevices where status=16"<br/>%><br/><select name="b_dev"><br/><%<br/>while not li.eof<br/>response.Write "<option value="&li(0)&">"&li(0)&"(文件:"&li(1)&")</option>"<br/>li.movenext<br/>wend<br/>cdb li<br/>%><br/></select><br><br/><input name="按钮" type="button" value="备份数据库" onClick="window.location='cmd.asp?action=backup&database='+document.all.b_data.value+'&dev='+document.all. b_dev.value;"><br/>&nbsp;<br/><input name="按钮" type="button" value="还原数据库" onClick="window.location='cmd.asp?action=RESTORE&database='+document.all.b_data.value+'&dev='+document.all. b_dev.value;"> </td><br/></tr><br/><tr><br/><td>&nbsp;</td><br/><td>&nbsp;</td><br/></tr><br/></table><br/></body><br/></html><br/>cmd.asp<br/><!--#include file="conn.asp"--><br/><%<br/>on error resume next<br/>if request("action") <> "" then<br/>if request("action")="backup" then<br/>sql ="BACKUP DATABASE "&request("database")&" To "& request("dev")<br/>cmd sql<br/>if err.number > 0 then<br/>response.Write "<script language=javascript>alert('数据库"&request("database")&"备份失败!');window.location='default.asp';</script>"<br/>else<br/>response.Write "<script language=javascript>alert('数据库"&request("database")&"备份成功!');window.location='default.asp';</script>"<br/>end if<br/>else<br/>sql ="RESTORE DATABASE "&request("database")&" From "& request("dev")<br/>cmd sql<br/>if err.number > 0 then<br/>response.Write "<script language=javascript>alert('数据库"&request("database")&"还原失败!');window.location='default.asp';</script>"<br/>else<br/>response.Write "<script language=javascript>alert('数据库"&request("database")&"还原成功!');window.location='default.asp';</script>"<br/>end if<br/>end if<br/>end if<br/>%></p>
作者:
翔羽
时间:
2006-2-26 10:57
<p><strong>无组件实现文件上传/下载</strong></p><p></p><hr/><p>'==================================================================<br/>'<br/>' 用ASP实现无组件上传/下载文件<br/>'<br/>' 功能简介 <br/>' 将上传的文件数据保存到数据库中,可以处理表单中的多个上传文件的情况<br/>' 适用于各种数据库,使用ADO的方法连接数据库<br/>' 本示例中使用的是ACCESS数据库:zj.mdb<br/>' 表:tb_img(id int(自增列),path text(255) 保存上传文件的目录<br/>' ,fname text(250) 保存上传的文件名,type test(250) 保存上传文件的类型<br/>' ,img ole对象 保存上传的文件内容<br/>'<br/>' <br/>'==================================================================</p><p><br/>'==================================================================<br/>'<br/>' 上传文件的HTML页: zj_up.htm<br/>'<br/>'==================================================================<br/><html><br/><head><br/><title>文件上传保存到数据库中</title><br/></head><br/><body><br/><form name="form1" enctype="multipart/form-data" method="post" action="zj_up.asp"><br/><p><br/><input type="file" name="file"><br/><input type="submit" name="Submit" value="上传"><br/></p><br/></form><br/></body><br/></html></p><p><br/>'==================================================================<br/>'<br/>' 上传文件保存到数据库的ASP页: zj_up.asp<br/>'<br/>'==================================================================<br/><%<br/>Response.Expires=0<br/>Function f_Bin2Str(ByVal sBin)<br/>Dim iI, iLen, iChr, iRe <br/>iRe = ""<br/>If Not IsNull(sBin) Then<br/>iLen = LenB(sBin)<br/>For iI = 1 To iLen<br/>iChr = MidB(sBin, iI, 1)<br/>If AscB(iChr) > 127 Then<br/>iRe = iRe & Chr(AscW(MidB(sBin, iI + 1, 1) & iChr))<br/>iI = iI + 1<br/>Else<br/>iRe = iRe & Chr(AscB(iChr))<br/>End If<br/>Next<br/>End If <br/>f_Bin2Str = iRe<br/>End Function<br/>iConcStr = "
rovider=Microsoft.Jet.OLEDB.4.0
ersist Security Info=False" & _ <br/>";Data Source=" & server.mappath("zj.mdb")<br/>iSql="tb_img"<br/>set iRe=Server.CreateObject("ADODB.Recordset")<br/>iRe.Open iSql,iConcStr,1,3<br/>iLen=Request.TotalBytes<br/>sBin=Request.BinaryRead(iLen)<br/>iCrlf1 = ChrB(13) & ChrB(10)<br/>iCrlf2 = iCrlf1 & iCrlf1<br/>iLen = InStrB(1, sBin, iCrlf1) - 1<br/>iSpc = LeftB(sBin, iLen)<br/>sBin = MidB(sBin, iLen + 34)<br/>iPos1 = InStrB(sBin, iCrlf2) - 1<br/>While iPos1 > 0<br/>iStr = f_Bin2Str(LeftB(sBin, iPos1))<br/>iPos1 = iPos1 + 5<br/>iPos2 = InStrB(iPos1, sBin, iSpc)<br/><br/>iPos3 = InStr(iStr, "; filename=""") + 12<br/>If iPos3 > 12 Then<br/>iStr = Mid(iStr, iPos3)<br/>iPos3 = InStr(iStr, Chr(13) & Chr(10) & "Content-Type: ") - 2<br/>iFn = Left(iStr, iPos3)<br/>If iFn <> "" Then<br/>iRe.AddNew<br/>ire("path")=left(iFn,instrrev(iFn,"\")) <br/>iRe("fname") = mid(iFn,instrrev(iFn,"\")+1)<br/>iRe("type") = Mid(iStr, iPos3 + 18)<br/>iRe("img").AppendChunk MidB(sBin, iPos1, iPos2 - iPos1)<br/>iRe.Update<br/>End If<br/>End If<br/><br/>sBin = MidB(sBin, iPos2 + iLen + 34)<br/>iPos1 = InStrB(sBin, iCrlf2) - 1<br/>Wend<br/>iRe.close<br/>set iRe=Nothing<br/>%></p><p>'==================================================================<br/>'<br/>' 下载数据的ASP页: zj_down.asp<br/>'<br/>'==================================================================<br/><%<br/>Response.Buffer=true<br/>Response.Clear</p><p>iConcStr = "
rovider=Microsoft.Jet.OLEDB.4.0
ersist Security Info=False" & _ <br/>";Data Source=" & server.mappath("zj.mdb")<br/>set iRe=server.createobject("adodb.recordset")<br/>iSql="tb_img"<br/>iRe.open iSql,iconcstr,1,1<br/>Response.ContentType=ire("type")<br/>Response.BinaryWrite iRe("img")</p><p>iRe.close<br/>set iRe=Nothing<br/>%></p>
作者:
翔羽
时间:
2006-2-26 10:57
<p><strong>加速ASP程序的显示速度</strong> </p><p></p><hr/><p> 作为一个ASP程序员,你不会怀疑提高Web应用程序性能的重要性。为了让程序运行的更快一些,你可能一直忙于优化数据库或COM组件。如果这些你都做过了,你想到过靠加快最终生成HTML代码在浏览器中的显示速度来提高性能吗?对于最终用户来说,如果页面能显示的更快,你就能赢得更多的赞誉。</p><p> 提高HTML在浏览器中显示的速度可以通过一些鲜为人知的技术来实现。 </p><p> 1.使用表格嵌套? </p><p> 在页面中建立复杂的结构,一般通过在页面中放置HTML表格来实现。如果要建立一个这样的页面:这个页面有一个顶部导航栏一个左边导航栏,一个右边的内容区。可以用一个两行两列的大表格来建立它。第一行中,合并两个列,然后插入一个顶部导航栏。第二行左边的列中,插入一个表格来显示导航按钮。右边的栏中,放置一个表格来实际内容。(见图一)这样嵌套的表格生成的代码是这样的: </p><p> <TABLE BORDER="0"> <br/> <TR> <br/> <TD COLSPAN="2"><!-- content for top nav bar --></TD> <br/> </TR> <br/> <TR> <br/> <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for left nav bar --></TD> <br/> <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for body of page --></TD> <br/> </TR> <br/> </TABLE> </p><p> 但是,实际上,浏览器找到<TABLE>标签的时候并不是立刻把页面显示到屏幕上,除非它找到相应的结束标签</TABLE>。所以,如果你的整个页面在一个表格里的话,在收到最后一个</TABLE>之前,什么也不会显示出来,这样,这个页面将在整个文件全部下载以后才能被用户所看到。在页面数据量比较大的时候(比如搜索引擎的搜索结果),这个特性会导致暂时的停顿。为了防止出现这种情况,可以在制作的时候把页面分成许多小的表格。在每一个<TABLE>到相应的</TABLE>这一部分HTML代码下载完的时候,浏览器就会把它显示出来。在访问者看来页面是渐渐的,一部分一部分,越来越多的出现在屏幕上的。感觉上,这样的页面显示速度比下载完整个文件再一次显示出来更快。 </p><p> 按照这个原则来研究前面的例子,应该把页面中整个的大表分成三个单独的表。用第一个表显示顶部的导航栏,调节它的宽度,使它足够容纳所有的内容,在一个<TABLE></TABLE>代码段中完成它。页面下半部分,左边第二个表排成一列。使用第三个表容纳实际内容。(见图二)因为每一个部分都是一个完整的表格,所以,每一部分代码下载后都会立刻被显示出来。这样,顶部和左边的导航栏将比页面的其它部分更显显示出来。用户会在这个时候想象页面开始下载,很快就能显示在屏幕上。这样比起让用户在较长时间内一直面对一个空白屏幕要好得多。 </p><p> 修改过的代码是这样的: </p><p> <TABLE BORDER="0" WIDTH="100%"> <br/> <TR> <br/> <TD ALIGN="CENTER" VALIGN="TOP"><!-- content for top nav bar --></TD> <br/> </TR> <br/> </TABLE> <br/> <TABLE BORDER="0" ALIGN="LEFT"> <br/> <TR> <br/> <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for left nav bar --></TD> <br/> </TR> <br/> </TABLE> <br/> <TABLE BORDER="0"> <br/> <TR> <br/> <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for page body --></TD> <br/> </TR> <br/> </TABLE> </p><p> 2.也要记住关闭其他的标记 </p><p> 在上面的例子中,我们仅仅早一些关闭<TABLE>标记,就能让页面在浏览器显示的更快些。以此类推,还有一些类似的标记也有同样的特性。 </p><p> 比如产生列表框和组合框<OPTION>标记和产生列表项的<LI>标记。通常,ASP程序员存取数据库,并把数据送入通过<OPTION>建立的列表框或组合框中,这时候在代码中写上一个关闭<OPTION>标记,这样简单的改变也能使页面在浏览器中显示的更快。 </p><p> 不要使用这样的代码: </p><p> Do while not objRS.EOF <br/> strOptionList = strOptionList & "<OPTION VALUE=""" & objRS("ID") &_""">"& _objRS("
roductName") <br/> objRS.MoveNext <br/> Loop </p><p> Response.Write "<SELECT SIZE=""1"">" & strOptionList & "</SELECT>" </p><p> 要使用这样的代码: </p><p> Do while not objRS.EOF <br/> strOptionList = strOptionList & "<OPTION VALUE=""" & objRS("ID") & _ """>" & objRS("
roductName") & "</OPTION>" <br/> objRS.MoveNext <br/> Loop </p><p> Response.Write "<SELECT SIZE=""1"">" & strOptionList & "</SELECT>" </p><p> 不要使用这样的代码: </p><p> <UL> <br/> <LI>Apples <br/> <LI>Oranges <br/> <LI>Bananas <br/> </UL> </p><p> 使用这样的代码: </p><p> <UL> <br/> <LI>Apples</LI> <br/> <LI>Oranges</LI> <br/> <LI>Bananas</LI> <br/> </UL> </p><p> 现在看看,你的页面在浏览器中是不是显示的快了? </p><p> 请不要轻视这些改变对提高ASP程序性能的重要性。也许,在你能找到的“技巧与提示”一类的书或在线资料中,很少提到过通过优化HTML代码来使你的程序运行的更快。但是,在实际中应用这些技术,确实能使程序性能得到很大的提高。</p>
欢迎光临 信息系统项目管理师_2024年软考学习应考交流_信息系统项目管理师考试 (http://bbs.tuandui.org.cn/)
Powered by Discuz! X3.2