新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → ASP编程入门进阶(连载)[转帖] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 65777 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: ASP编程入门进阶(连载)[转帖] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客21
    发贴心情 

    (十九):ASP技巧累加(二)


    严格控制Session

    可以将不需要Session的内容(比如帮助画面,访问者区域,等等)移动到关闭Session的独立ASP应用程序中。在基础页面上,可以给ASP一个指示,让它不需要使用Session。将下面的代码直接加入到ASP页面的头部:

    <%@EnableSessionState=False%>


    在Web服务器上缓存经常使用的数据

    典型的情况是:ASP页面从后台存储中取回数据,然后以超文本标记语言(HTML)的形式形成结果。不管数据库的速度如何,从内存中取回数据要比从后台存储设备中快得多。从本地硬盘读取数据通常也非常快。所以,提高性能可以通过缓存服务器上的数据来实现,无论是将数据缓存在内存中,或者本地硬盘中。

    缓存是经典的“空间换时间”的折中方式。如果缓存得恰当,就可以看到显著的性能提升。为了让缓存有效,必须保证缓存数据是经常要重用的,而且也是计算起来繁琐的。装满陈旧数据的缓存是对内存的浪费。

    不经常改变的数据是缓存的较好对象,因为不需要随时考虑这些数据更新后的同步操作。组合框、参考表格、DHTML代码、扩展标记语言串、菜单以及站点配置变量(包括数据源名字,Internet协议地址IP以及Web路径)都是很好的缓存对象。注意:要缓存数据表达式而不是数据本身。如果一个ASP页面经常变化并且很费力去缓存(比如整个产品目录),就要考虑预产生HTML,而不是每次发生请求时再描述它。

    在Application或Session对象中缓存经常使用的数据

    ASP中的Application和Session对象是在内存中缓存数据的便利容器。你可以将数据赋值给Application和Session对象,这些数据在HTTP调用期间将一直保持在内存中。Session中的数据是为每一个用户服务的,Application中的数据是所有用户共享的。

    何时需要在Application和Session中装入数据?通常,当应用程序启动或者会话开始时,数据就被装入了。为了在这时装入数据,在Application OnStart()或者Session OnStart()中分别添加适当的代码。这些函数位于文件Global.asa中,如果原来不存在,就添加上。也可以在数据首次需要的时候调入,在ASP页面中添加代码,检查数据是否存在,如果没有发现,就调入它。这里有一个例子,它代表了被称为“lazy evalution”的经典性能处理技术:直到需要,再去计算。


    拷贝经常使用的数据到脚本变量中

    在ASP中存取COM对象时,应该拷贝经常使用的对象数据到脚本变量中,这样就减少了对COM对象的方法调用。这些调用要比存取脚本变量相对来说费时费力。当存取Collection和Dictionary对象时,使用这项技巧也减少了昂贵的查找操作。

    通常,如果要不止一次地存取对象数据,就应将数据放入脚本变量中,对象数据主要也就是Request变量(表单和查询字符串变量)。比如,站点要传递一个叫做UserID的查询字符串变量,假设它将在一个特殊页面被引用12次,那么不需要调用Request("UserID")12次,只要在ASP页面的头部分配给UserID一个变量,然后在页面中使用它,这样做就节省了11次COM方法的调用。

    在任何可能时使用Server.Transfer,而不要用Response.Redirect

    Response.Redirect告诉浏览器请求另一个不同的页面,这常常用于引导用户到登录页面或者出错处理页面。由于重定向强迫了一个新页面请求,结果是浏览器必须要与Web服务器循环2次,并且Web服务器必须处理一个额外的请求。Server.Transfer执行在同一服务器上的页面传输,这将避免额外的浏览器-Web服务器的数据循环,形成良好的系统性能,对于用户也有较好的响应时间。当然Server.Transfer只支持相对路径(即站内使用)。

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:42:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客22
    发贴心情 
    (二十):ADO组件之显示数据记录

    学习ASP的万里长征就快到终点了:等把ASP的ADO组件搞定。当然这也是最重要的一步,几乎前面所有的学习都是为了这个最终的目的。OK,下面就来详细系统地来一一掌握,步步为营,各个击破。

    一,拥有数据库

    可以这么说:静态页面和动态页面最大的区别就是采用了数据库。有关一个WEB程序采用数据库和不采用的优越性比较,就不去细细分析了,主要精力还是放在如何使用数据库,如何熟练运用数据库,如何更灵活地运用数据库等等……其中运用操作数据库主要是对数据库内容进行:显示、插入、修改、更新、查询和删除。

    这些方法当然也不是一口就能吃出来的,要慢慢感受咀嚼、理解消化。当然首先很重要的便是先拥有数据库了。否则,一切都是空谈,巧媳妇难以无米之炊嘛。

    一般而言,我们所说的数据库其实就是一个数据库文件,该文件是由一些数据库管理系统(DBMS)建立生成的。目前一般的DBMS也就是常用常听说的ACCESS,SQLSERVER,MYSQL,ORACLE。当然一般个人站点,小型企业采用ACCESS完全足够;稍微大些的就采用同样是Microsoft公司的SQL SERVER或者是MYSQL,值得注意的是MYSQL一般是和另外一种网络编程语言PHP完美结合的。当然更大型的就采用ORACLE了。呵呵,曾经在学习PB时还运用到SYBASE数据库,UNIX系统的Informix数据库……DBMS简直是多如牛毛-_-!

    话说过来,目前我们就直接使用ACCESS了:1,使用简单;2,入门掌握容易;3,实在没有比这个更适合初学的了。

    一切还得从实际操作开始。

    1,打开ACCESS数据库,选择新建数据库,将其命名为cnbruce.mdb,并保存到一专门文件夹database中

    [被屏蔽广告]

    2,在新建的数据库容器中双击“使用设计器创建表”,弹出的表1窗口中字段名称输入“cn_id”,数据类型选择“自动编号”,并选择上方工具栏中的钥匙按钮,将该字段设为主键。

    继续输入字段“cn_title”,数据类型选择“文本”;NEXT输入字段“cn_content”,数据类型选择“备注”;
    PS:备注和一般类型文本最大的区别就是备注允许插入的字段值相对要多些,这在插入一些较长文章的时候尤其重要。

    仍然输入字段“cn_author”,数据类型选择“文本”;并且切换到下面“常规”中的“允许空字符串”选择“是”。
    PS:这表面允许cn_author字段的值可以是空的,这在当提交表单,某些信息不填写但要正确插入数据库时,显得很重要。

    最后输入字段“cn_time”,数据类型选择“日期/时间”,继续切换到“常规”中的“默认值”输入“now()”函数

    末了,将“表1”另存为“cnarticle”

    [被屏蔽广告]

    3,双击打开cnartile表,填写第一行:“cn_title”输入“test”,“cn_content”输入“this is a test”,“cn_author”输入“cnbruce”,时间已经自动添加。完成!关闭表,关闭数据库。

    [被屏蔽广告]

    二,建立数据库连接

    OK,数据库已经建立完毕,并且已经填写了一行信息内容。那么现在需要的就是同过ASP将该行信息显示出来。

    要想显示,首先还是需要ASP与该数据库文件建立连接,具体怎么建立?往下看。

    1,conn.asp:主要起的是连接并打开某数据库文件的功能。该文件建议单独存在,并且位置是和存放数据库的文件夹database处与同一物理层次。


    <%
    db_path = "database/cnbruce.mdb"
    Set conn= Server.CreateObject("ADODB.Connection")
    connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path)
    conn.Open connstr
    %>


    db_path = "database/cnbruce.mdb",不用说,就是将数据库的相对路径赋到一个变量上,以方便下面继续调用。

    Set conn= Server.CreateObject("ADODB.Connection"),和其它建立组件一样,建立了一个ADO连接,并用一对象conn来接受。

    connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path),很显然就是连接字符串了,其包括打开数据库的驱动方法OLEDB,和打开和哪个数据库的连接(即数据库的路径)。

    需要再次提醒的是:无论是FSO对文件、文件夹的操作还是ADO对数据库的操作,对被操作文件的取得都是获得的绝对的物理地址,一般情况之下,采用Server.MapPath方法相对较好。

    conn.Open connstr最后对象conn通过连接字符串connstr打开了数据库的连接。

    三,显示数据库内容

    建立了数据库,建立了和数据库的连接,下面水到渠成地就是将数据库中的内容通过ASP显示出来。

    2,showit.asp


    <!--#include file="conn.asp" -->

    <%
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "Select * from cnarticle"
    rs.Open sql,conn,1,1
    %>

    <%
    if rs.EOF and rs.BOF then
    response.write ("暂时还没有文章")
    else
    Do Until rs.EOF
    response.write("文章标题是:"& rs("cn_title"))
    response.write("<br>文章作者是:"& rs("cn_author"))
    response.write("<br>文章加入时间是:"& rs("cn_time"))
    response.write("<br>文章内容是:"& rs("cn_content"))
    response.write("<hr>")
    rs.MoveNext
    Loop
    end if
    %>

    <%
    rs.close
    Set rs = Nothing
    conn.close
    set conn=Nothing
    %>


    简单调试本页,不出任何意外,相信一定能将数据库中的信息显示出来了。(PS:我的数据库中输写了两行)

    [被屏蔽广告]

    下面就来具体一个一个解释来理解没行的含义:
    1,<!--#include file="conn.asp" --> 没有任何争议,主要是调用conn.asp的所起的功效,这在解释conn.asp文件的时候已经明白。

    2,Set rs = Server.CreateObject ("ADODB.Recordset") ADO组件除了Connection连接以外,还有Recordset绑定记录集(相信用过DW做ASP的人现在开始有些重回故里的感觉了)当然 rs 可以形象地想象成数据库表中的某一行。

    3,sql = "Select * from cnarticle" 标准的SQL结构化查询语言。很简单:建立了数据库连接,也绑定了记录集,那具体需要哪些信息呢?也就是要筛选一些记录集合了,不过当前采用的是无任何条件,即可以提取所有。

    4,rs.Open sql,conn,1,1 真正地打开通向数据库中记录集的大门,具体有关后面的参数可以从如下网址中获得。

    5,if rs.EOF and rs.BOF then 该语句里面涉及到了rs.EOF 和 rs.BOF 以及两者的逻辑运算 and 。rs.EOF 表示到达数据库表中的最后一行,rs.BOF 表示到达数据库表中的第一行。整个语句可以理解为,如果当前数据库中的最后一行就是数据库表中第一行,那么可以肯定:当前数据库表中没有任何数据。

    6,
    Do Until rs.EOF
    ...
    rs.MoveNext
    Loop

    主要就是一个DO LOOP 循环语句了,其中循环的结束条件为:直到rs.EOF,即值得数据库表的最后一行。那么在这些条件满足的许可之内,就是来显示具体的信息了。

    每次循环只能显示数据库表中的一行,如果要继续读取下行,那么 rs.MoveNext 功能真是如此。

    7,rs("cn_title")等等 主要就是具体显示记录集中的哪个特定字段的信息值了。很是简单。

    8,最后不要忘了释放资源空间关闭记录集连接,关闭数据库连接。

    四,一些特殊条件

    1,有没有注意到,数据库表信息的显示一般是按照时间的先后排列的,也就经常提到的按时间的升序排列。需要注意:按时间升序,并不一定每个数据库表中都要有一个时间/日期类型的字段,只要存在一个自动编号的字段就可以了。因为该字段是永不重复,并且是依次增大的。因此,按时间升序其实就是按自动编号中号码数值的增加来进行排序的。

    当然,问题的关键来了,那就是要按照时间的降序排列,即始终从最新的内容开始显示。那具体需要哪些手术呢?
    很简单,将连接字符串稍做修改。

    由 sql = "Select * from cnarticle" 添加修改为
    sql = "Select * from cnarticle order by cn_id desc"
    其中 order by cn_id 即通过cn_id字段,desc 即降序了。

    2,有是时候,只需要提取最前或者最新的几条信息,那这个又具体如何操作呢?同样还是连接字符串的修改
    由 sql = "Select * from cnarticle order by cn_id desc" 添加修改为
    sql = "Select top 3 * from cnarticle order by cn_id desc"
    其中 top 3 就表示提取最新的三条信息内容了。

    That's All. 现在一个文章系统、新闻系统或者留言本显示部分的精华内容你已不费吹灰之力搞定。

    留下你的是:文章的格式可能显示不对劲,比如回车、空格都不显示了,那么你就还要学会处理接受的数据库表的值(在ASP的几个练习中提到的);文章不能老是打开数据库输入信息啊,那么你就要继续学会如何用ASP插入数据到库表;再有就是文章多了,一个页面看是不是很麻烦?那么你还要学会分页技术……

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:43:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客23
    发贴心情 
    (二十):ADO组件之插入数据记录


    简单的显示记录已经掌握,现在需要的就是通过ASP将信息内容插入到数据库中。

    一、拥有数据库cnbruce.mdb

    本数据库的作用就是用来被插入数据的,可以直接采用上节中已经建立的cnbruce.mdb文件,当然连接打开数据库的文件conn.asp也就顺利引用了。

    二、建立输入插入信息的页面平台addit.html

    本页的主要作用是:显示一些文本输入框以用来提供输入信息内容提交数据库。

    1,addit.html
    <form action="addit.asp" method="post">
    Title:<input type="text" name="title"><br>
    Author:<input type="text" name="author"><br>
    Content:<br>
    <textarea name="content" rows="8" cols="30"></textarea><br>
    <input type="submit" value="Add">
    <input type="reset" value="Reset">
    </form>
    [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

    本页其实很简单,就是通过submit按钮将表单的信息内容提交到addit.asp页面去处理。

    三、建立处理接受数据并插入数据库表的页面程序addit.asp

    2,addit.asp


    <!--#include file="conn.asp" -->

    <%
    whattitle=request.form("title")
    whoauthor=request.form("author")
    whatcontent=request.form("content")
    %>

    <%
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "Select * from cnarticle"
    rs.Open sql,conn,3,2
    %>

    <%
    rs.addnew
    rs("cn_title")=whattitle
    rs("cn_author")=whoauthor
    rs("cn_content")=whatcontent
    rs.update
    %>
    文章添加成功,<a href="showit.asp">浏览</a>
    <%
    rs.close
    Set rs = Nothing
    conn.close
    set conn=Nothing
    %>


    恩,接着就是来具体分析一下。

    1,<!--#include file="conn.asp" --> 不用说,凡是要和数据库有联系的都要运用到该连接文件。

    2,whattitle=request.form("title")之类 就是将上页表单中接受过来的值赋到一变量上,方便下面程序的调用。

    3,rs.Open sql,conn,3,2 注意参数和显示数据库时采用的参数的不同。

    4,rs.addnew 很简单也很显眼的一个声明:新建一个数据库记录集行。

    5,rs("cn_title")=whattitle之类 即将接受的表单值对应到相关字段中。

    6,rs.update 只是值和数据库字段的对应,完了后还要将对应的值上传提交到数据库表中去。

    7,插入后可以跳转到showit.asp查看 需要说明,以后的ASP例题可能都是建立在前几节内容的基础之上完成的。

    8,释放资源 是规矩,不要忘记。

    那么,现在。插入并显示数据库记录,对你来说完全是小菜一碟了。大体框架搭建完毕,下面就是具体的细化了。

    其中包括:客户端的表单检测,防止用户信息输入的遗漏;当然最好还是要加上服务器端的表单检测,由于客户端的某些原因(比如自行设计提交非检测的页面)基于安全考虑,一切还是依服务器端所接受信息为准。那下面就继续细化应用下了。

    1,客户端检测 其实就是通过简单的脚本检测,这在初学ASP提到脚本的时候说到,下面将再次重复。

    加强的addit.html
    <script laguage="javascript">
    <!--
    function form1_onsubmit()
    {
    if (document.form1.title.value=="")
    {
    alert("请输入文章标题")
    document.form1.title.focus()
    return false
    }
    else if(document.form1.content.value=="")
    {
    alert("请输入文章内容")
    document.form1.content.focus()
    return false
    }
    }
    -->
    </script>

    <form action="addit.asp" method="post" name="form1" onsubmit="return form1_onsubmit()">
    Title:<input type="text" name="title"><br>
    Author:<input type="text" name="author"><br>
    Content:<br>
    <textarea name="content" rows="8" cols="30"></textarea><br>
    <input type="submit" value="Add">
    <input type="reset" value="Reset">
    </form>
    [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

    2,服务器端检测 有人也许会问,既然有了客户端的检测,那还有多个服务器端的检测呢?原因很简单,比如仿照HTML表单提交页,自行设计一张去除了表单检测的页面。当点击提交,并且没有任何信息时,到达服务器端如没有任何防御则肯定会造成数据插入的失败。

    加强的addit.asp


    <!--#include file="conn.asp" -->

    <%
    whattitle=trim(request.form("title"))
    whoauthor=trim(request.form("author"))
    whatcontent=trim(request.form("content"))
    %>

    <%if whattitle="" then%>
    <script language=vbs>
    alert("请输入文章标题")
    history.go(-1)
    </script>
    <%end if%>
    <%if whatcontent="" then%>
    <script language=vbs>
    alert("请输入文章标题")
    history.go(-1)
    </script>
    <%end if%>

    <%
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "Select * from cnarticle"
    rs.Open sql,conn,3,2
    %>

    <%
    rs.addnew
    rs("cn_title")=whattitle
    rs("cn_author")=whoauthor
    rs("cn_content")=whatcontent
    rs.update
    %>
    文章添加成功,<a href="showit.asp">浏览</a>
    <%
    rs.close
    Set rs = Nothing
    conn.close
    set conn=Nothing
    %>


    可以看出,就是添加了如下类似的判断。


    <%if whattitle="" then%>
    <script language=vbs>
    alert("请输入文章标题")
    history.go(-1)
    </script>
    <%end if%>

    很简单,如果接受过来的信息为空,则弹出警告框,并且确认后返回到上页即addit.html了。当然cn_author没有设置检测,因为当初设计该字段的接受值是允许为空的。

    OK,总结一下,插入记录主要就是


    rs.addnew
    rs("cn_title")=whattitle
    ...
    rs.update


    很简单,先声明addnew,然后一一对应,再提交插入数据库。

    这是一种插入数据库的方法,下面就来接触了解一下另外一种。

    需要注意,结构化的查询语言也就是SQL语句能够完成一些比较苛刻的数据库操作。当然,对于诸如提取、插入信息之流就更不在话下了。所以下面采用的插入记录的方法就是直接采用SQL语法完成。

    修改了的addit.asp


    <!--#include file="conn.asp" -->

    <%
    whattitle=request.form("title")
    whoauthor=request.form("author")
    whatcontent=request.form("content")
    %>

    <%
    sql = "insert into cnarticle(cn_title,cn_author,cn_content) values(' "&whattitle&" ',' "&whoauthor&" ',' "&whatcontent&" ')"
    conn.Execute(sql)
    %>

    文章添加成功,<a href="showit.asp">浏览</a>

    <%
    conn.close
    set conn=Nothing
    %>


    本程序中,你会发现只要一行的SQL语句,不需要建立Rescord记录集行,不需要声明addnew,不要执行update。直接通过conn.Execute(sql)来完成。

    当然应用此种方法,若必填字段接受值为空时,同样能够插入记录。这和采用第一种会报


    Microsoft JET Database Engine 错误 '80040e21'

    字段 'xxx.xxx' 不能是零长度的字符串。

    具有很大的容错性。

    是程序的可读性还是方法的简便高效率就任君选择了。

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:45:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客24
    发贴心情 
    (二十):ADO组件之分页程序


    应该来说,学会了如何插入记录,如何显示记录,那么现在简单的完整的文章系统、新闻系统和留言系统不成问题。那接着下面的问题就是:随着信息内容的不段增加,单独通过一张页面显示所有信息是不行也是很不理性的。所以,解决的办法就是采用分页技术。

    1,rs.RecordCount
    很显然,RecordCount就是用来显示数据库表中一共多少条记录的,也可以形象地说表中一共有多少行。经常用在分页中就是一共有N篇文章等总计的信息显示。

    2,rs.PageSize
    rs.PageSize也就是一页的大小,也就表示一张ASP页可以显示记录的条数。值是自己定义的,比如经常看到的每页显示N篇文章之类的信息。

    3,rs.AbsolutePage 和 rs.pagecount
    说到分页,一定不能不提到 rs.AbsolutePage 。记录集的AbsolutePage属性最主要的作用就是决定着当前显示的是第几页。它的值是有依据的,指定了rs.PageSize,那么rs.pagecount的信息值就是rs.RecordCount和rs.PageSize整除结果。比如:总信息记录rs.RecordCount共20条,每页显示条数rs.PageSize设为5条,那么页数rs.pagecount数就是20/5=4页次,而rs.AbsolutePage则就只能是第1页,第2页……第4页。

    说到现在,弄个具体程序来调试一下。继续对showit.asp进行修改如下:


    <!--#include file="conn.asp" -->

    <%
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "Select * from cnarticle order by cn_id desc"
    rs.Open sql,conn,1,1
    %>

    <%
    page=request.querystring("page") 'page值为接受值
    rs.PageSize = 2 '每页显示记录数
    rs.AbsolutePage = Page '显示当前页等于接收的页数
    %>

    <%
    For i = 1 to rs.PageSize '利用for next 循环依次读出当前页的记录
    if rs.EOF then
    Exit For
    end if
    response.write("<br>文章内容是:"& rs("cn_content"))
    rs.MoveNext
    next%>

    <%
    rs.close
    Set rs = Nothing
    conn.close
    set conn=nothing
    %>


    HERE,你调试的前提就是数据库中的记录相对要大于4条,这样测试效果才明显;还有测试的方法就是在showit.asp后面添加?page=1或者?page=2等调试观察网页显示效果。

    其实,说到底,显示数据库内容就是


    <%
    For i = 1 to rs.PageSize
    if rs.EOF then
    Exit For
    end if
    response.write("<br>文章内容是:"& rs("cn_content"))
    rs.MoveNext
    next%>

    起的作用,但想象一下:该程序应该都只能显示出2条信息(一直不变的2条信息)。但为什么加上?page=1和?page=2会显示不同的结果呢?……那绝对就是rs.AbsolutePage的作用了。这个搞清楚,相信分页的整体架构就有点眉目了。

    <!--#include file="conn.asp" -->

    <%
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "Select * from cnarticle"
    rs.Open sql,conn,1,1
    %>

    <%filepath=request.servervariables("path_info")%>
    <%
    page=request.querystring("page") 'page值为接受值
    rs.PageSize = 2 '每页显示记录数
    if Not IsEmpty(page) then '如果page已经初始化...
    if Not IsNumeric(page) then '判断page值是否为数字
    page=1
    else
    Page = cint(page) '接收page并化为数字型赋给page变量
    end if
    if Page > rs.PageCount then '如果接收的页数大于总页数
    rs.AbsolutePage = rs.PageCount '设置当前显示页等于最后页
    elseif Page <= 0 then '如果page小于等于0
    rs.AbsolutePage = 1 '设置当前显示页等于第一页
    else
    rs.AbsolutePage = Page '如果大于零,显示当前页等于接收的页数
    end if
    else
    rs.AbsolutePage=1
    end if
    Page = rs.AbsolutePage%>

    <%
    For i = 1 to rs.PageSize '利用for next 循环依次读出当前页的记录
    if rs.EOF then
    Exit For
    end if
    response.write("文章标题是:"& rs("cn_title"))
    response.write("<br>文章作者是:"& rs("cn_author"))
    response.write("<br>文章加入时间是:"& rs("cn_time"))
    response.write("<br>文章内容是:"& rs("cn_content"))
    response.write("<hr>")
    rs.MoveNext
    Next
    %>

    <form action="<%=filepath%>" method="get">
    <!--首先保证总页数不为1、不为0-->
    <%if rs.pagecount<>1 and rs.pagecount<>0 then%>
    <!--如果当前页数大于1,无论何时都应显示首页和上一页的连接-->
    <%if page>1 then%>
    [<a Href="<%=filepath%>?Page=<% = 1%>">首页</a>]
    [<a Href="<%=filepath%>?Page=<% = page -1 %>">上一页</a>]
    <!--如果当前页数大于1并且小于总页面数时,显示出尾页和下一页的连接-->
    <%if page<rs.pagecount then %>
    [<a Href="<%=filepath%>?Page=<% = page + 1%>">下一页</a>]
    [<a Href="<%=filepath%>?Page=<% = rs.PageCount%>">尾页</a>]
    <!--如果当前页数大于1并且仍大于或等于总页面数时,不显示出尾页和下一页的连接-->
    <%else%>
    [下一页] [尾页]
    <%end if%>
    <!--否则,当前页数不大于1,则只显示尾页和下一页的连接-->
    <%else%>
    [首页] [上一页]
    [<a Href="<%=filepath%>?Page=<% = page + 1%>">下一页</a>]
    [<a Href="<%=filepath%>?Page=<% = rs.PageCount%>">尾页</a>]
    <%end if %>
    <!--最终,总页数若为1、为0则没有任何连接-->
    <%else%>
    [首页] [上一页] [下一页] [尾页]
    <%end if%>

    [页次:<font color=red><b><%=page%></b></font>/<%=rs.PageCount%>]
    [共<%=rs.RecordCount%>篇 <font color=red><b><%=rs.PageSize%></b></font>篇/页]
    转到<input name="page" size=5 value="<%=page%>">页
    <input type="submit" value="Enter">
    </form>

    <%
    rs.close
    Set rs = Nothing
    conn.close
    set conn=Nothing
    %>


    效果页面参看:
    http://www.cnbruce.com/database/

    长长的分页代码,搞懂是真不容易,平台引用起来还需要修改也是比较麻烦。最后能做成一个函数,下次调用起来就很方便了。


    <%
    function pagination(pagecount,pagesize,page,resultcount)
    Dim query, a, x, temp
    action = "http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("SCRIPT_NAME")
    query = Split(Request.ServerVariables("QUERY_STRING"), "&")
    For Each x In query
    a = Split(x, "=")
    If StrComp(a(0), "page", vbTextCompare) <> 0 Then
    temp = temp & a(0) & "=" & a(1) & "&"
    End If
    Next
    Response.Write("<form method=get onsubmit=""document.location = '" & action & "?" & temp & "Page='+this.page.value;return false;"">")
    if page<=1 then
    Response.Write ("[首页] [上一页] ")
    else
    Response.Write("[<a href=" & action & "?" & temp & "Page=1>首页</a>] ")
    Response.Write("[<a href=" & action & "?" & temp & "Page=" & (Page-1) & ">上一页</a>] ")
    end if

    if page>=pagecount then
    Response.Write ("[下一页] [尾页]")
    else
    Response.Write("[<a href=" & action & "?" & temp & "Page=" & (Page+1) & ">下一页</a>] ")
    Response.Write("[<a href=" & action & "?" & temp & "Page=" & pagecount & ">尾页</a>]")
    end if
    Response.Write("[页次:<font color=red>" & page & "</font>/" & pageCount)
    Response.Write("] [共" & resultcount & "条 <font color=red>"& pagesize & "</font>条/页]")
    Response.Write(" 转到" & "<input name=page size=4 value=" & page & ">" & "页<input type=submit value=go>")
    End function
    %>


    如要引用,则可以:
    <%call pagination(rs.PageCount,rs.pagesize,page,rs.RecordCount) %>

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:45:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客25
    发贴心情 
    (二十):ADO组件之修改数据记录


    再来小总结一下:对数据库的操作无非就是显示记录,插入记录,修改记录,删除记录,查询记录。

    并且在有关显示记录的时候还涉及到显示的输出格式、分页程序,那么再结合插入记录,一个简单的新闻系统,文章系统,留言系统,注册登陆系统不成任何问题。

    下面就涉及到管理这块,需要对数据库记录进行修改。

    首先,要修改哪条

    修改,不是笼而统之的,而是要针对某条具体对相应修改。可以形象地说,就是对数据库表中的具体哪一行进行具体的修改。
    所以,这时候的记录集就有它特定的某个,当然这个主要还是由SQL语句来决定的。

    比如 sql="select * from table where id=1" 就表示提取的id编号是1的那行的所有记录,然后只要将该行中需要修改的字段赋以新值然后上传数据库就OK了。

    同样的语句 sql="select * from table where id=2" 相信你也能明白。

    但作为我们在页面中,可不是就这样固定的,有可是选择某连接,或者输入某表单值……跳转到专门的修改页,这样所有的任务全在修改页上了,它所具备的SQL语句应该是适应性强的

    比如 sql="select * from table where id="&request.queyrstring("id")

    其次,将要修改的对应赋值

    很简单,正如插入记录一样,将字段和值对应起来。

    rs("cn_name")="cnbruce"
    rs("cn_sex")="male"

    对应的值当然也可以是某个变量或函数

    最后,上传更新数据库

    和插入一样进行rs.updata ,其实观察下来,插入新记录和更新记录只是多了rs.addnew这行的声明。

    1,showit.asp
    该文件是前面例中所建立引用的。其主要是显示的作用,那么现在,针对具体的某条记录增加跳转到修改页的超级链接。


    <%
    For i = 1 to rs.PageSize '利用for next 循环依次读出当前页的记录
    if rs.EOF then
    Exit For
    end if
    response.write("<a href=change.asp?id="& rs("cn_id") &">修改</a>")
    response.write("文章标题是:"& rs("cn_title"))
    response.write("<br>文章作者是:"& rs("cn_author"))
    response.write("<br>文章加入时间是:"& rs("cn_time"))
    response.write("<br>文章内容是:"& rs("cn_content"))
    response.write("<hr>")
    rs.MoveNext
    Next
    %>

    注意response.write("<a href=change.asp?id="& rs("cn_id") &">修改</a>")

    后面的参数id的值则是动态的,那接着就看chang.asp的能耐了。

    2,change.asp

    <!--#include file="conn.asp" -->
    <%
    id=request.querystring("id")
    %>

    <%if request.form("submit")="change" then
    whattitle=request.form("title")
    whoauthor=request.form("author")
    whatcontent=request.form("content")
    id=request.form("id")
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "Select * from cnarticle where cn_id="&id
    rs.Open sql,conn,3,2
    rs("cn_title")=whattitle
    rs("cn_author")=whoauthor
    rs("cn_content")=whatcontent
    rs.update
    rs.close
    Set rs = Nothing
    conn.close
    set conn=Nothing
    response.redirect("showit.asp")
    response.end
    %>
    <%end if%>

    <%
    if id<>"" then
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql="select * from cnarticle where cn_id="&id
    rs.Open sql,conn,1,1
    whattitle=rs("cn_title")
    whoauthor=rs("cn_author")
    whatcontent=rs("cn_content")
    end if
    %>
    <form action="change.asp" method="post">
    Title:<input type="text" name="title" value=<%=whattitle%>><br>
    Author:<input type="text" name="author" value=<%=whoauthor%>><br>
    Content:<br>
    <textarea name="content" rows="8" cols="30"><%=whatcontent%></textarea><br>
    <input type="submit" value="change" name="submit">
    <input type="reset" value="Reset">
    <input name="id" type="hidden" value="<%=id%>">
    </form>


    当然所有的检察,安全防护都还没做,BUG多多,自己也来慢慢解决。

    另外一类的修改更新


    <%if request.form("submit")="change" then
    whattitle=request.form("title")
    whoauthor=request.form("author")
    whatcontent=request.form("content")
    id=request.form("id")

    sql = "update cnarticle set cn_title='"&whattitle&"',cn_author='"&whoauthor&"',cn_content='"&whatcontent&"' where cn_id="&id
    conn.Execute(sql)
    conn.close
    set conn=Nothing
    response.redirect("showit.asp")
    response.end
    %>

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:46:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客26
    发贴心情 
    (二十):ADO组件之删除数据记录


    1,首先要明确删除哪条记录

    无非还就是SQL语句了,比如对应到特定的某ID上。

    id = request.form("id")
    sql = "Select * from cnarticle where cn_id="&id
    Set rs = Server.CreateObject ("ADODB.Recordset")
    rs.Open sql,conn,2,3

    2,很简单的一条语句:删除

    rs.delete

    3,最好能在修改之前征求确认删除

    <script language="JavaScript">
    <!--
    function suredo(src,q)
    {
    var ret;
    ret = confirm(q);
    if(ret!=false)window.location=src;
    }
    //-->
    </script>

    <a href='javascript:suredo("del.asp?id=<%=id%>","确定删除?")'>Delete</a>

    最直接的一条语句


    sql = "delete * from cnarticle where cn_id="&id
    conn.Execute(sql)

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:47:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客27
    发贴心情 
    (二十):ADO组件之查询数据记录


    首先,了解下原理。
    1,提供文本框进行查询内容的输入
    2,将查询信息提交页面程序处理
    3,程序页主要作用:接受查询信息,根据此信息调用特定的SQL查询语句,得出查询结果并能显示。

    其实,主要精髓就是SQL语句的写法上。
    之前的提取为 "select * form whattable where id="&id
    插入为 "insert into whattable(xx_rs) values(' "&content&" ')"
    删除为 "delete from whattable where id="&id
    修改为 "update whattable set xx_rs=' "&log_content&" ' where id="&id
    则查询为 "select * form whattable where xx_rs like '%"&wahtkey&"%' "

    下面通过一个例题来研究下
    1,建立数据库zipcode.mdb中的zip表
    字段id,类型自动编号(关键字)
    字段placename,类型文本
    字段province,类型文本
    字段zipcode,类型文本
    字段borough,类型文本

    2,加入数据库信息内容
    id 自动编号,无需加入
    placename 对应县市
    province 对应省份
    zipcode 对应邮政编码
    borough 对应区号

    3,连接文件conn.asp


    <%
    db_path = "zipcode.mdb"
    Set conn= Server.CreateObject("ADODB.Connection")
    connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path)
    conn.Open connstr
    %>


    4,查询输入页search.asp
    <form action="search.asp" method="post">
    <input type="text" name="zipcode">
    <input type="submit" name="submit" value="search">
    </form>
    [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

    5,信息查询页,同样是search.asp


    <!--#include file="conn.asp" -->
    <%
    if request.form("submit")="search" then
    whatzip=request.form("zipcode")
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "Select * from zip where zipcode like '%"&whatzip&"%' "
    rs.Open sql,conn,1,1
    %>
    <%
    if rs.EOF and rs.BOF then
    response.write ("未能查到")
    else
    Do Until rs.EOF
    response.write("<hr>该地址是:"& rs("placename")&rs("zipcode"))
    response.write("<br>所在省份是:"& rs("province"))
    rs.MoveNext
    Loop
    end if
    %>
    <br><a href="search.asp">again</a>
    <%
    rs.close
    Set rs = Nothing
    conn.close
    set conn=Nothing
    else
    %>
    <form action="search.asp" method="post">
    <input type="text" name="zipcode">
    <input type="submit" name="submit" value="search">
    </form>
    <%end if%>


    以上采用like意思表示进行模糊查询,要精确查询则直接使用
    sql = "Select * from zip where zipcode = '%"&whatzip&"%' "

    当然通过区号的查询还没添加,你可以自己试着完善,或者来个混合查询、单独查询、模糊查询以及精确查询的大综合了。
    调试页面参看。

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:48:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客28
    发贴心情 
    (廿一):DAO SQL之建立数据库表


    你是否为自己设计的数据库感到满足了呢?你确信就不要对其再处理?比如新建立数据库表,比如建立或者修改某个字段……当然这些都属于设计数据库之列。

    那么,你正常的操作又是不是下载数据库到本机,然后打开之进行修改,接着再上传上去?十有八九都是如此-_-!

    现在,你可以接触下有关于此的信息了,毕竟代码的功能是为手动的操作省了不少时间。不过代码的生成也还不是手工?呵呵:)

    1,建立数据库文件cnbruce.mdb(不设计任何表)

    建立数据库的代码:


    <%
    Option Explicit
    dim databasename '定义数据库名称
    databasename="cnbruce.mdb" '数据库名称
    dim databasepath '定义数据库存放路径
    databasepath="e:\cnbruce\database\" '数据库绝对路径
    dim databasever '定义数据库版本 2000 或者 97
    databasever = "2000"

    Function Createdfile(FilePath,FileName,Ver)

    Dim cnbruce,dbver
    select case ver
    case "97"
    dbver = "3.51"
    case "2000"
    dbver = "4.0"
    end select

    if dbver <> "" then
    Set cnbruce = Server.CreateObject("ADOX.Catalog")
    call cnbruce.Create("Provider=Microsoft.Jet.OLEDB." & dbver & ";Data Source=" & filepath & filename)
    end if

    End Function

    Call Createdfile(databasepath,databasename,databasever) '创建数据库
    %>


    那么,再看如何设计建立一个新的数据库表吧

    2,建立数据库的连接文件conn.asp

    <%
    db_path = "cnbruce.mdb"
    Set conn= Server.CreateObject("ADODB.Connection")
    connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path)
    conn.Open connstr
    %>


    3,建立新数据库表的程序页面addtable.asp

    <!--#include file="conn.asp" -->

    <%
    Set rs = Server.CreateObject ("ADODB.Recordset")
    sql = "create table aboutme (id integer primary key,name text,Birthday datetime)"
    rs.Open sql,conn,2,3
    %>
    数据库表文件建立完毕。


    create table aboutme (id integer primary key,name text,Birthday datetime)
    建立新的表aboutme,设计其字段有id(主关键字)、name(备注)、Birthday(时间日期)

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 13:49:00
     
     串烧 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:56
      门派:XML.ORG.CN
      注册:2006/2/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给串烧发送一个短消息 把串烧加入好友 查看串烧的个人资料 搜索串烧在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看串烧的博客29
    发贴心情 
    需要将windows xp professional service pack  2   CD  上的一些文件

    将windows xp professional service pack  2   CD 插入下面选定的驱动器中  然后单击确定

    这是我在安装IIs时遇到的问题  我不知道该怎么解决  而且我也没有这个CD 我该怎么办?  请前辈指点  谢谢

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/21 18:01:00
     
     galen 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:81
      门派:XML.ORG.CN
      注册:2004/11/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给galen发送一个短消息 把galen加入好友 查看galen的个人资料 搜索galen在『 Dot NET,C#,ASP,VB 』的所有贴子 引用回复这个贴子 回复这个贴子 查看galen的博客30
    发贴心情 
    需要操作系统的安装盘的
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/24 15:50:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/1 10:14:02

    本主题贴数30,分页: [1] [2] [3]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    187.500ms