第 9章 数据库查询的技巧
ASP动态网页设计教程
2
第 9章 数据库查询的技巧本章将以 SQL Server 2000 内置的,北风
(Northwind)数据库”为基础,为读者介绍如何开发数据库查询程序、数据分页的技巧、动态数据库查询、数据库查找对比的技巧等主题,让您真正了解 SQL Server 2000在企业网站方面的运用。
3
第 9章 数据库查询的技巧
9.1 北风数据库简介
9.2 数据库查询范例
9.3 分页的技巧 (一 )
9.4 分页的技巧 (二 )
9.5 分页的技巧 (三 )
9.6 最新信息管理实际范例
4
9.1 北风数据库简介北风数据库为一内容相当完整的小型数据库范例,
内置有 33个数据表 (Table),其中有 13个类型为用户 (User)
的表。完整的北风数据库,其所有的表如下图所示。
5
9.1 北风数据库简介接下来我们将以北风数据库中的顾客表 (Customers)
为例,如下图所示,为您介绍数据库查询的各种技巧。
6
9.2 数据库查询范例
Customers数据表共有 11个字段,假设我们要查询的数据共有 5
个字段,它们分别是 CustomerID,CompanyName,ContactName、
ContactTitle及 City。通常在第一次编写的 ASP程序代码中,有关数据库的 SQL查询语言会这样写:
SELECT * FROM Customers
得到的查询结果是将上述的 5个字段数据全部显示在网页上,
如下图所示。
整个的查询结果在浏览器中需要显示好几页,用户必须利用滚动条 (Scroll Bar)
上下移动,才能看完所有的信息。这种程序的写法最为简单,但是会消耗太多的系统资源,使得系统执行的效率降低。
7
9.2 数据库查询范例为了改善上述的缺点,我们将 ASP程序代码 (ch9-1.asp)列出来,
以供读者参考:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local); uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "Select * from Customers order by CustomerID"
rs.open sql,conn,3,2
%>
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database Listing Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=100%>
<tr bgcolor=#ccccd7>
8
9.2 数据库查询范例
ch9-1.asp (续 ),
<td>CustomerID</td>
<td>CompanyName</td>
<td>ContactName</td>
<td>ContactTitle</td>
<td>City</td>
</tr>
<%
i = 0
do while not rs.eof
i = i + 1
If i mod 2=0 Then '设置奇数行与偶数行的颜色
Color = "#ddddd7" '偶数行颜色为 ddddd7
Else
Color = "#eeeeef" '奇数行颜色为 eeeeef
End If
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<td>"+rs("CustomerID")+"</td>")
Response.Write("<td>"+rs("CompanyName")+"</td>")
Response.Write("<td>"+rs("ContactName")+ "</td>")
9
9.2 数据库查询范例
ch9-1.asp (续 ),
Response.Write("<td>"+rs("ContactTitle")+ "</td>")
Response.Write("<td>"+rs("City")+"</td>")
Response.Write("</tr>")
rs.MoveNext
Loop
%>
</table>
</center>
</body>
</html>
上面的程序代码虽然可以正确无误的执行,但是还有许多可改善之处。这些部分经我们整理之后,有两大重点,分别为 SQL最优化与数据分页处理。我们将分别说明如下,
10
9.2 数据库查询范例
9.2.1 SQL最优化
9.2.2 数据分页的处理
11
9.2 数据库查询范例
9.2.1 SQL最优化虽然 SQL Server会针对用户的 SQL Command进行最优化,然而并不见得都是最优化。有时最优化还是须以人工的方式来处理,例如 Customers数据表共有 11
个字段,但是我们只用到其中的 5个字段,于是偷懒的程序设计员们会使用下面的 SQL Command写法:
SELECT * FROM Customers
或许,这个程序设计员还会向别人炫耀它的 SQL
Command 最为简洁,其实殊不知他已经犯了大忌,因为 SQL Server会将 Customers所有字段 (11个 )的数据,送往 IIS上的 ASP数据库对象,使得网络传输的数据量大增,并大幅降低 IIS和 SQL Server的处理速度。
12
9.2 数据库查询范例
9.2.1 SQL最优化为解决上述的问题,我们提出的 SQL Command
如下:
SELECT CustomerID,CompanyName,ContactName,
ContactTitle,City FROM Customers
在本范例中的 Customers数据表共有 91条记录数据。第一个写法需要传输 91× 11个字段,而第二种写法则只需要 91× 5个字段。若不计算字段的长度,第二种写法约可节省 6/11的数据量。因此可大幅减少网络的数据传输量,提高网络主机及数据库主机的执行性能。
13
9.2 数据库查询范例
9.2.2 数据分页的处理对于数据量较小的 Table而言,一次显示所有的数据是没有问题的,但是当数据量相当庞大的时候,要将所有的数据一股脑儿显示在网页上,那可就万万不行,因为当 ASP在编辑 HTML的同时,系统就可能因为数据量太大而发生 Timeout(超时 )的问题。要解决这一问题,我们可以将数据分割成数页,每页显示若干记录数据 (例如每页只显示 20条记录数据 ),并提供上、下页或指定页数之查询方式 (例如国内的新浪、搜狐等网站搜索引擎的做法 ),以避免用户久候网页或发生
Timeout的情形,并可大幅减少系统的负荷。
14
9.2 数据库查询范例
9.2.2 数据分页的处理数据分页的技巧是通过指定 RecordSet对象的 PageSize
属性来完成。当我们设置 PageSize的值之后,数据库对象会自动将 RecordSet 的大小分为若干个 Page。例如每页要显示 20条记录数据,则 ASP的写法如下:
Set rs = Server.CreateObject("ADODB.Recordset ")
sql = "Select * from Customers order by CustomerID"
rs.open sql,conn,3,2
rs.PageSize = 20? 设置每页显示记录数在设置页面的大小以后,另外必须设置 AbsolutePage
的值,让数据库的指针自动移至对应的记录。
AbsolutePage的写法如下:
rs.AbsolutePage = 2 ' 设置目前处理范围 (页数 )
15
9.2 数据库查询范例
9.2.2 数据分页的处理
RecordSet在设置 AbsolutePage属性的值以后,数据库第一条记录数据的地址将自动被改变,它的计算公式如下:
第一条记录数据地址 = (AbsolutePage – 1) × PageSize + 1
例如 AbsolutePage = 2,PageSize = 20,则第一条记录等于 RecordSet中的第 21条记录。它的计算公式如下:
第一条记录 = (2 – 1) × 20 + 1 = 21
16
9.2 数据库查询范例
9.2.2 数据分页的处理当所有的准备操作都备好之后,接下来就可以处理指定页面的数据了,它与第 8章的数据库处理方法不同。请参考如下说明:
For i = 1 to rs.PageSize '每次处理 PageSize记录数据
If rs.EOF Then Exit For '若已处理完毕则离开 For循环
If i mod 2=0 Then
Color = "#ddddd7" '偶数行显示的颜色
Else
Color = "#eeeeef" '奇数行显示的颜色
End If
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+"</TD>")
Response.Write("<TD>"+rs("CompanyName")+ "</TD>")
Response.Write("<TD>"+rs("ContactName")+ "</TD>")
Response.Write("<TD>"+rs("ContactTitle")+ "</TD>")
Response.Write("<TD>"+rs("City")+ "</TD>")
Response.Write("</TR>")
rs.MoveNext '下一条记录
Next
17
9.3 分页的技巧(一)
根据数据显示,北风数据库 Customers 数据表共有
91条记录数据。为了方便在线浏览的用户查阅,我们将系统设计为每页显示 10条记录数据,并在每页的下方提供目前页数 (数字不带下划线 )、上一页 (左箭头图标表示 )
及下一页 (右箭头图标表示 )的功能,如下图所示。
18
9.3 分页的技巧(一)
9.3.1 页数控制
9.3.2 递归调用
9.3.3 上、下页及指定页数的控制
19
9.3 分页的技巧(一)
9.3.1 页数控制为了完成上述的功能,我们在 ASP中以 Page变量记录目前的页数。 Page变量的处理规则如下:
● 页数为 0的处理:当 Page < 1时,设置 Page = 1
● 页数大于实际页数,Page > PageCount时,将 Page设为 PageCount
上面的处理原则对于上、下页浏览时特别有用,并可避免程序发生不可预期的状况 (Exception),导致错误的情形发生。
20
9.3 分页的技巧(一)
9.3.2 递归调用递归 (Recursive)调用是一种由程序本身调用自己的处理方式,它可以简化程序的复杂度,如下图所示。
在 HTML 的语法中,我们可以让网页自己调用自己。但是使用上并不是那么方便,因为它缺乏重复使用的能力,因为它缺乏重复使用的能力,例如 index.asp
21
9.3 分页的技巧(一)
9.3.2 递归调用的网页中,递归程序写法如下:
<a href="index.asp">自己调用自己 </a>
但是这样的写法到了 index2.asp时,程序必须配合修改如下:
<a href="index2.asp">自己调用自己 </a>
不同的网页在处理递归时都会有这一问题。但是通过 ASP这个问题是可以解决的,解决方式是通过
Request.ServerVariables("PATH_INFO")取得网页的路径。它的用法如下:
<a href="<%= Request.ServerVariables("PATH_INFO")%>?Page=
<% =(Page - 1) %>">
例如现行的网页为 /forum/index.asp,则
Request.ServerVariables("PATH_INFO")的值为 /forum/index.asp,也就是本网页的路径。
22
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制至于上、下页及指定页数的控制,我们可使用 Page变量为参数,
利用 HTML参数传递方式,并以递归调用方式 (自己调用自己 )来简化程序的复杂度。页数控制的规则如下:
1,上一页将 Page页数减 1,利用 MySelf变量 (记录本网页的路径 )达到调用自己的目的。
<%
取得网页的路径
MySelf = Request.ServerVariables("PATH_INFO")
:
%>
:
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>">
23
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
2,下一页将 Page页数加 1,然后调用自己来处理。
<%
取得网页的路径
MySelf = Request.ServerVariables("PATH_INFO")
:
%>
:
<a href="<%=MySelf%>?Page=<%=(Page + 1)%> ">
3,指定页数将 Page变量化为 URL的参数,调用自己来处理。
<a href=" + MySelf + "?Page=" & Page & ">
24
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制根据上面的控制原则,我们完成第一版的多页查询程序。 ASP
程序代码 (ch9-2.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Page = CLng(Request("Page"))
sql = "Select * from Customers order by CustomerID"
rs.open sql,conn,3,2
rs.PageSize = 10 '每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount '指定页数 > 实际页数的处理
If rs.PageCount > 0 then rs.AbsolutePage = Page '页数 > 0 的处理
MySelf = Request.ServerVariables("PATH_INFO")
利用 PATH_INFO取得目前网页的路径
%>
<html>
<body>
<center>
25
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database MultiPage Control Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=96%>
<%
Response.Write("<TR BGCOLOR=#ccccd7>")
Response.Write("<TD>CustomerID</TD>")
Response.Write("<TD>CompanyName</TD>")
Response.Write("<TD>ContactName</TD>")
Response.Write("<TD>ContactTitle</TD>")
Response.Write("<TD>City</TD>")
Response.Write("</TR>")
For i = 1 to rs.PageSize
If rs.EOF Then Exit For
If i mod 2=0 Then
Color = "#ddddd7"
Else
Color = "#eeeeef"
End If
26
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+ "</TD>")
Response.Write("<TD>"+rs("CompanyName")+ "</TD>")
Response.Write("<TD>"+rs("ContactName")+ "</TD>")
Response.Write("<TD>"+rs("ContactTitle")+ "</TD>")
Response.Write("<TD>"+rs("City")+"</TD>")
Response.Write("</TR>")
rs.MoveNext
Next
%>
</table>
</center>
<%
If rs.PageCount > 1 then
%>
<br>
<div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>">
<img name=" prev" border="0" src="prev.gif" width="9"
height="13"></a>
27
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i) + "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i))
+ "><Font color="+ color + ">" + Cstr(i)
+ "</Font></a> "
End If
Next
%>
<a href="<%=MySelf%>?Page=<%=(Page + 1)%> ">
<img name="next" border="0" src="next.gif" width="9" height="13"></a>
</div>
28
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
<%
ElseIf rs.PageCount < 1 then
response.Write "<div align=?center‘><font color=red>
无相关数据 !!...</font></div>"
End If
%>
</body>
</html>
说明:由于 Browser会忽略 HTML中的空格符,因此要在网页中显示空格符,必须将编码后的空格符,设置其值为  。
29
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制执行结果如下图所示 。
30
9.4 分页的技巧(二)
虽然第一版的多页查询程序已经可以满足我们的需求,但是这样的范例并不能满足用户少量、多样的需求,例如可以设置查询的条件,或数据输出的顺序等。像前述这样的需求在运用 ASP以后,如雨后春笋般的出现,并且已变成网站最基本的要求。
为了满足用户对信息的渴望,我们以第一版的
ASP程序代码为基础,开发了第二版的查询程序。第二版的查询程序将网页分成两部分,第一部分即为查询条件的设置,它可以指定字段输出的顺序,如下页图所示;第二部分为查询程序,已于上节说明。
31
9.4 分页的技巧(二)
设置查询条件的 HTML源代码 (select.htm)如下:
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>Northwind Database
MultiPage Control Demo</font>
</p>
32
9.4 分页的技巧(二)
select.htm (续 ),
<form action="ch9-3.asp" method="post">
排序字段,
<select name="Key">
<option value="CustomerID">CustomerID</option>
<option value="CompanyName">CompanyName</option>
</select>
输出顺序,
<select name="Sort">
<option value="ASC">递增 </option>
<option value="DESC">递减 </option>
</select>
<input type="submit" name="ok" value="确认 ">
</form>
</center>
</body>
</html>
33
9.4 分页的技巧(二)
当用户按下,确认,键后,网页根据 HTML中 <form>标记内的 Action设置,调用 ch9-3.asp(Action=―ch9-3.asp‖),执行多页查询的功能 。 查询后的结果如下图所示 。
34
9.4 分页的技巧(二)
在第二版的查询程序中,源代码 (ch9-3.asp)几乎与第一版的程序一致,其中最大的差异在于参数的传递与处理,当参数由
select.htm中传递过来时,我们将参数与 SQL Command结合,变成动态的 SQL Command。程序代码如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key") '排序的字段
Sort = Request("Sort") '数据排列顺序 (递增或递减 )
Page = Clng(Request("Page"))
'组成 SQL Command
sql = "SELECT * FROM Customers ORDER BY " & Key & " " & Sort
rs.open sql,conn,3,2
35
9.4 分页的技巧(二)
至于上、下页及指定页数的数据查询,也须配合数据输出顺序而做调整,其调整方式主要是针对 HyperLink而来,只要在 Hyperlink
处加入参数 Key及 Sort两个变量即可。例如:
● 上一页
<a href=―<%=MySelf%>?Page=<% =(Page - 1)
%>&Sort=<%=Sort%>&Key=<%=Key%>―>
● 下一页
<a href=―<%=MySelf%>?Page=<%=(Page + 1)%>
&Sort=<%=Sort%>&Key=<%=Key%>―>
● 指定页数
<a href="+ MySelf +"?Page="+ Cstr((i)) + "&Sort=" + Sort
+"&Key="+Key+">
36
9.4 分页的技巧(二)
经过修正后,第二版完整的 ASP动态查询程序 (ch9-3.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from Customers order by ' & Key & ' " & Sort
rs.open sql,conn,3,2
rs.PageSize = 10 '每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")
%>
37
9.4 分页的技巧(二)
ch9-3.asp (续 ),
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database MultiPage Control Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=96%>
<%
Response.Write("<TR BGCOLOR=#ccccd7>")
Response.Write("<TD>CustomerID</TD>")
Response.Write("<TD>CompanyName</TD>")
Response.Write("<TD>ContactName</TD>")
Response.Write("<TD>ContactTitle</TD>")
Response.Write("<TD>City</TD>")
Response.Write("</TR>")
For i = 1 to rs.PageSize
If rs.EOF Then Exit For
If i mod 2=0 Then
Color = "#ddddd7"
38
9.4 分页的技巧(二)
ch9-3.asp (续 ),
Else
Color = "#eeeeef"
End If
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+"</TD>")
Response.Write("<TD>"+rs("CompanyName")+ "</TD>")
Response.Write("<TD>"+rs("ContactName")+ "</TD>")
Response.Write("<TD>"+rs("ContactTitle")+ "</TD>")
Response.Write("<TD>"+rs("City")+"</TD>")
Response.Write("</TR>")
rs.MoveNext
Next
%>
</table>
</center>
<%
If rs.PageCount > 1 then
%>
39
9.4 分页的技巧(二)
ch9-3.asp (续 ),
<br>
<div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>
&Sort=<%=Sort%>&Key=<%=Key%>">
<img name="prev" border="0" src="prev.gif" width="9"
height="13"></a>
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i)
+ "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i))
+ "&Sort=" + Sort +"&Key="+Key+"><Font color="
+ color + ">" + Cstr(i) +"</Font></a> "
40
9.4 分页的技巧(二)
ch9-3.asp (续 ),
End If
Next
%>
<a href="<%=MySelf%>?Page=<%=(Page + 1)%>
&Sort=<%=Sort%>&Key=<%=Key%>">
<img name="next" border="0" src="next.gif" width="9"
height="13"></a>
</div>
<%
ElseIf rs.PageCount < 1 then
response.Write "<div align='center'><font color=red>
无相关数据 !!...</font></div>"
End If
%>
</body>
</html>
41
9.5 分页的技巧(三)
话说“天下分久必合、合久必分”,制作网页程序也不例外。从第一版的简易查询程序演进至第二版,我们将网页拆开成条件设置及查询程序两部分。但是第三个范例,如下图所示,我们却把第二个范例,由两个网页整合成单一网页,当然整个设计的技巧又难了许多。
42
9.5 分页的技巧(三)
要这样设计的原因,主要是可以简化 ASP程序的数目,并降低程序连接及维护上的困难。所有我们将两个网页整合在一起,有些问题是我们要特别注意的,例如:
网页查询时的初始值如何决定、动态 SQL Command如何决定、查询的网页要安插在何处较为恰当及如何保存用户的查询条件等。
9.5.1 网页查询时的初始值如何决定
9.5.2 动态 SQL Command如何决定
9.5.3 查询的网页要安插在何处较为恰当
9.5.4 如何保存用户的查询条件
43
9.5 分页的技巧(三)
9.5.1 网页查询时的初始值如何决定由于少了设置条件的网页,因此第一次执行本程序时,字段 Key及 Sort的值均不存在,因此它的值等于空白或 Null。
44
9.5 分页的技巧(三)
9.5.2 动态 SQL Command如何决定为了避免 SQL语法错误,我们将 Key及 Sort字段分开判断,当有值的时候才与 sql 变量结合为新的 sql 字符串。
<%
:
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from Customers"
If Key > "" Then sql = sql + " order by " & Key
If Sort >"" Then sql = sql & " " & Sort
rs.open sql,conn,3,2
:
%>
45
9.5 分页的技巧(三)
9.5.3 查询的网页要安插在何处较为恰当由于 ASP程序代码必须先执行,因此建议将用户接口的部分,置于 ASP 程序代码的后面,提高 HTML
的可读性,将来的维护也较为容易。
46
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件网页为一个独立的个体,网页与网页之间通过参数传递,得以保存相关信息。为了保存用户查询的条件,我们使用 ASP 程序代码配合 HTML,达到保存用户查询条件的目的,例如我们第一次查询时,将排序字段设为 CustomerID,输出顺序则设为递减。若我们未特殊处理 HTML部分,则查询后,画面上的输出顺序会重新设置在递增的条件上,这将造成用户的误解,
因此我们必须改变查询后 HTML的初值。
47
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件改变下拉式列表框初值的 ASP程序代码如下:
排序字段:
<select name="Key">
<option value="CustomerID"
<% If Key="CustomerID" Then Response.Write "selected" %>
>CustomerID</option>
<option value="CompanyName"
<% If Key="CompanyName" Then Response.Write
"selected" %> >CompanyName</option>
</select>
完成上面的修改之后,第三版的查询程序就大功告成了。相信通过三个查询范例的实例,可以让您完全的了解 ASP 的应用及 HTML 的编写技巧,让您在
ASP的设计功力上,又有大幅度的提升。
48
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件完整的第三版 ASP程序代码 (ch9-4.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key")
Sort = Request("Sort")Page = Clng(Request("Page"))
sql = "Select * from Customers"If Key > "" Then sql = sql + " order by " & Key
If Sort > "" Then sql = sql & " " & Sort
rs.open sql,conn,3,2rs.PageSize = 10 '每页显示记录数
If Page < 1 then Page = 1If page > rs.PageCount Then Page = rs.PageCount
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")%>
49
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database MultiPage Control Demo</font>
</p>
<form action="ch9-4.asp" method="post">
排序字段,
<select name="Key">
<option value="CustomerID"
<% If Key="CustomerID" Then Response.Write "selected" %>
>CustomerID</option>
<option value="CompanyName"
<% If Key="CompanyName" Then Response.Write "selected" %>
>CompanyName</option>
</select>
50
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
输出顺序,
<select name="Sort">
<option value="ASC"<% If Sort="ASC" Then Response.Write "selected" %>
>递增 </option><option value="DESC"
<% If Sort="DESC" Then Response.Write "selected" %>
>递减 </option></select>
<input type="submit" name="ok" value="确认 "></form>
</center>
<center><p>
<font face="Arial" size=5>SQL Server<br>Northwind Database MultiPage Control Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=96%>
51
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<%
Response.Write("<TR BGCOLOR=#ccccd7>")
Response.Write("<TD>CustomerID</TD>")Response.Write("<TD>CompanyName</TD>")
Response.Write("<TD>ContactName</TD>")Response.Write("<TD>ContactTitle</TD>")
Response.Write("<TD>City</TD>")
Response.Write("</TR>")For i = 1 to rs.PageSize
If rs.EOF Then Exit ForIf i mod 2=0 Then
Color = "#ddddd7"
ElseColor = "#eeeeef"
End IfResponse.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+"</TD>")
Response.Write("<TD>"+rs("CompanyName")+"</TD>")
52
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
Response.Write("<TD>"+rs("ContactName")+"</TD>")
Response.Write("<TD>"+rs("ContactTitle")+"</TD>")
Response.Write("<TD>"+rs("City")+"</TD>")Response.Write("</TR>")
rs.MoveNext Next
%>
</table></center>
<%If rs.PageCount > 1 then
%>
<br><div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>&Sort=<%=Sort%>&Key=<%=Key%>">
<img name="prev" border="0" src="prev.gif"
width="9" height="13"></a>
53
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i) + "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i))
+ "&Sort=" + Sort +"&Key="+Key+">
<Font color=" + color + ">" + Cstr(i) + "
</Font></a> "
End If
Next
%>
<a href="<%=MySelf%>?Page=
<%=(Page + 1)%>&Sort=<%=Sort%>&Key=<%=Key%>">
54
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<img name="next" border="0" src="next.gif"
width="9" height="13"></a>
</div>
<%
ElseIf rs.PageCount < 1 then
response.Write "<div align='center'>
<font color=red>无相关数据 !!...</font></div>"
End If
%>
</body>
</html>
在看完这几节有关数据库查询的技巧之后,您有何感想? 或许您很难想像,光一个查询程序竟然就可以应用得这么复杂。
55
9.6 最新信息管理实际范例随着 Internet的盛行,许多公司 (不管是大公司还是小公司 )几乎都已经上网了。在网站上线以后,有许多公司通过网站来发布最新的产品信息,以强化公司的行销及网站的利用率。由于网页需要美工及企划人员,因此有很多公司都采用委托给外人的方式进行,但是忽略了网站设计的灵活性,例如将网站数据库化、组件化等。造成日后每次想在网站上发布最新信息时,都还要雇佣专业网络公司的人员来修改网页 (小修改就自己来 ),造成许多维护人力及制作成本的浪费。有鉴于此,笔者总结实践经验,以一个美观、精致又简单的小型系统 (最新信息管理系统 )程序,为读者示范 ASP的数据库应用技巧。
56
9.6 最新信息管理实际范例
9.6.1 范例说明
9.6.2 创建数据库
9.6.3 创建用户与信息表
9.6.4 开发过程说明
57
9.6 最新信息管理实际范例
9.6.1 范例说明假设 hlfjob的网站都已经 e化,并可以通过浏览器在远程
(Remote)管理网站。由于远程管理涉及安全问题,因此我们将最新信息的管理维护操作功能,仅开放给合法用户使用。
为了方便日后的管理,我们将用户基本数据及最新信息置于
SQL Server数据库中,并搭配 ASP程序设计以完成本系统的建置。
系统的需求定义如下:
● 用户登录 (身份验证 )
● 密码更改
● 最新信息管理 (添加、修改、删除及查询 )
根据上述的需求,我们定义的数据库结构如下:
( 1)数据库名称,WebDB
( 2)用户表,Users
( 3)最新信息表,News
58
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 1)进入企业管理器窗口,在左边的数据库选项上,按一下鼠标右键,点选“新建数据库”命令,如下图所示。
59
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 2)在数据库属性窗口中,请输入数据库名称 WebDB,数据库的默认值为 1 MB。当数据库使用空间超过 1 MB时,系统会以每次
10%的大小增长,单击 按钮,如下图所示。
60
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 3)数据库创建完成,系统自动回到管理画面,如下图所示。
61
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 4)双击数据库选项,展开所有的 SQL Server数据库,找到
WebDB数据库,确定数据库已成功的创建,如下图所示。
62
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
Users表的定义如下图所示。
其中 uid为用户代号 (Userid的缩写 ),pwd为用户密码 (Password
的缩写 ),name则为用户中文姓名,三个字段都是变动长度的字符类型。
63
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 1)在企业管理器的表一览的窗口中,单击鼠标右键,点选“新建表”命令,如下图所示。
64
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 2)请输入 Users表的字段定义,如下图所示。
65
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 3)请点选 uid字段左边 (选取整列 ),然后单击“设置主键”的工具按钮,如下图 a所示。
( 4)请单击“保存”工具按钮,在“选择名称”对话框中,输入表名称,Users‖,然后单击 按钮,保存 Users表的相关定义,如下图 b所示。
图 a 图 b
66
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 5)关闭窗口,离开新建表操作。
( 6)点选 Users表,单击鼠标右键,点选“打开表 /返回所有行”
命令,如下图所示。
67
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 7)打开 SQL Server数据输入窗口,添加一条用户记录数据,在
uid,pwd及 name三个字段分别输入 admin,admin2000及系统管理员,以便进行下文的测试操作,如下图所示。
68
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
News表的定义如右图所示。
表 News共有 7个字段,NewsID为编号 (由系统自动产生 ),NewsIcon代表标题的图标 (请以 <img src=―图形文件名称,>表示 ),NewsSubject 为信息的标题,最长 64 个字符,信息内容
NewsContent为 ntext数据类型,可存放长篇大论的文字稿数据,startDate及 endDate则用以设置信息刊登的起止日期,配合 ASP程序可以做到时间信息自动发布,逾发布时间信息自动下线的自动化服务,至于 Userid及 CreateDate字段则分别记载此信息发布的人员及登录日期。
69
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
News表操作步骤:
( 1)在企业管理器 \表窗口中,单击鼠标右键,点选“新建表”命令。
( 2)请输入 News数据表的字段定义,如图 a所示。
( 3)请点选 NewsID字段左边 (选取整列 ),然后单击“设置主键”工具按钮,如图 b所示。
图 a 图 b
70
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
News表操作步骤:
( 4)在“选择名称”对话框中,输入表名称,News‖,然后单击按钮。保存 News表的相关定义,如下图所示。
( 5)关闭窗口,离开新建表操作。
说明,SQL Server有一种可每次增加某一固定数值的字段类型,
它的定义方式是点选“识别”的复选框,并定义识别的初始值及增量。例如初始值为 1,增量为 1,则数据添加时,字段的内容自动由
1起跳,每次加 1。 SQL Server还可定义字段的初值,例如本例中的
CreateDate,它的初值为 SQL Server提供的 getdate()函数,用以取得系统目前的日期。
71
9.6 最新信息管理实际范例
9.6.4 开发过程说明当数据库及相关表创建完成时,就可以开始 ASP程序的开发及测试操作了。下面是本范例的开发过程。
1,用户登录用户登录时必须输入两个字段,分别是用户 (uid)及密码 (pwd),
如下图所示。
72
9.6 最新信息管理实际范例
9.6.4 开发过程说明网页的源代码 (login.htm)如下:
<HTML>
<HEAD>
<style type="text/css">
<!--
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>登录 - Login</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html― charset="GB2312">
</HEAD>
73
9.6 最新信息管理实际范例
9.6.4 开发过程说明网页的源代码 login.htm (续 ),
<BODY bgcolor="#FFFFFF">
<form action="login.asp" method="post">
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF― bgcolor="#F2FDFD">
<tr>
<td colspan=4 align=―center‖ class=topic bgcolor=―#eaeaf4‖>Web管理中心 ─登录
(Login)</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 用户 (Userid) </td>
<td> <input type="text" name="uid" size="16" maxlength=16 value="">
</td>
</tr>
<tr bgcolor="#eaeaf4" class=small>
<td align=right> 密码 (Password) </td>
<td> <input type="password" name="pwd" size="16" maxlength=16
value=""> </td>
</tr>
74
9.6 最新信息管理实际范例
9.6.4 开发过程说明网页的源代码 login.htm (续 ),
<tr bgcolor="#ffefbf">
<td align=center colspan=2>
<input type="submit" value="登录 " name="send">
<input type="reset" value="重填 " name="clear">
</td>
</tr>
</table>
</form>
<p align=center class=small>
<a href="http://www.hlfjob.com.cn">首页 </a> |
<a href=" http://www.hlfjob.com.cn /newbook01.htm">最新书讯 </a> |
<a href=" http://www.hlfjob.com.cn /jiaoxue.htm">教学光盘 </a> |
<a href=" http://www.hlfjob.com.cn ">人才求职网 </a> |
<a href="mailto,service@hlfjob.com.cn ">服务信箱 </a>
</p>
</BODY>
</HTML>
75
9.6 最新信息管理实际范例
9.6.4 开发过程说明当用户输入相关信息,并单击 按钮后,login.htm
激活 login.asp,检查登录人员是否为合法用户,若通过身份确认系统会自动记录用户的 uid,pwd,name于
Session对象对应的对象变量,并以 Session("logined") =
True记录用户通过正常登录画面登录,最后进入系统管理画面 menu.asp;若用户及密码验证不正确,则画面继续停留于本网页。用户身份确认的 ASP程序代码
(login.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
76
9.6 最新信息管理实际范例
'验证登录者的身份
Function ValidPersonal(uid,pwd)
SQL = "SELECT uid,pwd,name FROM Users WHERE uid='" + uid
+ "' AND pwd='" + pwd + "'"
Set rs = Conn.Execute(SQL)
If rs.Eof Then
ValidPersonal = False
Else
ValidPersonal = True
End If
End Function
uid = Request("uid")
pwd = Request("pwd")
If ValidPersonal(uid,pwd) = True Then
9.6.4 开发过程说明
login.asp(续 ),
77
9.6 最新信息管理实际范例
Session("uid") = rs("uid")
' Session("uid") = 登录时输入的身份证号
Session("pwd") = rs("pwd")
' Session("pwd") = 登录时输入的密码
Session("name") = rs("name")
' Session("name") = 履历表中登录的姓名
Session("logined") = True
' Session("logined")= 记录会员已登录
Response.Redirect("menu.asp")
Else
Response.Redirect("login.htm")
End If
Set rs = Nothing
Set Conn = Nothing
%>
9.6.4 开发过程说明
login.asp(续 ),
78
9.6 最新信息管理实际范例
9.6.4 开发过程说明
2,系统管理当用户登录后,首先出现的是管理画面,如下图所示。
79
9.6 最新信息管理实际范例
9.6.4 开发过程说明该页面的程序代码 (menu.asp)为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>系统管理 </title>
</head>
<body>
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF"
bgcolor="#F2FDFD" width="100">
<tr height="40">
<td bgcolor=―#eaeaf4‖><p align=―center‖><font color=―#FF0000‖>系统管理
</font></p></td>
</tr>
80
9.6 最新信息管理实际范例
9.6.4 开发过程说明该页面的程序代码 menu.asp (续 )为:
<tr height="30">
<td bgcolor=―#ffefbf‖><p align=―center‖ ><a href=―chgpwd.htm‖>密码更改
</a></p></td>
</tr>
<tr height="30">
<td bgcolor=―#eaeaf4‖><p align=―center‖><a href=―NewsList.asp‖>最新信息
</a></p></td>
</tr>
<tr height="30">
<td bgcolor="#ffefbf"><p align="center">
<a href="mailto:dhs79@tjhldgz.com.cn">服务信箱 </a></p></td>
</tr>
</table>
</body>
</html>
81
9.6 最新信息管理实际范例
9.6.4 开发过程说明在系统管理画面中,我们提供密码更改、最新信息及服务信箱等三大功能,三大功能的网址如下:
( 1)密码更改 (chgpwd.htm)
( 2)最新信息 (NewsList.asp)
( 3)服务信箱 (mailto:dhs79@tjhldgz.com.cn)
82
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改为维护网站的安全,系统使用人员应定期更换密码,
以免密码遭到有心人士窃取使用。由于密码输入时都不会以明码显示 (以,●,字符代替 ),因此为了确保输入的正确性,通常密码更改时需输入原密码 (pwd)、新密码
(pwd1)及再输入一次新密码 (pwd2)等三个字段,在原密码正确及两次新密码一致的情况下,系统才会进行密码更改操作。密码更改的画面如下页图所示。
83
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改
84
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 (chgpwd.htm)如下:
<HTML>
<HEAD>
<style type="text/css">
<!--
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>密码更改 </TITLE>
85
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 chgpwd.htm (续 )如下:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html"
charset="GB2312">
</HEAD>
<BODY bgcolor="#FFFFFF">
<form action="chgpwd.asp" method="post">
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF" bgcolor="#F2FDFD">
<tr>
<td colspan=4 align="center" class=topic bgcolor="#eaeaf4">密码更改 </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 原密码 (Password) </td>
<td> <input type="password" name="pwd" size="16"
maxlength=16 value=""> </td>
</tr>
86
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 chgpwd.htm (续 )如下:
<tr bgcolor="#eaeaf4" class=small>
<td align=right> 新密码 (Password) </td>
<td> <input type="password" name="pwd1" size="16"
maxlength=16 value=""> </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 再输入一次新密码 (Password) </td>
<td> <input type="password" name="pwd2" size="16"
maxlength=16 value=""> </td>
</tr>
<tr bgcolor="#ffefbf">
<td align=center colspan=2>
<input type="submit" value="送出 " name="send">
<input type="reset" value="重填 " name="clear">
</td>
87
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 chgpwd.htm (续 )如下:
</tr>
</table>
</form>
<p align=center class=small>
<a href="http://www,hlfjob.com.cn">首页 </a> |
<a href="http://www,hlfjob.com.cn /newbook01.htm">最新书讯 </a> |
<a href="http://www,hlfjob.com.cn /cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn ">人才求职网 </a> |
<a href="mailto:service@ hlfjob.com.cn ">服务信箱 </a>
</p>
</BODY>
</HTML>
88
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改当用户输入密码更改相关信息,并单击 按钮后,
chgpwd.htm首先启动 chgpwd.asp程序,并进行原密码是否正确及两次新密码一致的判断,在正确无误后才进行数据库用户的密码更改操作。密码更改操作的 ASP原始程序代码 (chgpwd.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
'密码更改函数 Passwd
Function Passwd(pwd1,pwd2)
On Error Resume Next
If pwd1 = pwd2 Then
SQL = "UPDATE Users SET pwd = '" + pwd1 + "'
89
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改密码更改操作的程序代码 chgpwd.asp (续 )如下:
WHERE uid='" + Session("uid") + "'"
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Passwd = True
Else
Passwd = False
End If
Else
Passwd = False
End If
End Function
'旧密码相同,且两次新密码一致
If Session("pwd")=Request("pwd") and
Request("pwd1")=Request("pwd2") Then
'将数据库中的密码改为新密码
90
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改密码更改操作的程序代码 chgpwd.asp (续 )如下:
If Passwd(Request("pwd1"),Request("pwd2")) = True Then
Result = True
Else
Result = False
End If
Else
Result = False
End If
If Result = True Then
Response.Redirect("login.htm") ' 更改密码后重新登录
Else
Response.Redirect("chgpwd.htm") ' 密码更改失败,画面停留原处
End If
Set rs = nothing
Set Conn = nothing
%>
密码更改成功后,画面会自动切换至 login.htm
的登录画面,要求用户以新密码登录系统。
91
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息当用户点选最新信息,进入信息浏览画面
(NewsList.asp),如下图所示。
92
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息在本程序中,我们使用信息刊登起日为排序的依据,
后刊登的信息于输出时排在前面,越早刊登的信息则越排在后面,以符合最新信息的灵活性。因此我们对数据库所下的 SQL命令如下:
SELECT * FROM News ORDER BY startDate DESC
最新信息一览的 ASP程序代码 (NewsList.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
93
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from News order by startDate DESC"
rs.open sql,conn,3,2
rs.PageSize = 8 '每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")
%>
<html>
<head>
<style type="text/css">
<!--
94
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
a:link {color:#0F56A3; font-style:normal; cursor:hand; text-decoration:normal}
a:visited {color:#0F56A3; font-style:normal; text-decoration:normal}
a:active {color:#0F56A3; font-style:normal; text-decoration:normal}
a:hover {color:#CC0000; font-style:bold; text-decoration:none}
-->
</style>
<title>最新信息 </title>
<meta http-equiv="Content-Type" content="text/html" charset="GB2312">
</head>
<body>
<table border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#dfdfdf" bordercolordark="#ffffff" align="center">
<tr bgcolor="#cccce6">
<td align="center" class="topic" colspan="6" >最新信息一览 </td>
95
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
</tr>
<tr bgcolor="#ffefbf" class="small">
<td width="32">No#</td>
<td width="32">图标 </td>
<td width="260">标题 </td>
<td width="64">刊登起日 </td>
<td width="64">刊登止日 </td>
<td width="24">动作 </td>
</tr>
<%
For i = 1 to rs.PageSize
If rs.EOF Then Exit For
%>
<tr bgcolor="#bdf3eb" class="small">
<td><%=rs("NewsID")%></td>
<td><%=rs("NewsIcon")%></td>
96
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
<td><a href="EditNews.asp?NewsID=<%=rs("NewsID")%>">
<%=rs("NewsSubject")%></a></td>
<td><%=rs("StartDate")%></td>
<td><%=rs("EndDate")%></td>
<td><a href="DelNews.asp?NewsID=<%=rs("NewsID")%>">删除 </a></td>
</tr>
<%
rs.MoveNext
Next
%>
<tr bgcolor="#eaeaf4" class="small">
<td colspan=6 align=center><a href="addNews.htm">
输入最新信息 </a></td>
</tr>
</table>
<%
97
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
If rs.PageCount > 1 then
%><br>
<div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %> &Sort=<%=Sort%>&
Key=<%=Key%>"> <img name="prev" border="0" src="prev.gif"
width="15" height="16"></a>
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i)+ "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i)) + "><Font color="
+ color + ">" + Cstr(i) + "</Font></a> ―
Next
98
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
%>
<a href="<%=MySelf%>?Page= <%=(Page + 1)%>&Sort=<%=Sort%>&
Key=<%=Key%>"> <img name="next" border="0" src="next.gif" width="15"
height="16"></a>
</div>
<%
End If
%><br>
<p align=center class=small>
<a href="http://www.hlfjob.com.cn ">首页 </a> |
<a href="http://www.hlfjob.com.cn/newbook01.htm">最新书讯 </a> |
<a href="http://www.hlfjob.com.cn/cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn">人才求职网 </a> |
<a href="mailto:service@hlfjob.com.cn">服务信箱 </a>
</p>
</body></html>
在本范例中,由于是第一次使用,系统尚未有最新信息的公告。您可以点选表格下方的输入最新信息,以进入最新信息 —添加画面。
99
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加最新信息的数据库字段共有 7个,
其中 Userid 由程序自动填入登录的用户名称,CreateDate字段则由 SQL
Server自动填入系统日期 (程序中不要对该字段设初值,SQL Server会自动依据字段的设置填入系统日期 ),至于其他 5个字段则必须由管理人员输入。
输入时也可以输入 HTML的标记,这些标记都可以正常的发挥原先的功能显示,例如超级链接、字体设置、字体大小、字体颜色等,让您的网站内容更加生动活泼。下面是最新信息 ——添加的范例,如右图所示。
10
0
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 (addNews.htm)如下:
<HTML>
<HEAD>
<style type="text/css">
<!--
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input,textarea { font-family,"宋体 "; font-size,9pt;
vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>最新信息 ─添加 </TITLE>
101
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html"
charset="GB2312">
</HEAD>
<BODY bgcolor="#FFFFFF">
<form action="addnews.asp" method="post">
<table align=center border="1" cellspacing="0" cellpadding="1" bordercolorlight
="#CCCCCC" bordercolordark="#FFFFFF" bgcolor="#F2FDFD">
<tr>
<td colspan=4 align=―center‖ class=topic bgcolor=―#eaeaf4‖>最新信息 ─添加
</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息图标 </td>
<td> <input type="text" name="NewsIcon" size="66" maxlength="48">
</td>
</tr>
10
2
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息标题 </td>
<td> <input type="text" name="NewsSubject" size="66"
maxlength="64" > </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息内容 </td>
<td> <textarea name="NewsContent" rows="6"
cols="64"></textarea></td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 刊登起日 </td>
<td> <input type="text" name="startDate" size="10"
maxlength="10"> 格式,yyyy/mm/dd</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
10
3
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<td align=right> 刊登止日 </td>
<td> <input type="text" name="endDate" size="10"
maxlength="10"> 格式,yyyy/mm/dd</td>
</tr>
<tr bgcolor="#e0dcc3">
<td align=center colspan=2> <%=Err.Description%> </td>
</tr>
<tr bgcolor="#ffefbf">
<td align=center colspan=2>
<input type="submit" value="送出 " name="send">
<input type="reset" value="重填 " name="clear">
</td>
</tr>
</table>
</form>
10
4
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<p align=center class=small>
<a href="http://www.hlfjob.com.cn">首页 </a> |
<a href="http://www.hlfjob.com.cn/newbook01.htm">最新书讯 </a> |
<a href= "http://www.hlfjob.com.cn/cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn">人才求职网 </a> |
<a href="mailto:service@hlfjob.com.cn">服务信箱 </a>
</p>
</BODY>
</HTML>
10
5
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加当信息添加完毕以后,按 按钮,如下图所示。
10
6
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加随后写入的信息将传值给添加信息的 ASP程序代码
(addnews.asp),代码如下:
<%
If Session("logined") <> True Then
Response.Redirect("Login.htm")
End If
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL
Server};Database=WebDB;Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
rs.open "News",Conn,3,2
rs.AddNew
rs("NewsIcon") = Request("NewsIcon")
rs("NewsSubject") = Request("NewsSubject")
rs("NewsContent") = Request("NewsContent")
107
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加
addnews.asp (续 ),
rs("startDate") = Request("startDate")
rs("endDate") = Request("endDate")
rs("Userid") = Session("uid")
'On Error Resume Next
rs.Update
If Err.Number > 0 Then
Else
Set rs = Nothing
Set Conn = Nothing
Response.Redirect("NewsList.asp")
End If
%>
10
8
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加
addnews.asp将数据写入数据库后系统自动回到“最新信息一览”画面,将先前添加的信息显示出来,我们可以看到连标题的图标都可以正常显示,如下图所示。
10
9
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正最新信息输入以后,若发觉有错字或有更好的表达方式,我们还可以直接于本系统中修改。完全不用外包给厂商维护,当然可节省大量的人力维护成本。维护数据的方式是,直接点选标题进入信息编辑状态,如下图所示。
110
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正最新信息 ——更正的源代码 (EditNews.asp)如下:
<%
If Session("logined") <> True Then
Response.Redirect("Login.htm")
End If
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL
Server};Database=WebDB;Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "Select * from News where NewsID=" & Request("NewsID")
rs.open sql,conn,3,2
%>
<HTML>
<HEAD>
<style type="text/css">
<!--
111
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input,textarea { font-family,"宋体 "; font-size,9pt;
vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>最新信息 ─更正 </TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html"
charset="GB2312">
</HEAD>
<BODY bgcolor="#FFFFFF">
<form action="UpdNews.asp" method="post">
112
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
<input type="hidden" name="NewsID" value="<%=Request("NewsID")%>">
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF" bgcolor="#F2FDFD">
<tr>
<td colspan=4 align=―center‖ class=topic bgcolor=―#eaeaf4‖>最新信息 ─更正
</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息图标 </td>
<td> <input type="text" name="NewsIcon" size="66" maxlength="48"
value="<%=Server.HTMLEncode(rs("NewsIcon"))%>"> </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息标题 </td>
<td> <input type="text" name="NewsSubject" size="66" maxlength="64"
value="<%=rs("NewsSubject")%>"> </td>
113
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
</tr>
<tr bgcolor="#bdf3eb" class=small> <td align=right> 信息内容 </td>
<td> <textarea name="NewsContent" rows="6"
cols="64"><%=rs("NewsContent")%></textarea></td> </tr>
<tr bgcolor="#bdf3eb" class=small> <td align=right> 刊登起日 </td>
<td> <input type="text" name="startDate" size="10" maxlength="10"
value="<%=rs("startDate")%>"> 格式,yyyy/mm/dd</td> </tr>
<tr bgcolor="#bdf3eb" class=small> <td align=right> 刊登止日 </td>
<td> <input type="text" name="endDate" size="10" maxlength="10"
value="<%=rs("endDate")%>"> 格式,yyyy/mm/dd</td> </tr>
<tr bgcolor="#ffefbf">
114
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
<td align=center colspan=2><input type="submit" value="送出 " name="send">
<input type="reset" value="重填 " name="clear"> </td> </tr>
</table>
</form><p align=center class=small>
<a href="http://www.hlfjob.com.cn">首页 </a> |<a href="http://www.hlfjob.com.cn/newbook01.htm">最新书讯 </a> |
<a href="http://www.hlfjob.com.cn/cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn">人才求职网 </a> |<a href="mailto:service@hlfjob.com.cn">服务信箱 </a>
</p><%
Set rs = Nothing
Set Conn = Nothing%>
</BODY>
</HTML>
115
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正说明:在本画面中,由于信息图标的字段值为 <img
src="tb.jpg">,会造成输入框因字段内容有双引号,无法正常显示的情形。因此必须使用 Server.HTMLEncode将 rs("NewsIcon")的内容编码,以避开这一问题点。
修改后,点选 按钮,传值给 UpdNews.asp更新信息,如下图所示。
116
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正更新信息源代码 (UpdNews.asp)如下:
<%
NewsIcon=request("NewsIcon")
NewsSubject=request("NewsSubject")
NewsContent=request("NewsContent")
startDate=request("startDate")
endDate=request("endDate")
NewsId=request("NewsId")
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};
Database=WebDB;Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
117
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正更新信息源代码 UpdNews.asp (续 )如下:
response.write request("NewsId")
sql="UpDate News set NewsIcon='"& NewsIcon & "',NewsSubject='"&
NewsSubject & "',NewsContent='"& NewsContent & "',startDate='"& startDate &
"',endDate='"& endDate & "' where NewsId='"&NewsId&"'"
rs.open sql,conn,3,2
Set rs = Nothing
Set Conn = Nothing
%>
<body>
<br>
<P align=center><FONT color=red face=宋体 size=5>
<strong>修改正确 !</strong> </FONT>
</body>
118
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正更新后页面出现修改的,NewsId‖ 号和,修改正确 !,等字样,如下图所示 。
119
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——删除最新信息虽然具有自动刊登及自动下线的功能,但是日子一久,
数据库累积的数据量会很大 (程序会自动以每页 10条记录的方式分页处理 )。我们也可以将过时的信息删除,删除的方式是点选每一条信息后面的超级链接“删除” (注意:此删除动作为立即执行,下手后就不能反悔了,请三思而行! )。删除的超级链接如下:
<a href="DelNews.asp?NewsID=<%=rs("NewsID")%>">删除 </a>
在删除的超级链接中,我们将信息编号以参数的方式传给
DelNews.asp程序。当用户点选“删除”后,DelNews.asp会根据参数
Request("NewsID")的值,删除数据库该记录信息的数据,并自动回到最新信息一览画面。
12
0
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——删除删除信息的 ASP程序源代码 (DelNews.asp)如下:
<%
If Session("logined") <> True Then
Response.Redirect("Login.htm")
End If
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
SQL = "DELETE FROM News WHERE NewsID=" & Request("NewsID")
rs.open SQL,Conn,3,2
Set rs = Nothing
Set Conn = Nothing
Response.Redirect("NewsList.asp")
%>
121
9.6 最新信息管理实际范例
9.6.4 开发过程说明
5,服务信箱服务信箱是通过 HTML的 <a>标记来完成的,它的用法如下:
<a href=―mailto:service@hlfjob.com.cn?subject=[book] 网页制作高手 ">服务信箱 </a>
其中,mailto:‖ 用以告诉浏览器启动系统默认的电子邮件软件,并将后面的电子邮件账号带入收件人字段,
而,?‖为电子邮件与参数间的分隔字符,,subject‖为信件标题的字段名称,,=‖号后面则为字段的值。当我们按下服务信箱之后,系统自动启动默认的电子邮件软件
(例如 Outlook Express),如下页图所示。
122
9.6 最新信息管理实际范例
9.6.4 开发过程说明
5,服务信箱由上面我们可以看到,收件人及主题均被自动填上对应的值,而免除用户需再度输入的问题。
12
3
9.6 最新信息管理实际范例
9.6.4 开发过程说明当数据都准备就绪以后,网友通过浏览器上 hlfjob
网站,就可以看到最新信息了。在本例中,网友看到的
Page为 News.asp,如下图所示。
124
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from News order by startDate DESC"
rs.open sql,conn,3,2
rs.PageSize =8?每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount
12
5
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")
%>
<html>
<head>
<style type="text/css">
<!--
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
a:link {color:#0F56A3; font-style:normal; cursor:hand; text-decoration:normal}
a:visited {color:#0F56A3; font-style:normal; text-decoration:normal}
a:active {color:#0F56A3; font-style:normal; text-decoration:normal}
a:hover {color:#CC0000; font-style:bold; text-decoration:none}
-->
</style>
<title>最新信息 </title>
<meta http-equiv="Content-Type" content="text/html" charset="GB2312">
12
6
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
</head>
<body><table border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#dfdfdf" bordercolordark="#ffffff" align="center">
<tr bgcolor="#cccce6"><td align="center" class="topic" colspan="4">最新信息 </td>
</tr> <tr bgcolor="#e0dcc3" class="small">
<td width="345">标题 </td>
<td width="66">刊登起日 </td> <td width="66">刊登止日 </td>
</tr> <%
For i = 1 to rs.PageSize
If rs.EOF Then Exit For%>
<tr bgcolor="#c8e3e3" class="small">
<td><%=rs("NewsIcon")%> <%=rs("NewsSubject")%></td>
127
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
<td><%=rs("StartDate")%></td>
<td><%=rs("EndDate")%></td></tr>
<tr bgcolor="#ffefbf" class="small">
<td colspan=3><%=rs("NewsContent")%></td></tr>
<%rs.MoveNext
Next
If rs.PageCount > 1 then%>
</table><br><div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %> &Sort=<%=Sort%>&
Key=<%=Key%>"><img name="prev" border="0" src="prev.gif"width="15" height="16"></a>
<%
For i = 1 to rs.PageCount
12
8
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
If i = Page then
color = "Red"response.write " <Font color=" + color + ">" + Cstr(i)+ "</Font> "
Else
color = "Black"response.write " <a href=" + MySelf + "?Page=" + Cstr((i)) + "><Font color="
+ color + ">" + Cstr(i) + "</Font></a> "End If
Next
%> <a href="<%=MySelf%>?Page= <%=(Page + 1)%>&Sort=<%=Sort%>&Key=
<%=Key%>"><img name="next" border="0" src="next.gif" width="15―height="16"></a>
</div>
<%End If
%></body>
</html>
12
9
9.6 最新信息管理实际范例
9.6.4 开发过程说明由于最新信息为公开的信息,所以并没有纳入上述的网站管理项目之中。
说明:由于笔者相当了解 HTML,因此可利用
HTML实现许多功能上的变化,让系统变得简单又不失其灵活性,这也是本书为何要介绍 HTML的用意。
13
0
第 9章 数据库查询的技巧本章以 SQL Server 2000 内置的,北风 (Northwind)
数据库”为基础,向读者介绍了如何开发数据库查询程序、数据分页的技巧、动态数据库查询、数据库查找对比的技巧等,让您真正了解 SQL Server 2000在网站方面的运用。
131
第 9章 数据库查询的技巧
习题
1,请以北风数据库中的 Employees制作多页 (Multi-Page)
的查询程序。
2,请以北风数据库中的 Employees制作第三种查询程序,条件的个数及展现方式请自由发挥。
3,读者可自行修改管理程序,增加最新信息预览的功能
(调用 News.asp),让管理程序更为完整。
4,请读者自行练习编写用户管理程序,并加入最新信息的管理程序界面之中,当然您可以增加用户记载的信息,让用户的功能更齐全,例如权限的设置,让管理程序功能日渐完备。
ASP动态网页设计教程
2
第 9章 数据库查询的技巧本章将以 SQL Server 2000 内置的,北风
(Northwind)数据库”为基础,为读者介绍如何开发数据库查询程序、数据分页的技巧、动态数据库查询、数据库查找对比的技巧等主题,让您真正了解 SQL Server 2000在企业网站方面的运用。
3
第 9章 数据库查询的技巧
9.1 北风数据库简介
9.2 数据库查询范例
9.3 分页的技巧 (一 )
9.4 分页的技巧 (二 )
9.5 分页的技巧 (三 )
9.6 最新信息管理实际范例
4
9.1 北风数据库简介北风数据库为一内容相当完整的小型数据库范例,
内置有 33个数据表 (Table),其中有 13个类型为用户 (User)
的表。完整的北风数据库,其所有的表如下图所示。
5
9.1 北风数据库简介接下来我们将以北风数据库中的顾客表 (Customers)
为例,如下图所示,为您介绍数据库查询的各种技巧。
6
9.2 数据库查询范例
Customers数据表共有 11个字段,假设我们要查询的数据共有 5
个字段,它们分别是 CustomerID,CompanyName,ContactName、
ContactTitle及 City。通常在第一次编写的 ASP程序代码中,有关数据库的 SQL查询语言会这样写:
SELECT * FROM Customers
得到的查询结果是将上述的 5个字段数据全部显示在网页上,
如下图所示。
整个的查询结果在浏览器中需要显示好几页,用户必须利用滚动条 (Scroll Bar)
上下移动,才能看完所有的信息。这种程序的写法最为简单,但是会消耗太多的系统资源,使得系统执行的效率降低。
7
9.2 数据库查询范例为了改善上述的缺点,我们将 ASP程序代码 (ch9-1.asp)列出来,
以供读者参考:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local); uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "Select * from Customers order by CustomerID"
rs.open sql,conn,3,2
%>
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database Listing Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=100%>
<tr bgcolor=#ccccd7>
8
9.2 数据库查询范例
ch9-1.asp (续 ),
<td>CustomerID</td>
<td>CompanyName</td>
<td>ContactName</td>
<td>ContactTitle</td>
<td>City</td>
</tr>
<%
i = 0
do while not rs.eof
i = i + 1
If i mod 2=0 Then '设置奇数行与偶数行的颜色
Color = "#ddddd7" '偶数行颜色为 ddddd7
Else
Color = "#eeeeef" '奇数行颜色为 eeeeef
End If
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<td>"+rs("CustomerID")+"</td>")
Response.Write("<td>"+rs("CompanyName")+"</td>")
Response.Write("<td>"+rs("ContactName")+ "</td>")
9
9.2 数据库查询范例
ch9-1.asp (续 ),
Response.Write("<td>"+rs("ContactTitle")+ "</td>")
Response.Write("<td>"+rs("City")+"</td>")
Response.Write("</tr>")
rs.MoveNext
Loop
%>
</table>
</center>
</body>
</html>
上面的程序代码虽然可以正确无误的执行,但是还有许多可改善之处。这些部分经我们整理之后,有两大重点,分别为 SQL最优化与数据分页处理。我们将分别说明如下,
10
9.2 数据库查询范例
9.2.1 SQL最优化
9.2.2 数据分页的处理
11
9.2 数据库查询范例
9.2.1 SQL最优化虽然 SQL Server会针对用户的 SQL Command进行最优化,然而并不见得都是最优化。有时最优化还是须以人工的方式来处理,例如 Customers数据表共有 11
个字段,但是我们只用到其中的 5个字段,于是偷懒的程序设计员们会使用下面的 SQL Command写法:
SELECT * FROM Customers
或许,这个程序设计员还会向别人炫耀它的 SQL
Command 最为简洁,其实殊不知他已经犯了大忌,因为 SQL Server会将 Customers所有字段 (11个 )的数据,送往 IIS上的 ASP数据库对象,使得网络传输的数据量大增,并大幅降低 IIS和 SQL Server的处理速度。
12
9.2 数据库查询范例
9.2.1 SQL最优化为解决上述的问题,我们提出的 SQL Command
如下:
SELECT CustomerID,CompanyName,ContactName,
ContactTitle,City FROM Customers
在本范例中的 Customers数据表共有 91条记录数据。第一个写法需要传输 91× 11个字段,而第二种写法则只需要 91× 5个字段。若不计算字段的长度,第二种写法约可节省 6/11的数据量。因此可大幅减少网络的数据传输量,提高网络主机及数据库主机的执行性能。
13
9.2 数据库查询范例
9.2.2 数据分页的处理对于数据量较小的 Table而言,一次显示所有的数据是没有问题的,但是当数据量相当庞大的时候,要将所有的数据一股脑儿显示在网页上,那可就万万不行,因为当 ASP在编辑 HTML的同时,系统就可能因为数据量太大而发生 Timeout(超时 )的问题。要解决这一问题,我们可以将数据分割成数页,每页显示若干记录数据 (例如每页只显示 20条记录数据 ),并提供上、下页或指定页数之查询方式 (例如国内的新浪、搜狐等网站搜索引擎的做法 ),以避免用户久候网页或发生
Timeout的情形,并可大幅减少系统的负荷。
14
9.2 数据库查询范例
9.2.2 数据分页的处理数据分页的技巧是通过指定 RecordSet对象的 PageSize
属性来完成。当我们设置 PageSize的值之后,数据库对象会自动将 RecordSet 的大小分为若干个 Page。例如每页要显示 20条记录数据,则 ASP的写法如下:
Set rs = Server.CreateObject("ADODB.Recordset ")
sql = "Select * from Customers order by CustomerID"
rs.open sql,conn,3,2
rs.PageSize = 20? 设置每页显示记录数在设置页面的大小以后,另外必须设置 AbsolutePage
的值,让数据库的指针自动移至对应的记录。
AbsolutePage的写法如下:
rs.AbsolutePage = 2 ' 设置目前处理范围 (页数 )
15
9.2 数据库查询范例
9.2.2 数据分页的处理
RecordSet在设置 AbsolutePage属性的值以后,数据库第一条记录数据的地址将自动被改变,它的计算公式如下:
第一条记录数据地址 = (AbsolutePage – 1) × PageSize + 1
例如 AbsolutePage = 2,PageSize = 20,则第一条记录等于 RecordSet中的第 21条记录。它的计算公式如下:
第一条记录 = (2 – 1) × 20 + 1 = 21
16
9.2 数据库查询范例
9.2.2 数据分页的处理当所有的准备操作都备好之后,接下来就可以处理指定页面的数据了,它与第 8章的数据库处理方法不同。请参考如下说明:
For i = 1 to rs.PageSize '每次处理 PageSize记录数据
If rs.EOF Then Exit For '若已处理完毕则离开 For循环
If i mod 2=0 Then
Color = "#ddddd7" '偶数行显示的颜色
Else
Color = "#eeeeef" '奇数行显示的颜色
End If
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+"</TD>")
Response.Write("<TD>"+rs("CompanyName")+ "</TD>")
Response.Write("<TD>"+rs("ContactName")+ "</TD>")
Response.Write("<TD>"+rs("ContactTitle")+ "</TD>")
Response.Write("<TD>"+rs("City")+ "</TD>")
Response.Write("</TR>")
rs.MoveNext '下一条记录
Next
17
9.3 分页的技巧(一)
根据数据显示,北风数据库 Customers 数据表共有
91条记录数据。为了方便在线浏览的用户查阅,我们将系统设计为每页显示 10条记录数据,并在每页的下方提供目前页数 (数字不带下划线 )、上一页 (左箭头图标表示 )
及下一页 (右箭头图标表示 )的功能,如下图所示。
18
9.3 分页的技巧(一)
9.3.1 页数控制
9.3.2 递归调用
9.3.3 上、下页及指定页数的控制
19
9.3 分页的技巧(一)
9.3.1 页数控制为了完成上述的功能,我们在 ASP中以 Page变量记录目前的页数。 Page变量的处理规则如下:
● 页数为 0的处理:当 Page < 1时,设置 Page = 1
● 页数大于实际页数,Page > PageCount时,将 Page设为 PageCount
上面的处理原则对于上、下页浏览时特别有用,并可避免程序发生不可预期的状况 (Exception),导致错误的情形发生。
20
9.3 分页的技巧(一)
9.3.2 递归调用递归 (Recursive)调用是一种由程序本身调用自己的处理方式,它可以简化程序的复杂度,如下图所示。
在 HTML 的语法中,我们可以让网页自己调用自己。但是使用上并不是那么方便,因为它缺乏重复使用的能力,因为它缺乏重复使用的能力,例如 index.asp
21
9.3 分页的技巧(一)
9.3.2 递归调用的网页中,递归程序写法如下:
<a href="index.asp">自己调用自己 </a>
但是这样的写法到了 index2.asp时,程序必须配合修改如下:
<a href="index2.asp">自己调用自己 </a>
不同的网页在处理递归时都会有这一问题。但是通过 ASP这个问题是可以解决的,解决方式是通过
Request.ServerVariables("PATH_INFO")取得网页的路径。它的用法如下:
<a href="<%= Request.ServerVariables("PATH_INFO")%>?Page=
<% =(Page - 1) %>">
例如现行的网页为 /forum/index.asp,则
Request.ServerVariables("PATH_INFO")的值为 /forum/index.asp,也就是本网页的路径。
22
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制至于上、下页及指定页数的控制,我们可使用 Page变量为参数,
利用 HTML参数传递方式,并以递归调用方式 (自己调用自己 )来简化程序的复杂度。页数控制的规则如下:
1,上一页将 Page页数减 1,利用 MySelf变量 (记录本网页的路径 )达到调用自己的目的。
<%
取得网页的路径
MySelf = Request.ServerVariables("PATH_INFO")
:
%>
:
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>">
23
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
2,下一页将 Page页数加 1,然后调用自己来处理。
<%
取得网页的路径
MySelf = Request.ServerVariables("PATH_INFO")
:
%>
:
<a href="<%=MySelf%>?Page=<%=(Page + 1)%> ">
3,指定页数将 Page变量化为 URL的参数,调用自己来处理。
<a href=" + MySelf + "?Page=" & Page & ">
24
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制根据上面的控制原则,我们完成第一版的多页查询程序。 ASP
程序代码 (ch9-2.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Page = CLng(Request("Page"))
sql = "Select * from Customers order by CustomerID"
rs.open sql,conn,3,2
rs.PageSize = 10 '每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount '指定页数 > 实际页数的处理
If rs.PageCount > 0 then rs.AbsolutePage = Page '页数 > 0 的处理
MySelf = Request.ServerVariables("PATH_INFO")
利用 PATH_INFO取得目前网页的路径
%>
<html>
<body>
<center>
25
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database MultiPage Control Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=96%>
<%
Response.Write("<TR BGCOLOR=#ccccd7>")
Response.Write("<TD>CustomerID</TD>")
Response.Write("<TD>CompanyName</TD>")
Response.Write("<TD>ContactName</TD>")
Response.Write("<TD>ContactTitle</TD>")
Response.Write("<TD>City</TD>")
Response.Write("</TR>")
For i = 1 to rs.PageSize
If rs.EOF Then Exit For
If i mod 2=0 Then
Color = "#ddddd7"
Else
Color = "#eeeeef"
End If
26
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+ "</TD>")
Response.Write("<TD>"+rs("CompanyName")+ "</TD>")
Response.Write("<TD>"+rs("ContactName")+ "</TD>")
Response.Write("<TD>"+rs("ContactTitle")+ "</TD>")
Response.Write("<TD>"+rs("City")+"</TD>")
Response.Write("</TR>")
rs.MoveNext
Next
%>
</table>
</center>
<%
If rs.PageCount > 1 then
%>
<br>
<div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>">
<img name=" prev" border="0" src="prev.gif" width="9"
height="13"></a>
27
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i) + "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i))
+ "><Font color="+ color + ">" + Cstr(i)
+ "</Font></a> "
End If
Next
%>
<a href="<%=MySelf%>?Page=<%=(Page + 1)%> ">
<img name="next" border="0" src="next.gif" width="9" height="13"></a>
</div>
28
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制
ch9-2.asp (续 ),
<%
ElseIf rs.PageCount < 1 then
response.Write "<div align=?center‘><font color=red>
无相关数据 !!...</font></div>"
End If
%>
</body>
</html>
说明:由于 Browser会忽略 HTML中的空格符,因此要在网页中显示空格符,必须将编码后的空格符,设置其值为  。
29
9.3 分页的技巧(一)
9.3.3 上、下页及指定页数的控制执行结果如下图所示 。
30
9.4 分页的技巧(二)
虽然第一版的多页查询程序已经可以满足我们的需求,但是这样的范例并不能满足用户少量、多样的需求,例如可以设置查询的条件,或数据输出的顺序等。像前述这样的需求在运用 ASP以后,如雨后春笋般的出现,并且已变成网站最基本的要求。
为了满足用户对信息的渴望,我们以第一版的
ASP程序代码为基础,开发了第二版的查询程序。第二版的查询程序将网页分成两部分,第一部分即为查询条件的设置,它可以指定字段输出的顺序,如下页图所示;第二部分为查询程序,已于上节说明。
31
9.4 分页的技巧(二)
设置查询条件的 HTML源代码 (select.htm)如下:
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>Northwind Database
MultiPage Control Demo</font>
</p>
32
9.4 分页的技巧(二)
select.htm (续 ),
<form action="ch9-3.asp" method="post">
排序字段,
<select name="Key">
<option value="CustomerID">CustomerID</option>
<option value="CompanyName">CompanyName</option>
</select>
输出顺序,
<select name="Sort">
<option value="ASC">递增 </option>
<option value="DESC">递减 </option>
</select>
<input type="submit" name="ok" value="确认 ">
</form>
</center>
</body>
</html>
33
9.4 分页的技巧(二)
当用户按下,确认,键后,网页根据 HTML中 <form>标记内的 Action设置,调用 ch9-3.asp(Action=―ch9-3.asp‖),执行多页查询的功能 。 查询后的结果如下图所示 。
34
9.4 分页的技巧(二)
在第二版的查询程序中,源代码 (ch9-3.asp)几乎与第一版的程序一致,其中最大的差异在于参数的传递与处理,当参数由
select.htm中传递过来时,我们将参数与 SQL Command结合,变成动态的 SQL Command。程序代码如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key") '排序的字段
Sort = Request("Sort") '数据排列顺序 (递增或递减 )
Page = Clng(Request("Page"))
'组成 SQL Command
sql = "SELECT * FROM Customers ORDER BY " & Key & " " & Sort
rs.open sql,conn,3,2
35
9.4 分页的技巧(二)
至于上、下页及指定页数的数据查询,也须配合数据输出顺序而做调整,其调整方式主要是针对 HyperLink而来,只要在 Hyperlink
处加入参数 Key及 Sort两个变量即可。例如:
● 上一页
<a href=―<%=MySelf%>?Page=<% =(Page - 1)
%>&Sort=<%=Sort%>&Key=<%=Key%>―>
● 下一页
<a href=―<%=MySelf%>?Page=<%=(Page + 1)%>
&Sort=<%=Sort%>&Key=<%=Key%>―>
● 指定页数
<a href="+ MySelf +"?Page="+ Cstr((i)) + "&Sort=" + Sort
+"&Key="+Key+">
36
9.4 分页的技巧(二)
经过修正后,第二版完整的 ASP动态查询程序 (ch9-3.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from Customers order by ' & Key & ' " & Sort
rs.open sql,conn,3,2
rs.PageSize = 10 '每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")
%>
37
9.4 分页的技巧(二)
ch9-3.asp (续 ),
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database MultiPage Control Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=96%>
<%
Response.Write("<TR BGCOLOR=#ccccd7>")
Response.Write("<TD>CustomerID</TD>")
Response.Write("<TD>CompanyName</TD>")
Response.Write("<TD>ContactName</TD>")
Response.Write("<TD>ContactTitle</TD>")
Response.Write("<TD>City</TD>")
Response.Write("</TR>")
For i = 1 to rs.PageSize
If rs.EOF Then Exit For
If i mod 2=0 Then
Color = "#ddddd7"
38
9.4 分页的技巧(二)
ch9-3.asp (续 ),
Else
Color = "#eeeeef"
End If
Response.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+"</TD>")
Response.Write("<TD>"+rs("CompanyName")+ "</TD>")
Response.Write("<TD>"+rs("ContactName")+ "</TD>")
Response.Write("<TD>"+rs("ContactTitle")+ "</TD>")
Response.Write("<TD>"+rs("City")+"</TD>")
Response.Write("</TR>")
rs.MoveNext
Next
%>
</table>
</center>
<%
If rs.PageCount > 1 then
%>
39
9.4 分页的技巧(二)
ch9-3.asp (续 ),
<br>
<div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>
&Sort=<%=Sort%>&Key=<%=Key%>">
<img name="prev" border="0" src="prev.gif" width="9"
height="13"></a>
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i)
+ "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i))
+ "&Sort=" + Sort +"&Key="+Key+"><Font color="
+ color + ">" + Cstr(i) +"</Font></a> "
40
9.4 分页的技巧(二)
ch9-3.asp (续 ),
End If
Next
%>
<a href="<%=MySelf%>?Page=<%=(Page + 1)%>
&Sort=<%=Sort%>&Key=<%=Key%>">
<img name="next" border="0" src="next.gif" width="9"
height="13"></a>
</div>
<%
ElseIf rs.PageCount < 1 then
response.Write "<div align='center'><font color=red>
无相关数据 !!...</font></div>"
End If
%>
</body>
</html>
41
9.5 分页的技巧(三)
话说“天下分久必合、合久必分”,制作网页程序也不例外。从第一版的简易查询程序演进至第二版,我们将网页拆开成条件设置及查询程序两部分。但是第三个范例,如下图所示,我们却把第二个范例,由两个网页整合成单一网页,当然整个设计的技巧又难了许多。
42
9.5 分页的技巧(三)
要这样设计的原因,主要是可以简化 ASP程序的数目,并降低程序连接及维护上的困难。所有我们将两个网页整合在一起,有些问题是我们要特别注意的,例如:
网页查询时的初始值如何决定、动态 SQL Command如何决定、查询的网页要安插在何处较为恰当及如何保存用户的查询条件等。
9.5.1 网页查询时的初始值如何决定
9.5.2 动态 SQL Command如何决定
9.5.3 查询的网页要安插在何处较为恰当
9.5.4 如何保存用户的查询条件
43
9.5 分页的技巧(三)
9.5.1 网页查询时的初始值如何决定由于少了设置条件的网页,因此第一次执行本程序时,字段 Key及 Sort的值均不存在,因此它的值等于空白或 Null。
44
9.5 分页的技巧(三)
9.5.2 动态 SQL Command如何决定为了避免 SQL语法错误,我们将 Key及 Sort字段分开判断,当有值的时候才与 sql 变量结合为新的 sql 字符串。
<%
:
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from Customers"
If Key > "" Then sql = sql + " order by " & Key
If Sort >"" Then sql = sql & " " & Sort
rs.open sql,conn,3,2
:
%>
45
9.5 分页的技巧(三)
9.5.3 查询的网页要安插在何处较为恰当由于 ASP程序代码必须先执行,因此建议将用户接口的部分,置于 ASP 程序代码的后面,提高 HTML
的可读性,将来的维护也较为容易。
46
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件网页为一个独立的个体,网页与网页之间通过参数传递,得以保存相关信息。为了保存用户查询的条件,我们使用 ASP 程序代码配合 HTML,达到保存用户查询条件的目的,例如我们第一次查询时,将排序字段设为 CustomerID,输出顺序则设为递减。若我们未特殊处理 HTML部分,则查询后,画面上的输出顺序会重新设置在递增的条件上,这将造成用户的误解,
因此我们必须改变查询后 HTML的初值。
47
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件改变下拉式列表框初值的 ASP程序代码如下:
排序字段:
<select name="Key">
<option value="CustomerID"
<% If Key="CustomerID" Then Response.Write "selected" %>
>CustomerID</option>
<option value="CompanyName"
<% If Key="CompanyName" Then Response.Write
"selected" %> >CompanyName</option>
</select>
完成上面的修改之后,第三版的查询程序就大功告成了。相信通过三个查询范例的实例,可以让您完全的了解 ASP 的应用及 HTML 的编写技巧,让您在
ASP的设计功力上,又有大幅度的提升。
48
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件完整的第三版 ASP程序代码 (ch9-4.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key")
Sort = Request("Sort")Page = Clng(Request("Page"))
sql = "Select * from Customers"If Key > "" Then sql = sql + " order by " & Key
If Sort > "" Then sql = sql & " " & Sort
rs.open sql,conn,3,2rs.PageSize = 10 '每页显示记录数
If Page < 1 then Page = 1If page > rs.PageCount Then Page = rs.PageCount
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")%>
49
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<html>
<body>
<center>
<p>
<font face="Arial" size=5>SQL Server<br>
Northwind Database MultiPage Control Demo</font>
</p>
<form action="ch9-4.asp" method="post">
排序字段,
<select name="Key">
<option value="CustomerID"
<% If Key="CustomerID" Then Response.Write "selected" %>
>CustomerID</option>
<option value="CompanyName"
<% If Key="CompanyName" Then Response.Write "selected" %>
>CompanyName</option>
</select>
50
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
输出顺序,
<select name="Sort">
<option value="ASC"<% If Sort="ASC" Then Response.Write "selected" %>
>递增 </option><option value="DESC"
<% If Sort="DESC" Then Response.Write "selected" %>
>递减 </option></select>
<input type="submit" name="ok" value="确认 "></form>
</center>
<center><p>
<font face="Arial" size=5>SQL Server<br>Northwind Database MultiPage Control Demo</font>
</p>
<table border=0 cellpadding=0 cellspacing=1 width=96%>
51
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<%
Response.Write("<TR BGCOLOR=#ccccd7>")
Response.Write("<TD>CustomerID</TD>")Response.Write("<TD>CompanyName</TD>")
Response.Write("<TD>ContactName</TD>")Response.Write("<TD>ContactTitle</TD>")
Response.Write("<TD>City</TD>")
Response.Write("</TR>")For i = 1 to rs.PageSize
If rs.EOF Then Exit ForIf i mod 2=0 Then
Color = "#ddddd7"
ElseColor = "#eeeeef"
End IfResponse.Write("<TR BGCOLOR=" + Color + ">")
Response.Write("<TD>"+rs("CustomerID")+"</TD>")
Response.Write("<TD>"+rs("CompanyName")+"</TD>")
52
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
Response.Write("<TD>"+rs("ContactName")+"</TD>")
Response.Write("<TD>"+rs("ContactTitle")+"</TD>")
Response.Write("<TD>"+rs("City")+"</TD>")Response.Write("</TR>")
rs.MoveNext Next
%>
</table></center>
<%If rs.PageCount > 1 then
%>
<br><div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %>&Sort=<%=Sort%>&Key=<%=Key%>">
<img name="prev" border="0" src="prev.gif"
width="9" height="13"></a>
53
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i) + "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i))
+ "&Sort=" + Sort +"&Key="+Key+">
<Font color=" + color + ">" + Cstr(i) + "
</Font></a> "
End If
Next
%>
<a href="<%=MySelf%>?Page=
<%=(Page + 1)%>&Sort=<%=Sort%>&Key=<%=Key%>">
54
9.5 分页的技巧(三)
9.5.4 如何保存用户的查询条件
ch9-4.asp (续 )如下:
<img name="next" border="0" src="next.gif"
width="9" height="13"></a>
</div>
<%
ElseIf rs.PageCount < 1 then
response.Write "<div align='center'>
<font color=red>无相关数据 !!...</font></div>"
End If
%>
</body>
</html>
在看完这几节有关数据库查询的技巧之后,您有何感想? 或许您很难想像,光一个查询程序竟然就可以应用得这么复杂。
55
9.6 最新信息管理实际范例随着 Internet的盛行,许多公司 (不管是大公司还是小公司 )几乎都已经上网了。在网站上线以后,有许多公司通过网站来发布最新的产品信息,以强化公司的行销及网站的利用率。由于网页需要美工及企划人员,因此有很多公司都采用委托给外人的方式进行,但是忽略了网站设计的灵活性,例如将网站数据库化、组件化等。造成日后每次想在网站上发布最新信息时,都还要雇佣专业网络公司的人员来修改网页 (小修改就自己来 ),造成许多维护人力及制作成本的浪费。有鉴于此,笔者总结实践经验,以一个美观、精致又简单的小型系统 (最新信息管理系统 )程序,为读者示范 ASP的数据库应用技巧。
56
9.6 最新信息管理实际范例
9.6.1 范例说明
9.6.2 创建数据库
9.6.3 创建用户与信息表
9.6.4 开发过程说明
57
9.6 最新信息管理实际范例
9.6.1 范例说明假设 hlfjob的网站都已经 e化,并可以通过浏览器在远程
(Remote)管理网站。由于远程管理涉及安全问题,因此我们将最新信息的管理维护操作功能,仅开放给合法用户使用。
为了方便日后的管理,我们将用户基本数据及最新信息置于
SQL Server数据库中,并搭配 ASP程序设计以完成本系统的建置。
系统的需求定义如下:
● 用户登录 (身份验证 )
● 密码更改
● 最新信息管理 (添加、修改、删除及查询 )
根据上述的需求,我们定义的数据库结构如下:
( 1)数据库名称,WebDB
( 2)用户表,Users
( 3)最新信息表,News
58
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 1)进入企业管理器窗口,在左边的数据库选项上,按一下鼠标右键,点选“新建数据库”命令,如下图所示。
59
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 2)在数据库属性窗口中,请输入数据库名称 WebDB,数据库的默认值为 1 MB。当数据库使用空间超过 1 MB时,系统会以每次
10%的大小增长,单击 按钮,如下图所示。
60
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 3)数据库创建完成,系统自动回到管理画面,如下图所示。
61
9.6 最新信息管理实际范例
9.6.2 创建数据库操作步骤:
( 4)双击数据库选项,展开所有的 SQL Server数据库,找到
WebDB数据库,确定数据库已成功的创建,如下图所示。
62
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
Users表的定义如下图所示。
其中 uid为用户代号 (Userid的缩写 ),pwd为用户密码 (Password
的缩写 ),name则为用户中文姓名,三个字段都是变动长度的字符类型。
63
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 1)在企业管理器的表一览的窗口中,单击鼠标右键,点选“新建表”命令,如下图所示。
64
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 2)请输入 Users表的字段定义,如下图所示。
65
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 3)请点选 uid字段左边 (选取整列 ),然后单击“设置主键”的工具按钮,如下图 a所示。
( 4)请单击“保存”工具按钮,在“选择名称”对话框中,输入表名称,Users‖,然后单击 按钮,保存 Users表的相关定义,如下图 b所示。
图 a 图 b
66
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 5)关闭窗口,离开新建表操作。
( 6)点选 Users表,单击鼠标右键,点选“打开表 /返回所有行”
命令,如下图所示。
67
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表创建 Users表的步骤如下:
( 7)打开 SQL Server数据输入窗口,添加一条用户记录数据,在
uid,pwd及 name三个字段分别输入 admin,admin2000及系统管理员,以便进行下文的测试操作,如下图所示。
68
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
News表的定义如右图所示。
表 News共有 7个字段,NewsID为编号 (由系统自动产生 ),NewsIcon代表标题的图标 (请以 <img src=―图形文件名称,>表示 ),NewsSubject 为信息的标题,最长 64 个字符,信息内容
NewsContent为 ntext数据类型,可存放长篇大论的文字稿数据,startDate及 endDate则用以设置信息刊登的起止日期,配合 ASP程序可以做到时间信息自动发布,逾发布时间信息自动下线的自动化服务,至于 Userid及 CreateDate字段则分别记载此信息发布的人员及登录日期。
69
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
News表操作步骤:
( 1)在企业管理器 \表窗口中,单击鼠标右键,点选“新建表”命令。
( 2)请输入 News数据表的字段定义,如图 a所示。
( 3)请点选 NewsID字段左边 (选取整列 ),然后单击“设置主键”工具按钮,如图 b所示。
图 a 图 b
70
9.6 最新信息管理实际范例
9.6.3 创建用户与信息表
News表操作步骤:
( 4)在“选择名称”对话框中,输入表名称,News‖,然后单击按钮。保存 News表的相关定义,如下图所示。
( 5)关闭窗口,离开新建表操作。
说明,SQL Server有一种可每次增加某一固定数值的字段类型,
它的定义方式是点选“识别”的复选框,并定义识别的初始值及增量。例如初始值为 1,增量为 1,则数据添加时,字段的内容自动由
1起跳,每次加 1。 SQL Server还可定义字段的初值,例如本例中的
CreateDate,它的初值为 SQL Server提供的 getdate()函数,用以取得系统目前的日期。
71
9.6 最新信息管理实际范例
9.6.4 开发过程说明当数据库及相关表创建完成时,就可以开始 ASP程序的开发及测试操作了。下面是本范例的开发过程。
1,用户登录用户登录时必须输入两个字段,分别是用户 (uid)及密码 (pwd),
如下图所示。
72
9.6 最新信息管理实际范例
9.6.4 开发过程说明网页的源代码 (login.htm)如下:
<HTML>
<HEAD>
<style type="text/css">
<!--
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>登录 - Login</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html― charset="GB2312">
</HEAD>
73
9.6 最新信息管理实际范例
9.6.4 开发过程说明网页的源代码 login.htm (续 ),
<BODY bgcolor="#FFFFFF">
<form action="login.asp" method="post">
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF― bgcolor="#F2FDFD">
<tr>
<td colspan=4 align=―center‖ class=topic bgcolor=―#eaeaf4‖>Web管理中心 ─登录
(Login)</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 用户 (Userid) </td>
<td> <input type="text" name="uid" size="16" maxlength=16 value="">
</td>
</tr>
<tr bgcolor="#eaeaf4" class=small>
<td align=right> 密码 (Password) </td>
<td> <input type="password" name="pwd" size="16" maxlength=16
value=""> </td>
</tr>
74
9.6 最新信息管理实际范例
9.6.4 开发过程说明网页的源代码 login.htm (续 ),
<tr bgcolor="#ffefbf">
<td align=center colspan=2>
<input type="submit" value="登录 " name="send">
<input type="reset" value="重填 " name="clear">
</td>
</tr>
</table>
</form>
<p align=center class=small>
<a href="http://www.hlfjob.com.cn">首页 </a> |
<a href=" http://www.hlfjob.com.cn /newbook01.htm">最新书讯 </a> |
<a href=" http://www.hlfjob.com.cn /jiaoxue.htm">教学光盘 </a> |
<a href=" http://www.hlfjob.com.cn ">人才求职网 </a> |
<a href="mailto,service@hlfjob.com.cn ">服务信箱 </a>
</p>
</BODY>
</HTML>
75
9.6 最新信息管理实际范例
9.6.4 开发过程说明当用户输入相关信息,并单击 按钮后,login.htm
激活 login.asp,检查登录人员是否为合法用户,若通过身份确认系统会自动记录用户的 uid,pwd,name于
Session对象对应的对象变量,并以 Session("logined") =
True记录用户通过正常登录画面登录,最后进入系统管理画面 menu.asp;若用户及密码验证不正确,则画面继续停留于本网页。用户身份确认的 ASP程序代码
(login.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
76
9.6 最新信息管理实际范例
'验证登录者的身份
Function ValidPersonal(uid,pwd)
SQL = "SELECT uid,pwd,name FROM Users WHERE uid='" + uid
+ "' AND pwd='" + pwd + "'"
Set rs = Conn.Execute(SQL)
If rs.Eof Then
ValidPersonal = False
Else
ValidPersonal = True
End If
End Function
uid = Request("uid")
pwd = Request("pwd")
If ValidPersonal(uid,pwd) = True Then
9.6.4 开发过程说明
login.asp(续 ),
77
9.6 最新信息管理实际范例
Session("uid") = rs("uid")
' Session("uid") = 登录时输入的身份证号
Session("pwd") = rs("pwd")
' Session("pwd") = 登录时输入的密码
Session("name") = rs("name")
' Session("name") = 履历表中登录的姓名
Session("logined") = True
' Session("logined")= 记录会员已登录
Response.Redirect("menu.asp")
Else
Response.Redirect("login.htm")
End If
Set rs = Nothing
Set Conn = Nothing
%>
9.6.4 开发过程说明
login.asp(续 ),
78
9.6 最新信息管理实际范例
9.6.4 开发过程说明
2,系统管理当用户登录后,首先出现的是管理画面,如下图所示。
79
9.6 最新信息管理实际范例
9.6.4 开发过程说明该页面的程序代码 (menu.asp)为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>系统管理 </title>
</head>
<body>
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF"
bgcolor="#F2FDFD" width="100">
<tr height="40">
<td bgcolor=―#eaeaf4‖><p align=―center‖><font color=―#FF0000‖>系统管理
</font></p></td>
</tr>
80
9.6 最新信息管理实际范例
9.6.4 开发过程说明该页面的程序代码 menu.asp (续 )为:
<tr height="30">
<td bgcolor=―#ffefbf‖><p align=―center‖ ><a href=―chgpwd.htm‖>密码更改
</a></p></td>
</tr>
<tr height="30">
<td bgcolor=―#eaeaf4‖><p align=―center‖><a href=―NewsList.asp‖>最新信息
</a></p></td>
</tr>
<tr height="30">
<td bgcolor="#ffefbf"><p align="center">
<a href="mailto:dhs79@tjhldgz.com.cn">服务信箱 </a></p></td>
</tr>
</table>
</body>
</html>
81
9.6 最新信息管理实际范例
9.6.4 开发过程说明在系统管理画面中,我们提供密码更改、最新信息及服务信箱等三大功能,三大功能的网址如下:
( 1)密码更改 (chgpwd.htm)
( 2)最新信息 (NewsList.asp)
( 3)服务信箱 (mailto:dhs79@tjhldgz.com.cn)
82
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改为维护网站的安全,系统使用人员应定期更换密码,
以免密码遭到有心人士窃取使用。由于密码输入时都不会以明码显示 (以,●,字符代替 ),因此为了确保输入的正确性,通常密码更改时需输入原密码 (pwd)、新密码
(pwd1)及再输入一次新密码 (pwd2)等三个字段,在原密码正确及两次新密码一致的情况下,系统才会进行密码更改操作。密码更改的画面如下页图所示。
83
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改
84
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 (chgpwd.htm)如下:
<HTML>
<HEAD>
<style type="text/css">
<!--
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>密码更改 </TITLE>
85
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 chgpwd.htm (续 )如下:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html"
charset="GB2312">
</HEAD>
<BODY bgcolor="#FFFFFF">
<form action="chgpwd.asp" method="post">
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF" bgcolor="#F2FDFD">
<tr>
<td colspan=4 align="center" class=topic bgcolor="#eaeaf4">密码更改 </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 原密码 (Password) </td>
<td> <input type="password" name="pwd" size="16"
maxlength=16 value=""> </td>
</tr>
86
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 chgpwd.htm (续 )如下:
<tr bgcolor="#eaeaf4" class=small>
<td align=right> 新密码 (Password) </td>
<td> <input type="password" name="pwd1" size="16"
maxlength=16 value=""> </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 再输入一次新密码 (Password) </td>
<td> <input type="password" name="pwd2" size="16"
maxlength=16 value=""> </td>
</tr>
<tr bgcolor="#ffefbf">
<td align=center colspan=2>
<input type="submit" value="送出 " name="send">
<input type="reset" value="重填 " name="clear">
</td>
87
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改更改密码的网页源代码 chgpwd.htm (续 )如下:
</tr>
</table>
</form>
<p align=center class=small>
<a href="http://www,hlfjob.com.cn">首页 </a> |
<a href="http://www,hlfjob.com.cn /newbook01.htm">最新书讯 </a> |
<a href="http://www,hlfjob.com.cn /cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn ">人才求职网 </a> |
<a href="mailto:service@ hlfjob.com.cn ">服务信箱 </a>
</p>
</BODY>
</HTML>
88
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改当用户输入密码更改相关信息,并单击 按钮后,
chgpwd.htm首先启动 chgpwd.asp程序,并进行原密码是否正确及两次新密码一致的判断,在正确无误后才进行数据库用户的密码更改操作。密码更改操作的 ASP原始程序代码 (chgpwd.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
'密码更改函数 Passwd
Function Passwd(pwd1,pwd2)
On Error Resume Next
If pwd1 = pwd2 Then
SQL = "UPDATE Users SET pwd = '" + pwd1 + "'
89
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改密码更改操作的程序代码 chgpwd.asp (续 )如下:
WHERE uid='" + Session("uid") + "'"
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Passwd = True
Else
Passwd = False
End If
Else
Passwd = False
End If
End Function
'旧密码相同,且两次新密码一致
If Session("pwd")=Request("pwd") and
Request("pwd1")=Request("pwd2") Then
'将数据库中的密码改为新密码
90
9.6 最新信息管理实际范例
9.6.4 开发过程说明
3,密码更改密码更改操作的程序代码 chgpwd.asp (续 )如下:
If Passwd(Request("pwd1"),Request("pwd2")) = True Then
Result = True
Else
Result = False
End If
Else
Result = False
End If
If Result = True Then
Response.Redirect("login.htm") ' 更改密码后重新登录
Else
Response.Redirect("chgpwd.htm") ' 密码更改失败,画面停留原处
End If
Set rs = nothing
Set Conn = nothing
%>
密码更改成功后,画面会自动切换至 login.htm
的登录画面,要求用户以新密码登录系统。
91
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息当用户点选最新信息,进入信息浏览画面
(NewsList.asp),如下图所示。
92
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息在本程序中,我们使用信息刊登起日为排序的依据,
后刊登的信息于输出时排在前面,越早刊登的信息则越排在后面,以符合最新信息的灵活性。因此我们对数据库所下的 SQL命令如下:
SELECT * FROM News ORDER BY startDate DESC
最新信息一览的 ASP程序代码 (NewsList.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
93
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from News order by startDate DESC"
rs.open sql,conn,3,2
rs.PageSize = 8 '每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")
%>
<html>
<head>
<style type="text/css">
<!--
94
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
a:link {color:#0F56A3; font-style:normal; cursor:hand; text-decoration:normal}
a:visited {color:#0F56A3; font-style:normal; text-decoration:normal}
a:active {color:#0F56A3; font-style:normal; text-decoration:normal}
a:hover {color:#CC0000; font-style:bold; text-decoration:none}
-->
</style>
<title>最新信息 </title>
<meta http-equiv="Content-Type" content="text/html" charset="GB2312">
</head>
<body>
<table border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#dfdfdf" bordercolordark="#ffffff" align="center">
<tr bgcolor="#cccce6">
<td align="center" class="topic" colspan="6" >最新信息一览 </td>
95
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
</tr>
<tr bgcolor="#ffefbf" class="small">
<td width="32">No#</td>
<td width="32">图标 </td>
<td width="260">标题 </td>
<td width="64">刊登起日 </td>
<td width="64">刊登止日 </td>
<td width="24">动作 </td>
</tr>
<%
For i = 1 to rs.PageSize
If rs.EOF Then Exit For
%>
<tr bgcolor="#bdf3eb" class="small">
<td><%=rs("NewsID")%></td>
<td><%=rs("NewsIcon")%></td>
96
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
<td><a href="EditNews.asp?NewsID=<%=rs("NewsID")%>">
<%=rs("NewsSubject")%></a></td>
<td><%=rs("StartDate")%></td>
<td><%=rs("EndDate")%></td>
<td><a href="DelNews.asp?NewsID=<%=rs("NewsID")%>">删除 </a></td>
</tr>
<%
rs.MoveNext
Next
%>
<tr bgcolor="#eaeaf4" class="small">
<td colspan=6 align=center><a href="addNews.htm">
输入最新信息 </a></td>
</tr>
</table>
<%
97
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
If rs.PageCount > 1 then
%><br>
<div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %> &Sort=<%=Sort%>&
Key=<%=Key%>"> <img name="prev" border="0" src="prev.gif"
width="15" height="16"></a>
<%
For i = 1 to rs.PageCount
If i = Page then
color = "Red"
response.write " <Font color=" + color + ">" + Cstr(i)+ "</Font> "
Else
color = "Black"
response.write " <a href=" + MySelf + "?Page=" + Cstr((i)) + "><Font color="
+ color + ">" + Cstr(i) + "</Font></a> ―
Next
98
9.6 最新信息管理实际范例
9.6.4 开发过程说明
4,最新信息最新信息一览的 ASP程序代码 NewsList.asp (续 )如下:
%>
<a href="<%=MySelf%>?Page= <%=(Page + 1)%>&Sort=<%=Sort%>&
Key=<%=Key%>"> <img name="next" border="0" src="next.gif" width="15"
height="16"></a>
</div>
<%
End If
%><br>
<p align=center class=small>
<a href="http://www.hlfjob.com.cn ">首页 </a> |
<a href="http://www.hlfjob.com.cn/newbook01.htm">最新书讯 </a> |
<a href="http://www.hlfjob.com.cn/cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn">人才求职网 </a> |
<a href="mailto:service@hlfjob.com.cn">服务信箱 </a>
</p>
</body></html>
在本范例中,由于是第一次使用,系统尚未有最新信息的公告。您可以点选表格下方的输入最新信息,以进入最新信息 —添加画面。
99
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加最新信息的数据库字段共有 7个,
其中 Userid 由程序自动填入登录的用户名称,CreateDate字段则由 SQL
Server自动填入系统日期 (程序中不要对该字段设初值,SQL Server会自动依据字段的设置填入系统日期 ),至于其他 5个字段则必须由管理人员输入。
输入时也可以输入 HTML的标记,这些标记都可以正常的发挥原先的功能显示,例如超级链接、字体设置、字体大小、字体颜色等,让您的网站内容更加生动活泼。下面是最新信息 ——添加的范例,如右图所示。
10
0
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 (addNews.htm)如下:
<HTML>
<HEAD>
<style type="text/css">
<!--
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input,textarea { font-family,"宋体 "; font-size,9pt;
vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>最新信息 ─添加 </TITLE>
101
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html"
charset="GB2312">
</HEAD>
<BODY bgcolor="#FFFFFF">
<form action="addnews.asp" method="post">
<table align=center border="1" cellspacing="0" cellpadding="1" bordercolorlight
="#CCCCCC" bordercolordark="#FFFFFF" bgcolor="#F2FDFD">
<tr>
<td colspan=4 align=―center‖ class=topic bgcolor=―#eaeaf4‖>最新信息 ─添加
</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息图标 </td>
<td> <input type="text" name="NewsIcon" size="66" maxlength="48">
</td>
</tr>
10
2
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息标题 </td>
<td> <input type="text" name="NewsSubject" size="66"
maxlength="64" > </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息内容 </td>
<td> <textarea name="NewsContent" rows="6"
cols="64"></textarea></td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 刊登起日 </td>
<td> <input type="text" name="startDate" size="10"
maxlength="10"> 格式,yyyy/mm/dd</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
10
3
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<td align=right> 刊登止日 </td>
<td> <input type="text" name="endDate" size="10"
maxlength="10"> 格式,yyyy/mm/dd</td>
</tr>
<tr bgcolor="#e0dcc3">
<td align=center colspan=2> <%=Err.Description%> </td>
</tr>
<tr bgcolor="#ffefbf">
<td align=center colspan=2>
<input type="submit" value="送出 " name="send">
<input type="reset" value="重填 " name="clear">
</td>
</tr>
</table>
</form>
10
4
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加添加信息的网页源代码 addNews.htm (续 )如下:
<p align=center class=small>
<a href="http://www.hlfjob.com.cn">首页 </a> |
<a href="http://www.hlfjob.com.cn/newbook01.htm">最新书讯 </a> |
<a href= "http://www.hlfjob.com.cn/cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn">人才求职网 </a> |
<a href="mailto:service@hlfjob.com.cn">服务信箱 </a>
</p>
</BODY>
</HTML>
10
5
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加当信息添加完毕以后,按 按钮,如下图所示。
10
6
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加随后写入的信息将传值给添加信息的 ASP程序代码
(addnews.asp),代码如下:
<%
If Session("logined") <> True Then
Response.Redirect("Login.htm")
End If
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL
Server};Database=WebDB;Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
rs.open "News",Conn,3,2
rs.AddNew
rs("NewsIcon") = Request("NewsIcon")
rs("NewsSubject") = Request("NewsSubject")
rs("NewsContent") = Request("NewsContent")
107
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加
addnews.asp (续 ),
rs("startDate") = Request("startDate")
rs("endDate") = Request("endDate")
rs("Userid") = Session("uid")
'On Error Resume Next
rs.Update
If Err.Number > 0 Then
Else
Set rs = Nothing
Set Conn = Nothing
Response.Redirect("NewsList.asp")
End If
%>
10
8
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——添加
addnews.asp将数据写入数据库后系统自动回到“最新信息一览”画面,将先前添加的信息显示出来,我们可以看到连标题的图标都可以正常显示,如下图所示。
10
9
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正最新信息输入以后,若发觉有错字或有更好的表达方式,我们还可以直接于本系统中修改。完全不用外包给厂商维护,当然可节省大量的人力维护成本。维护数据的方式是,直接点选标题进入信息编辑状态,如下图所示。
110
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正最新信息 ——更正的源代码 (EditNews.asp)如下:
<%
If Session("logined") <> True Then
Response.Redirect("Login.htm")
End If
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL
Server};Database=WebDB;Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "Select * from News where NewsID=" & Request("NewsID")
rs.open sql,conn,3,2
%>
<HTML>
<HEAD>
<style type="text/css">
<!--
111
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
input,textarea { font-family,"宋体 "; font-size,9pt;
vertical-align,middle; line-height:12pt;}
a:link {color:#0F56A3;font-style:normal;cursor:hand;text-decoration:normal}
a:visited {color:#0F56A3;font-style:normal;text-decoration:normal}
a:active {color:#0F56A3;font-style:normal;text-decoration:normal}
a:hover {color:#CC0000;font-style:bold;text-decoration:none}
-->
</style>
<TITLE>最新信息 ─更正 </TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html"
charset="GB2312">
</HEAD>
<BODY bgcolor="#FFFFFF">
<form action="UpdNews.asp" method="post">
112
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
<input type="hidden" name="NewsID" value="<%=Request("NewsID")%>">
<table align=center border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF" bgcolor="#F2FDFD">
<tr>
<td colspan=4 align=―center‖ class=topic bgcolor=―#eaeaf4‖>最新信息 ─更正
</td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息图标 </td>
<td> <input type="text" name="NewsIcon" size="66" maxlength="48"
value="<%=Server.HTMLEncode(rs("NewsIcon"))%>"> </td>
</tr>
<tr bgcolor="#bdf3eb" class=small>
<td align=right> 信息标题 </td>
<td> <input type="text" name="NewsSubject" size="66" maxlength="64"
value="<%=rs("NewsSubject")%>"> </td>
113
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
</tr>
<tr bgcolor="#bdf3eb" class=small> <td align=right> 信息内容 </td>
<td> <textarea name="NewsContent" rows="6"
cols="64"><%=rs("NewsContent")%></textarea></td> </tr>
<tr bgcolor="#bdf3eb" class=small> <td align=right> 刊登起日 </td>
<td> <input type="text" name="startDate" size="10" maxlength="10"
value="<%=rs("startDate")%>"> 格式,yyyy/mm/dd</td> </tr>
<tr bgcolor="#bdf3eb" class=small> <td align=right> 刊登止日 </td>
<td> <input type="text" name="endDate" size="10" maxlength="10"
value="<%=rs("endDate")%>"> 格式,yyyy/mm/dd</td> </tr>
<tr bgcolor="#ffefbf">
114
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正
EditNews.asp (续 )如下:
<td align=center colspan=2><input type="submit" value="送出 " name="send">
<input type="reset" value="重填 " name="clear"> </td> </tr>
</table>
</form><p align=center class=small>
<a href="http://www.hlfjob.com.cn">首页 </a> |<a href="http://www.hlfjob.com.cn/newbook01.htm">最新书讯 </a> |
<a href="http://www.hlfjob.com.cn/cdmenu01.htm">教学光盘 </a> |
<a href="http://www.hlfjob.com.cn">人才求职网 </a> |<a href="mailto:service@hlfjob.com.cn">服务信箱 </a>
</p><%
Set rs = Nothing
Set Conn = Nothing%>
</BODY>
</HTML>
115
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正说明:在本画面中,由于信息图标的字段值为 <img
src="tb.jpg">,会造成输入框因字段内容有双引号,无法正常显示的情形。因此必须使用 Server.HTMLEncode将 rs("NewsIcon")的内容编码,以避开这一问题点。
修改后,点选 按钮,传值给 UpdNews.asp更新信息,如下图所示。
116
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正更新信息源代码 (UpdNews.asp)如下:
<%
NewsIcon=request("NewsIcon")
NewsSubject=request("NewsSubject")
NewsContent=request("NewsContent")
startDate=request("startDate")
endDate=request("endDate")
NewsId=request("NewsId")
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};
Database=WebDB;Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
117
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正更新信息源代码 UpdNews.asp (续 )如下:
response.write request("NewsId")
sql="UpDate News set NewsIcon='"& NewsIcon & "',NewsSubject='"&
NewsSubject & "',NewsContent='"& NewsContent & "',startDate='"& startDate &
"',endDate='"& endDate & "' where NewsId='"&NewsId&"'"
rs.open sql,conn,3,2
Set rs = Nothing
Set Conn = Nothing
%>
<body>
<br>
<P align=center><FONT color=red face=宋体 size=5>
<strong>修改正确 !</strong> </FONT>
</body>
118
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——更正更新后页面出现修改的,NewsId‖ 号和,修改正确 !,等字样,如下图所示 。
119
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——删除最新信息虽然具有自动刊登及自动下线的功能,但是日子一久,
数据库累积的数据量会很大 (程序会自动以每页 10条记录的方式分页处理 )。我们也可以将过时的信息删除,删除的方式是点选每一条信息后面的超级链接“删除” (注意:此删除动作为立即执行,下手后就不能反悔了,请三思而行! )。删除的超级链接如下:
<a href="DelNews.asp?NewsID=<%=rs("NewsID")%>">删除 </a>
在删除的超级链接中,我们将信息编号以参数的方式传给
DelNews.asp程序。当用户点选“删除”后,DelNews.asp会根据参数
Request("NewsID")的值,删除数据库该记录信息的数据,并自动回到最新信息一览画面。
12
0
9.6 最新信息管理实际范例
9.6.4 开发过程说明
● 最新信息 ——删除删除信息的 ASP程序源代码 (DelNews.asp)如下:
<%
If Session("logined") <> True Then
Response.Redirect("Login.htm")
End If
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
SQL = "DELETE FROM News WHERE NewsID=" & Request("NewsID")
rs.open SQL,Conn,3,2
Set rs = Nothing
Set Conn = Nothing
Response.Redirect("NewsList.asp")
%>
121
9.6 最新信息管理实际范例
9.6.4 开发过程说明
5,服务信箱服务信箱是通过 HTML的 <a>标记来完成的,它的用法如下:
<a href=―mailto:service@hlfjob.com.cn?subject=[book] 网页制作高手 ">服务信箱 </a>
其中,mailto:‖ 用以告诉浏览器启动系统默认的电子邮件软件,并将后面的电子邮件账号带入收件人字段,
而,?‖为电子邮件与参数间的分隔字符,,subject‖为信件标题的字段名称,,=‖号后面则为字段的值。当我们按下服务信箱之后,系统自动启动默认的电子邮件软件
(例如 Outlook Express),如下页图所示。
122
9.6 最新信息管理实际范例
9.6.4 开发过程说明
5,服务信箱由上面我们可以看到,收件人及主题均被自动填上对应的值,而免除用户需再度输入的问题。
12
3
9.6 最新信息管理实际范例
9.6.4 开发过程说明当数据都准备就绪以后,网友通过浏览器上 hlfjob
网站,就可以看到最新信息了。在本例中,网友看到的
Page为 News.asp,如下图所示。
124
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=WebDB;
Server=(Local);uid=sa;pwd="
Set rs = Server.CreateObject("ADODB.Recordset")
Key = Request("Key")
Sort = Request("Sort")
Page = Clng(Request("Page"))
sql = "Select * from News order by startDate DESC"
rs.open sql,conn,3,2
rs.PageSize =8?每页显示记录数
If Page < 1 then Page = 1
If page > rs.PageCount Then Page = rs.PageCount
12
5
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
If rs.PageCount > 0 then rs.AbsolutePage = Page
MySelf = Request.ServerVariables("PATH_INFO")
%>
<html>
<head>
<style type="text/css">
<!--
.small { font-family,"宋体 "; font-size,9pt; vertical-align,middle; line-height:16pt;}
.topic { font-family,"宋体 "; font-size,11pt; vertical-align,middle; line-height:16pt;}
a:link {color:#0F56A3; font-style:normal; cursor:hand; text-decoration:normal}
a:visited {color:#0F56A3; font-style:normal; text-decoration:normal}
a:active {color:#0F56A3; font-style:normal; text-decoration:normal}
a:hover {color:#CC0000; font-style:bold; text-decoration:none}
-->
</style>
<title>最新信息 </title>
<meta http-equiv="Content-Type" content="text/html" charset="GB2312">
12
6
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
</head>
<body><table border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#dfdfdf" bordercolordark="#ffffff" align="center">
<tr bgcolor="#cccce6"><td align="center" class="topic" colspan="4">最新信息 </td>
</tr> <tr bgcolor="#e0dcc3" class="small">
<td width="345">标题 </td>
<td width="66">刊登起日 </td> <td width="66">刊登止日 </td>
</tr> <%
For i = 1 to rs.PageSize
If rs.EOF Then Exit For%>
<tr bgcolor="#c8e3e3" class="small">
<td><%=rs("NewsIcon")%> <%=rs("NewsSubject")%></td>
127
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
<td><%=rs("StartDate")%></td>
<td><%=rs("EndDate")%></td></tr>
<tr bgcolor="#ffefbf" class="small">
<td colspan=3><%=rs("NewsContent")%></td></tr>
<%rs.MoveNext
Next
If rs.PageCount > 1 then%>
</table><br><div align="center">
<a href="<%=MySelf%>?Page=<% =(Page - 1) %> &Sort=<%=Sort%>&
Key=<%=Key%>"><img name="prev" border="0" src="prev.gif"width="15" height="16"></a>
<%
For i = 1 to rs.PageCount
12
8
9.6 最新信息管理实际范例
9.6.4 开发过程说明
News.asp的原始程序代码 (续 )如下:
If i = Page then
color = "Red"response.write " <Font color=" + color + ">" + Cstr(i)+ "</Font> "
Else
color = "Black"response.write " <a href=" + MySelf + "?Page=" + Cstr((i)) + "><Font color="
+ color + ">" + Cstr(i) + "</Font></a> "End If
Next
%> <a href="<%=MySelf%>?Page= <%=(Page + 1)%>&Sort=<%=Sort%>&Key=
<%=Key%>"><img name="next" border="0" src="next.gif" width="15―height="16"></a>
</div>
<%End If
%></body>
</html>
12
9
9.6 最新信息管理实际范例
9.6.4 开发过程说明由于最新信息为公开的信息,所以并没有纳入上述的网站管理项目之中。
说明:由于笔者相当了解 HTML,因此可利用
HTML实现许多功能上的变化,让系统变得简单又不失其灵活性,这也是本书为何要介绍 HTML的用意。
13
0
第 9章 数据库查询的技巧本章以 SQL Server 2000 内置的,北风 (Northwind)
数据库”为基础,向读者介绍了如何开发数据库查询程序、数据分页的技巧、动态数据库查询、数据库查找对比的技巧等,让您真正了解 SQL Server 2000在网站方面的运用。
131
第 9章 数据库查询的技巧
习题
1,请以北风数据库中的 Employees制作多页 (Multi-Page)
的查询程序。
2,请以北风数据库中的 Employees制作第三种查询程序,条件的个数及展现方式请自由发挥。
3,读者可自行修改管理程序,增加最新信息预览的功能
(调用 News.asp),让管理程序更为完整。
4,请读者自行练习编写用户管理程序,并加入最新信息的管理程序界面之中,当然您可以增加用户记载的信息,让用户的功能更齐全,例如权限的设置,让管理程序功能日渐完备。