第 8章 ASP与 SQL Server
ASP动态网页设计教程
2
第 8章 ASP与 SQL Server
目前世界上著名的关系型数据库 (RDBMS)包括 Oracle,Informix、
Sybase,SQL Server 及 Interbase等。在这么多的数据库中,到底我们该选择哪一种作为 Web 数据库呢? 不用怀疑,SQL Server 绝对是
Windows NT平台上与 ASP最好配的组合,毕竟有谁能“比微软更了解微软”。
SQL Server 是微软惟一的服务器 /客户结构 (Client/Server)数据库产品。在互联网蓬勃发展的今天,数据库扮演着储存交易数据的重要角色。或许您会认为 SQL Server很复杂,但是在微软提供的数据库管理工具包装下,让数据库管理员的工作减轻许多,因此拉近了数据库管理员与 SQL Server 的距离,也从此让 SQL Server成为
Windows NT平台上最受欢迎的数据库。
3
第 8章 ASP与 SQL Server
目前,较著名的关系型数据库产品中,Oracle为全球最大的数据库软件公司,其数据库产品 Oracle为全球数据库最大品牌,而微软的 SQL Server则是 Windows NT平台上占有率最高的数据库产品,
它与 Sybase数据库是同卵双胞胎的产品 (微软与 Sybase合作后取得数据库技术 )。因此在过去 SQL Server 7.0 版以前,通过 Sybase的数据库驱动程序 DB-Library也可以访问 SQL Server。前些年由于微软已能自行控制 SQL Server,所以 SQL Server与 Sybase已渐行渐远,
逐渐摆脱 Sybase的影子而自成一格。特别是微软的 SQL Server
2000问世以来,Microsoft SQL Server 2000 扩展了 Microsoft SQL
Server 7.0 版的性能、可靠性、质量和易用性,增加了几种新的功能,由此成为大规模联机事务处理 (OLTP)、数据仓库和电子商务应用程序的优秀数据库平台。
4
第 8章 ASP与 SQL Server
8.1 数据库驱动程序
8.2 数据库访问标准 —ODBC
8.3 访问 SQL Server数据库
8.4 数据库基本操作
8.5 注册成为会员
8.6 如何将文本文件导入 SQL Server 2000
数据库
8.7 如何将 SQL Server 2000的数据转到文本文件
5
8.1 数据库驱动程序所谓数据库驱动程序 (Database Driver),就是数据库厂商或系统提供者针对特定的数据库系统所开发的一组程序,应用软件通过此程序可以访问数据库的数据,这一组程序我们就称为数据库驱动程序。
一般数据库发展厂商均会随数据库产品附赠数据库驱动程序。原厂提供的数据库驱动程序,我们称为原始的数据库驱动程序 (Native Database Driver)。由于数据库厂商最了解自己的数据库产品,因此原始的数据库驱动程序的执行效率通常会比其他厂商提供的产品更好。
6
8.2 数据库访问标准 —ODBC
如果您使用过像 dBase,FoxPro,Parsdox或 Access等数据库产品的话,相信您会知道每一种数据库的结构不尽相同,因此访问数据库的驱动程序也不一样。例如 Oracle采用 SQL*Net; SQL Server
采用 DB Library; Informix则有 Informix-Client等,如下图所示。因为数据库的驱动程序都不相同,造成软件开发厂商必须针对不同的数据库,发展不同的软件版本,因此也阻碍了应用程序的发展。
7
8.2 数据库访问标准 —ODBC
为了解决数据库驱动程序的问题,Microsoft制定了一套开放式数据库连接标准,称为 Open DataBase Connectivity,ODBC。数据库厂商或驱动程序发展厂商,只要遵循 ODBC的规格提供数据库驱动程序 (如,Oracle ODBC驱动程序,Informix ODBC驱动程序 ),应用程序就可以在不用修改的状况下,通过标准的 ODBC
数据库驱动程序的 API,访问不同的数据库产品,如下图所示。
8
8.2 数据库访问标准 —ODBC
未来当应用程序连接的数据库不一样时 (例如由
Oracle改为 SQL Server),我们只要更换 ODBC数据库驱动程序,就可以连接不同的数据库,如下图所示。
9
8.3 访问 SQL Server数据库
SQL Server为 Microsoft服务器 /客户 (Client/Server)
结构的数据库产品。它非常适用于发展互联网的数据库应用程序,是目前 Windows平台上最好的数据库产品。由于服务器架构的 Client端分布在不同的办公室,
因此安全更加显得格外的重要。为防止非法的用户闯入数据库进行不当的访问,一般数据库管理系统
(DataBase Management System,DBMS) 均提供完整的安全认证机制,包括联机时的登录 (Login)程序以及权限的划分等。只有经过合法授权的用户才能访问数据库的数据,而授予数据库权限的管理人员,我们称为数据库管理员 (DataBase Administrator,简称 DBA)。
10
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
8.3.2 调用 Connection对象的 Execute方法创建 RecordSet对象
8.3.3 RecordSet对象
8.3.4 Field对象
8.3.5 Fields对象
8.3.6 RecordSet的方法及属性
11
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
要连接至 SQL Server必须经过登录 (Login)的程序,才能使用
SQL Server数据库的数据。然而在 ASP中要如何才能连上 SQL
Server呢? 答案很简单,首先我们必须创建与 SQL Server的联机 (使用 Connection对象 ),连接的方式如下:
Set Conn = Server.CreateObject("ADODB.Connection")
其中 Conn即为连接 SQL Server的 Connection对象。在创建
Connection对象之后,我们可以使用 Connection对象的 Open方法打开指定的 SQL Server数据库,其用法如下:
Conn.Open"DRIVER={SQL Server};Database=dbname;
Server=(local);uid=userid;pwd=password"
12
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
由于我们要打开的数据库为 SQL Server,所以在 Open的参数必须指定打开 SQL Server数据库的相关信息,参数与参数之间以分号隔开。相关参数的说明如下:
● DRIVER={SQL Server}:指定访问数据库的驱动程序名称 (SQL
Server)。
● Database=dbname,dbname为 SQL Server上存在的数据库名称,例如北风数据库 (Northwind),该数据库为 SQL Server 2000系统数据库。
● Server=(Local):用来指定数据库所在的机器地址,通常为 IP
Address,例如,Server= 168.95.3.112。
说明:若为了成本考虑,我们将 SQL Server与 Web Server置于同一部机器,则此处可以写成 Server=(Local)。
13
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
● Uid=userid:用以指定连接至 SQL Server的用户名称,此用户必须为合法的 SQL Server数据库用户。例如 SQL Server的数据库管理员
SA(System Administrator)。
● Pwd=password:此处须填写登录数据库的用户密码 (注意密码的大小写 )。
说明:基于安全上的考虑,我们并不建议您使用 SA作为登录
SQL Server数据库的用户账号。
14
8.3 访问 SQL Server数据库
8.3.2 调用 Connection对象的 Execute方法创建 RecordSet对象关系型数据库在访问数据库时并非以传统的记录
(Record) 方式处理,取而代之的是数据集 (RecordSet)
的概念。因此,要处理 SQL Server 数据库,光是使用
Conn.Open 打开数据库还是不够的,我们必须要创建
RecordSet 的对象,方能进行数据库的访问。创建
RecordSet的方式如下:
Set rs = Conn.Execute("Customers")
15
8.3 访问 SQL Server数据库
8.3.2 调用 Connection对象的 Execute方法创建 RecordSet对象
Conn.Open 用以打开与数据库的连线操作。要访问数据库则必须通过 RecordSet 对象。创建 RecordSet
有多种不同的方法,主要看用途而定。通常
Conn.Execute的参数为 SQL Command,但是在对表的添加操作时,参数值为表的名称。在本例中我们打开北风数据库 Northwind中的 Customers表,并传回
RecordSet对象给变量 rs。
16
8.3 访问 SQL Server数据库
8.3.3 RecordSet对象关系型数据库中表的结构,可以把它看成是 Excel
电子表格的外观,它是由列 (Column)与行 (Row)所组成的。其中列 (Column)的部分,为数据库的字段 (Field);
行 (Row) 则称为记录 (Record) ;相关记录所组成的集合,称为数据集
(RecordSet);而所有记录所成的集合则称为表
(Table),如右图所示。
17
8.3 访问 SQL Server数据库
8.3.4 Field对象字段 (Field)在关系型数据库中称为 Column,它是数据库中最小的数据单位。在 ADO对象中,字段对应的对象为 Field,它有以下三个属性,如下表所示。
属性 (property) 说 明
Name 字段名称
Value 字段的值 (内容 )
Type 字段数据类型 (数值类型 )
18
8.3 访问 SQL Server数据库
8.3.5 Fields对象
Fields对象为 Field对象所成的集合 (集合对象 ),它是以对象数组的方式存在,数组中每一个元素我们可以看成是单一的 Field对象。
至于 Fields集合对象的个数,我们可以利用 Count属性得知。下面是我们利用 SQL Server北风数据库中的 Customers表,取得 Customers的字段个数及第一条数据的 ASP范例程序 (ch8-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 = "Customers"
rs.open SQL,conn,3,2
Response.Write("Database,Northwind<br>")
Response.Write("Table,Customers<br>")
Response.Write("<table border=1>")
Response.Write("<tr bgcolor=#ffccee>")
Response.Write("<td align='center'>字段名称 </td>")
19
8.3 访问 SQL Server数据库
8.3.5 Fields对象
ch8-1.asp (续 ):
Response.Write("<td align='center'>数据类型 </td>")Response.Write("<td align='center'>字段值 </td>")
Response.Write("</tr>")
For i=0 to rs.Fields.Count - 1Response.Write("<tr>")
Response.Write("<td>" & rs.Fields(i).Name & "</td>")Select Case rs.Fields(i).type
Case 130
Response.Write("<td>nchar</td>")Case 202
Response.Write("<td>nvarchar</td>")End Select
Response.Write("<td>" & rs.Fields(i).Value & " </td>")
Response.Write("</tr>")Next
Response.Write("</table>")Set rs = Nothing
Set Conn = Nothing
%>
20
8.3 访问 SQL Server数据库
8.3.5 Fields对象此 ASP范例程序的输出画面如下图所示。
21
8.3 访问 SQL Server数据库
8.3.6 RecordSet的方法及属性使用 SQL访问关系型数据库,后端的数据库对于查询的结果是以 RecordSet的形式存在于内存中。但是,对于前端的应用程序而言,数据的访问还是 Record by
Record的访问方式。因此,RecordSet对象提供许多数据的访问方法,其说明如下表所示。
方 法 说 明
MoveFirst 将记录移至第一条
MoveLast 将记录移至最后一条
MoveNext 将记录移至下一条
MovePrevious 将记录移至上一条
22
8.3 访问 SQL Server数据库
8.3.6 RecordSet的方法及属性
RecordSet 对象除了提供上述的方法以外,另外也配合数据库的访问,提供了三个有用的属性,其功能说明如下表所示。
方 法 说 明
BOF 判断数据是否移过了第一条 (begin of file)
EOF 判断数据是否移过了最后一条 (end of file)
AbsolutePosition
=n
将记录移至第 n条 (适用于随机数抽奖或由试题数据库中随机数选取 20 题出来测试时使用 )
23
8.4 数据库基本操作数据库的操作不外乎添加 (INSERT)、修改
(UPDATE)、删除 (DELETE)、及查询 (SELECT)等四大功能。通常要访问 SQL数据库 (关系型数据库 )您必须熟悉 SQL 语言,否则势必会遇上许多的困难。但若您是使用 Microsoft 的 ASP 搭配 SQL Server 来开发
Web数据库应用程序,那么就可以使用 Microsoft 的数据库对象 (ADO) 来简化数据库的访问操作,大幅度地降低数据库的使用门槛。建议您最好也具备
SQL 的基础,因为有许多 SQL的特性用 Microsoft 的数据库对象是无法完成的。
24
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
8.4.2 利用 SQL Command访问 SQL Server
25
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作下面我们将针对 SQL Server的添加、修改、删除、
及查询等四大操作,利用 RecordSet对象示范如何访问
SQL Server。
1,添加在数据库中添加一条数据,必须使用 AddNew方法添加一条记录,然后再设置各字段的值,最后再调用
Update方法,将数据添加到数据库中。
ASP的程序代码 (ch8-2.asp)见下页:
26
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
<%
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 = "Customers"
rs.open SQL,conn,3,2
rs.AddNew
rs("CustomerID") = "海河 "
rs("CompanyName") = "海河摄影艺术会 "
rs("ContactName") = "高笑明 "
rs("ContactTitle") = "摄影记者 "
rs("City") = "天津 "
rs.Update
Set rs = Nothing
Set Conn = Nothing
%>
Insert complete.
说明:在 SQL Server中有一种特殊的数值字段,它具有自动增加某固定值 (例如每次加 1)的功能 (类似产生流水号 ),切记此种字段在添加时,不须特别指定该字段的值,因为系统会自动赋予字段应有的值。数据库字段若有默认值,
使用本操作时字段的值将被初始化,因此可能会导致默认值发生错误的情况。
27
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
2,修改要修改 SQL Server中的数据,首先我们必须先找出该条记录,在确认数据无误后,更新表相关字段内容之后,使用 Update方法将修改后的数据写回数据库。
更正数据的 ASP程序代码范例 (ch8-3.asp)见下页:
28
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
<%
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 WHERE CustomerID='ALFKI'"
rs.open SQL,conn,3,2
if not rs.Eof Then
rs("City") = "柏林 (Berlin)"
rs.Update
End If
Set rs = Nothing
Set Conn = Nothing
%>
Update complete.
29
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
3,删除将数据库中无用的数据删除,以免占用数据库的空间。删除数据的范例 (ch8-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")
SQL = "SELECT * FROM Customers WHERE CustomerID='海河 '"
rs.open SQL,conn,3,2
If not rs.Eof Then
rs.Delete
Response.Write("Delete complete.")
Else
Response.Write("Record not found !")
End If
Set rs = Nothing
Set Conn = Nothing
%>
30
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
4,查询在数据库的 SQL Command中,查询 (SELECT)的语法是最复杂的。它可以变化的地方最多,应用的层面也最为广泛,其中
SELECT...FROM是 SQL Command中最简单也最常用的查询命令。
例如,我们要列出所有北风数据库中 Customers表的 CustomerID及
CompanyName两个字段,并将输出字段以表格的方式输出 (奇数行与偶数行颜色不同 )。 ASP的程序代码 (ch8-5.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 CustomerID,CompanyName FROM Customers”
rs.open SQL,conn,3,2
Response.Write("<TABLE BORDER=1>")
Response.Write("<TR BGCOLOR=cyan>")
31
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
ch8-5.asp(续 ):
Response.Write("<TD>CustomerID</TD>")
Response.Write("<TD>CompanyName</TD>")
Response.Write("</TR>")
RecCount = 0
Do While not rs.eof
RecCount = RecCount + 1
If RecCount Mod 2 = 0 Then
BGColor = "#eeeeee"
Else
BGColor = "#ffffff"
End If
Response.Write("<TR BGCOLOR=" & BGColor & ">")
Response.Write("<TD>" & rs("CustomerID") & "</TD>")
Response.Write("<TD>" & rs("CompanyName") & "</TD>")
Response.Write("</TR>")
rs.MoveNext
Loop
Response.Write("</TABLE>")
Set rs = Nothing
Set Conn = Nothing
%>
32
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作说明:实际上,我们经常会选出前十大客户,然后对客户提供特别优惠的方案,此时我们可以使用下列的 SQL Command (假设 Customers表按销售金额排序 ),完成我们的需求:
SQL = "SELECT TOP 10 * FROM Customers"
ch8-5.asp程序执行结果如下图所示。
33
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
ASP除了提供 ADO对象供程序员编写数据库应用程序以外,也允许我们直接使用 SQL Command来访问数据库,并可以完全利用
SQL Server所提供的特异功能 (例如字段内默认值 [Default Value]的自动设置及自动增加字段值的功能等 )。只是这要求您必须非常熟悉
SQL Command,否则将无法享受 SQL Command所带来的好处。下面是直接利用 SQL Command访问 SQL Server的范例:
1,添加使用 SQL Command添加数据,您必须精通 SQL Command的语法,
因此其复杂程度较使用 RecordSet对象高,是属于专业层级的人使用。
添加数据的 SQL语法有两种写法,兹分述如下:
34
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
● 格式一
INSERT INTO tablename VALUES(value1,value2,...)
此种格式的用法较简单,但是使用限制较多。因为在添加数据时,字段的值必须依照表当初创建时的字段顺序排列 (天啊 ! 谁记得当初创建表的字段顺序 ),否则容易发生字段错置导致数据不正确的情形,或发生数据类型不符的情形 (将文本存至数字字段 )。
● 格式二
INSERT INTO tablename(field1,field2,...)
VALUES(value1,value2,...)
这种格式的语法较为复杂,但是使用起来较为浅显易懂,只要字段与值的顺序互相对应,就可以正常地操作。因此这种写法较常为程序设计员所采用。
35
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
为了示范数据库添加的方法,我们利用 SQL的 INSERT INTO语法,在北风数据库的 Customers表中添加一条记录。 ASP添加数据的原始程序代码( ch8-6.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "INSERT INTO Customers"
SQL = SQL + " (CustomerID,CompanyName,ContactName,ContactTitle,City)"
SQL = SQL + " VALUES('海河 ','海河摄影艺术会 ','高笑明 ','摄影记者 ','天津 ')"
On Error Resume Next
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Response.Write("Insert complete.")
Else
Response.Write("Insert fail!")
End If
Set rs = Nothing
Set Conn = Nothing
%>
36
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
当直接使用 SQL进行数据库的访问时,若数据的值出现单引号或其他特殊字符,可能导致执行时发生错误。例如:
SQL = "INSERT INTO Customers VALUES(" ' & CustID & "',"'
& CustName & "',"' & Note & "') "
当 CustID="10001",CustName="hlfjob"及 Note="It?s good."时
( Note字段内容出现单引号),则 SQL字符串的内容如下:
INSERT INTO Customers VALUES('10001','hlfjob','It's good.')
此时由于 Note字段多了一个单引号,因此在执行 SQL Command
的时候,会发生 SQL语法错误的情形。因此建议初学者采用
RecordSet的访问方法。
37
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
2,更新在 SQL语法中,更新数据库的用法如下:
UPDATE tablename SET field1 = value1,field2 =
value2,...WHERE condition
当 UPDATE未附带条件式时,它会针对表中所有的记录进行更新,这种操作较适合成批的更新。例如教师人员明年的调薪幅度为
3%,则使用 SQL更新数据库的语法如下:
UPDATE staff SET Salary = Salary * 1.03
若仅是针对特定人员调薪,则必须指定调薪的条件。例如总经理的薪水由每月 80万调整为 40万,则调整的 SQL语法如下:
UPDATE staff SET salary = 400000 WHERE staff_name='高琪 '
38
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
若为了安全起见,我们可以将 SQL写得更为严谨,以避免有错误的情形发生。我们可将上述的 SQL语法改为如下,如此就能确保更正操作可正确执行。
UPDATE staff SET salary = 400000
WHERE staff_name='高琪 ' AND Salary = 800000
39
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
为了让用户了解 UPDATE数据库的用法,我们以上面的添加示例为例,为您示范如何使用 SQL更新数据库中的数据。更正数据的
ASP的程序代码 (ch8-7.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "UPDATE Customers SET City = '天津 ' WHERE CustomerID='ALFKI'"
On Error Resume Next
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Response.Write("Update complete.")
Else
Response.Write("Update fail!")
End If
Set rs = Nothing
Set Conn = Nothing
%>
40
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
3,删除使用 SQL删除数据的杀伤力很大,因此在使用上要非常小心!
因为只要一个不小心,将可能会造成数据全毁的下场。实际上,我们常犯的错误是未指定删除的条件,导致数据全部被删除。例如:
DELETE FROM Customers
下面是我们将上面添加的数据 (海河摄影艺术会 ),从数据库中删除的范例。详细的 ASP程序代码 (ch8-8.asp)如下:
41
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "DELETE FROM Customers WHERE CustomerID='海河 '"
On Error Resume Next
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Response.Write("Delete complete.")
Else
Response.Write("Delete fail!")
End If
Set rs = Nothing
Set Conn = Nothing
%>
说明:在上面的语法中,DELETE FROM 常被写成 DELETE
* FROM,这在 SQL Server中是不被允许的。
42
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
4,查询利用 SQL Command 执行查询是使用 SQL访问数据库最简单的一件事了,因为它的语法比采用 RecordSet对象的方式更为简洁 (您可以与 RecordSet的查询程序比较 )。范例程序 (ch8-9.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "SELECT * FROM Customers"
On Error Resume Next
Set rs = Conn.Execute(SQL)
Response.Write("<TABLE BORDER=1>")
Response.Write("<TR BGCOLOR=cyan>")
Response.Write("<TD>CustomerID</TD>")
43
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
ch8-9.asp (续 )
Response.Write("<TD>CompanyName</TD>")
Response.Write("</TR>")
RecCount = 0
Do While not rs.eof
RecCount = RecCount + 1
If RecCount Mod 2 = 0 Then
BGColor = "#eeeeee"
Else
BGColor = "#ffffff"
End If
Response.Write("<TR BGCOLOR=" & BGColor & ">")
Response.Write("<TD>" & rs("CustomerID") & "</TD>")
Response.Write("<TD>" & rs("CompanyName") & "</TD>")
Response.Write("</TR>")
rs.MoveNext
Loop
Response.Write("</TABLE>")
Set rs = Nothing
Set Conn = Nothing
%>
44
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
上述程序执行结果如下图所示。
45
8.5 注册成为会员要实现网站自动增加会员人数的功能,就必须设计一个会员登录数据系统,用来登录个人的基本数据。
只要在网站上登录个人基本数据,就可以注册成为会员。某网站新用户注册的网页如下图所示。
46
8.5 注册成为会员该网页的 HTML代码 (newuser.htm)为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>新用户注册 </title>
<style type="text/css"><!--
.style1 {color,#0000FF}
.style2 {color,#FF0000}.style5 {font-size,large; color,#FF0000; font-family,"隶书 "; font-style,italic; }
--></style>
</head>
<body><p class="style1 style5">新用户注册 </p>
<p class="style1">请输入您的用户名及密码等相关信息( <span class="style2">﹡ </span>为必填项目)
</p>
<form name="form1" method="post" action="register.asp"><p>用户名
<input name="uid" type="text" id="uid">
47
8.5 注册成为会员
newuser.htm (续 ):
<span class="style2">﹡ </span> </p>
<p>密码<input name="pwd" type="text" id="pwd">
<span class="style2">﹡ </span></p>
<p>确认密码<input name="repwd" type="text" id="repwd">
<span class="style2">﹡ </span> </p>
<p>姓名<input name="name" type="text" id="name">
<span class="style2">﹡ </span></p><p>性别
<input type="radio" name="sex" value="男 ">男
<input type="radio" name="sex" value="女 ">女 </p><p>出生日期
<input name="birthday" type="text" id="birthday"><span class="style1">输入格式,y/mm/dd</span></p>
<p>
<input type="submit" name="Submit" value="注册 "><input type="reset" name="clear" value="重写 "> </p>
</form></body>
</html>
48
8.5 注册成为会员当用户填好相关信息后按 钮,提交给 register.asp,若填写内容正确则显示“注册成功!”,并可进入登录页面,如下图所示。
register.asp程序代码为:
<%@ Language=VBScript %>
<% Response.buffer=true %>
<%
dim uid
dim pwd
49
8.5 注册成为会员
register.asp程序代码 (续 ):
dim repwd
dim name
dim sex
dim birthday
dim conn
dim rs
dim sqlstr
uid=lcase(trim(request.Form("uid")))
pwd=lcase(trim(request.Form("pwd")))
repwd=lcase(trim(request.Form("repwd")))
name=lcase(trim(request.Form("name")))
birthday=lcase(trim(request.Form("birthday")))
select case Request.Form("sex")
case"男 "
sex="男 "
case"女 "
sex="女 "
end select
if uid="" or pwd="" or repwd="" or name="" then
response.write"<html><head><title>出错提示 </title
50
8.5 注册成为会员
register.asp程序代码 (续 ):
<meta http-equiv='Content-Type'
content='text/html';charset=gb2312'></head>"
response.write"<body bgcolor='#ffcc99'>
<table width='364'cellpadding='10'align='center'><tr align='center'><td>"
response.Write"<p>对不起,带 *号为必须填写项目 </p>"
response.Write"<p><a href='newuser.htm'>单击此处进行修改 </a></p>"
response.write"</td></tr></table></body></html>"
response.end
end if
if repwd<>pwd then
response.write"<html><head><title>密码错误 </title>
<meta http-equiv='Content-Type?
content='text/html';charset=gb2312'></head>"
response.write"<body bgcolor='#ffcc99'>
<table width='364'cellpadding='10'align='center'><tr align='center'><td>"
response.Write"<p>对不起,您输入的密码不正确 </p>"
response.Write"<p><a href='newuser.htm'>单击此处进行修改 </a></p>"
response.write"</td></tr></table></body></html>"
response.end
end if
51
8.5 注册成为会员
register.asp程序代码 (续 ):
set conn=Server.CreateObject("ADODB.Connection")
Conn.Open "Driver=SQL Server;Database=hlfjob;Server=(Local);uid=sa;pwd="
'验证登录者的身份
Function ValidPersonal(uid,pwd)
SQL = "SELECT uid,pwd,name FROM Resume WHERE uid='" + uid + "?
AND pwd='" + pwd + "' AND name='" + name + "'"
Set rs = Conn.Execute(SQL)
If rs.Eof Then
ValidPersonal = False
Else
ValidPersonal = True
End If
End Function
set rs=server.createobject("adodb.recordset")
sqlstr="SELECT * FROM Resume where Resume.uid='" & uid & "'"
rs.open sqlstr,conn
if not rs.eof then
response.write"<html><head><title>出错提示 </title>
<meta http-equiv='Content-Type' content='text/html';charset=gb2312'></head>"
response.write"<body bgcolor='#ffcc99'>
52
8.5 注册成为会员
register.asp程序代码 (续 ):
<table width='364'cellpadding='10'align='center'><tr align='center'><td>"
response.Write"<p>对不起,您输入的名字已被注册 </p>"
response.Write"<p><a href='newuser.htm'>单击此处进行修改 </a></p>"
response.write"</td></tr></table></body></html>"
response.end
else
conn.Execute("INSERT INTO Resume(uid,pwd,name) VALUES ('"& uid
&"','"& pwd &"','"& name &"')")
end if
%>
<html>
<head>
<meta name="GENERATOR" Content="Microsoft Visual Studio,NET 7.1">
</head>
<body>
<div align="center"><span class="style1">注册成功 !</span>
<a href="login.htm">登录请按此键 </a></div>
</body>
</html>
53
8.5 注册成为会员在该登录数据系统设计中,会员在填写个人信息时必须填写用户名、密码、确认密码和姓名,作为日后查询应聘机会时,系统辨认会员身份之用。至于非会员,虽然也可以查询应聘机会,但是只提供招聘信息的部分内容 (隐藏重要的部分 ),以吸引个人注册成为会员,这是网站行销的手法之一。
54
8.5 注册成为会员
8.5.1 会员登录的身份验证
8.5.2 会员登录的陷阱
8.5.3 如何防止非会员利用 URL闯入会员专区
8.5.4 如何动态切换网页
8.5.5 密码更改
8.5.6 忘记密码的处理
55
8.5 注册成为会员
8.5.1 会员登录的身份验证当用户填写会员数据并成为会员之后,数据库中已经拥有会员的相关信息 (例如用户名及密码等 )。日后当用户连上本网站并进入会员专区时,系统会自动要求会员输入用户名及密码,以便进行用户身份的确认。 hlfjob人才求职网的会员登录页面如下图所示。
56
8.5 注册成为会员
8.5.1 会员登录的身份验证
login,htm代码为:
<html>
<head>
<style type="text/css">
<!--
.topic { font-family,"宋体 ";font-size,11 pt;
vertical-align:middle; line-height:16pt}
.small { font-family,"宋体 ";
font-size,9 pt; vertical-align:middle;line-height:16pt}
input { font-family,"宋体 ";
font-size,9 pt; 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:normal}
.style1 {
color,#990000;
font-weight,bold;
font-family,"宋体 "; }
57
8.5 注册成为会员
8.5.1 会员登录的身份验证
login,htm代码 (续 ):
.style2 {color,#CC0000}
-->
</style>
<title>登录,Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF">
<div align="center" class="style1 style2">会员登录 </div>
<form action="login.asp" method="post">
<table align="center" border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#cccccc" bordercolordark="#FFFFFF"
bgcolor="#f2fdfd">
<tr bgcolor="#FFEFBF">
<td colspan=4 align="center" class=topic>请直接输入您的 </td>
</tr>
<tr bgcolor="#EAEAF4" class=small>
<td align=right nowrap> 用户名 </td>
<td> <input type="text" name="uid" size="16"
58
8.5 注册成为会员
8.5.1 会员登录的身份验证当用户输入用户名及密码之后,按下 钮执行 Login.asp页面所包含的程序,进行登录操作,登录的 ASP程序代码直接读取履历表
(Resume),检查用户名与密码是否存在于履历表中。若表中存在相同的用户名及密码,即代表登录的用户为会员,然后以 Session对象记录会员的用户名、密码及姓名后,进入会员专区 (pvip.htm),否则显示错误信息 (mvipb.htm)。会员登录的 ASP程序代码 (Login.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server}; Database=hlfjob;Server=(Local);uid=sa;pwd="
Function ValidPersonal(uid,pwd)
SQL = "SELECT uid,pwd,name FROM Resume WHERE uid='" + uid + "' AND
pwd='" + pwd + "'"
Set rs = Conn.Execute(SQL)
If rs.Eof Then
ValidPersonal = False
Else
ValidPersonal = True
End If
End Function
59
8.5 注册成为会员
8.5.1 会员登录的身份验证
Login.asp (续 ):
uid = Request("uid")
pwd = Request("pwd")
'若为合法会员 (用户名及密码存在于数据库 )
If ValidPersonal(uid,pwd) = True Then
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("pvip.htm")
Else
Response.Redirect("mvipb.htm")
End If
Set rs = Nothing
Set Conn = Nothing
%>
60
8.5 注册成为会员
8.5.2 会员登录的陷阱数据类型也可能会导致程序发生错误,原因是疏忽数据类型的特性所导致的,其中最常见的就是固定长度字符 CHAR(n)与变动长度字符 VARCHAR(n)数据类型的差异。在数据库中若我们将密码声明为
CHAR(8),则当会员密码的长度小于 8码时 (例如 asp 2000),则存入数据库中的值变成,asp 2000,。也就是数据库系统会自动以空格符补满密码字段,造成日后会员登录,输入密码,asp 2000”时,SQL的
SELECT语句比较,asp 2000”不等于,asp 2000,的情况,发生合法会员却无法登录的情形。解决这一问题的方式,有下列两种:
● 修改 pwd字段,将数据类型改为变动长,例如 VARCHAR(8)。
● 不改变数据库字段,但是在必须修改 SQL的 SELECT语句,将密码补满 8个字符,就可避免发生找不到会员数据的问题了。例如:
uid = uid + space(8-len(uid)) '以空格符补满
pwd = pwd + space(8-len(pwd)) '以空格符补满
SQL = "SELECT uid,pwd,name FROM Resume "
SQL = SQL + "WHERE uid = '" + uid + " ' AND pwd = '" + pwd + " '"
61
8.5 注册成为会员
8.5.3 如何防止非会员利用 URL闯入会员专区一般浏览器均提供类似 IE的收藏功能。为了防止会员将登录后的 URL告知其亲朋好友,取得与会员同样的信息来源,我们必须在会员的服务专区中加入判断用户是否经过正常渠道 (会员登录 )进入的验证,若用户经由 Bookmark或直接输入 URL而欲进入会员专区时,系统会自动将画面切换至会员登录的画面,完成入口管制的功能。使用此项服务我们可以利用 Session对象中的变量 Logined来判断。假如 Session("Logined“)的值为 Yes,代表会员是经由正常渠道登录的,否则即为非法用户。相关的程序代码片段如下:
<%
If Session("Logined") = False Then '非正常渠道登录
Response.Redirect("login.htm") '切换至 login.htm网页
End If
:
%>
62
8.5 注册成为会员
8.5.4 如何动态切换网页上面提到用户若尚未登录时,系统会自动切换至会员登录的画面。假如登录的画面为 Login.htm,则我们可以使用 Response对象的 Redirect方法,将网页重定向至 Login.htm,即可以完成画面切换的操作。但是本项操作有一个前提,那就是在做输出重定向 (Redirect)
之前,不能出现任何的 HTML的 Tag,因为输出重定向的命令必须置于 http的 Request标题 (Header)。若在
Redirect之前已经输出 HTML,则 Header会自动被填入默认的标题。
63
8.5 注册成为会员
8.5.4 如何动态切换网页
● 错误的示范
<HTML>
<BODY>
<%
If Session("Logined") = False Then
Response.Redirect("login.htm")
End If
:
%>
:
</BODY>
</HTML>
64
8.5 注册成为会员
8.5.4 如何动态切换网页
● 正确的示范
<%
If Session("Logined") = False Then
Response.Redirect("login.htm")
End If
:
%>
<HTML>
<BODY>
:
</BODY>
</HTML>
当上述的 If条件成立时,ASP程序会自动将网页切换至会员登录的网页 (login.htm),让用户按照正常渠道登录系统。
65
8.5 注册成为会员
8.5.5 密码更改在会员服务中,密码更改是不可或缺的功能。通常用户更改密码的原因不外乎系统要求用户更改 ( 例如系统设置每半年必须更改一次密码、或用户第一次登录时须更改密码 ),或用户发现密码有外泄的疑虑时。密码更改的网页如下图所示。
66
8.5 注册成为会员
8.5.5 密码更改该网页的 HTML的源代码 (recipher.htm)如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>更改密码 </title>
<style type="text/css">
<!--
.style2 {
font-family,"隶书 ";
font-size,24px;
color,#000000;
}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="recipher.asp">
67
8.5 注册成为会员
8.5.5 密码更改
recipher.htm (续 ):
<p> <span class="style2">更改密码 </span></p>
<p>请输入用户名:
<input type="text" name="uid"></p>
<p>请输入原密码:
<input type="password" name="pwd"></p>
<p>请输入新密码:
<input type="password" name="pwd1"></p>
<p>请确认输入新密码:
<input type="password" name="pwd2">
</p>
<p>
<input type="submit" name="Submit" value="确认 ">
<input type="reset" name="Submit2" value="重填 ">
</p>
</form>
</body>
</html>
68
8.5 注册成为会员
8.5.5 密码更改通常系统设计时,程序设计员会基于减少数据库负荷的考虑,
将用户密码置于 Session对象的变量中。例如 Session(“pwd”),待用户更改密码时,只要核对旧密码是否与 Session(“pwd”)的值一致,即可确定密码无误,省掉须再次读取数据库的验证工作;至于新密码则考虑密码输入时,不显示内容的原因 (在网页的输入区只显示,·”或
,*”字符 ),因此必须以再输入一次新密码的方式确认,避免用户误触其他按键而导致密码更改后,下次再进入系统时,因密码错误
(永久忘记 )所造成的密码丢失。更改密码后,单击 按钮,提交给
recipher.asp,其 ASP程序代码见下页:
69
8.5 注册成为会员
8.5.5 密码更改
recipher.asp:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=hlfjob; Server=(Local);uid=sa;pwd="
'密码更改函数 Passwd
Function Passwd(pwd1,pwd2)
On Error Resume Next
If pwd1=pwd2 Then
SQL = "UPDATE Resume SET pwd = '" + pwd1 + "' 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
'旧密码相同,且两次新密码一致
70
8.5 注册成为会员
8.5.5 密码更改
recipher.asp(续 ):
If Session("pwd")=Request("pwd") and Request("pwd1")=Request("pwd2") Then
'将数据库中的密码改为新密码
If Passwd(Request("pwd1"),Request("pwd2")) = True Then
Result = True
Else
Result = False
End If
Else
Result = False
End If
If Result = True Then
Session("pwd") = Request("pwd1")
'Session("pwd") = 新的密码
Response.Redirect("ciphersucceed.htm")
'显示密码更改成功网页
Else
Response.Redirect("cipherbaulk.htm")
'显示密码更改失败网页
End If
Set rs = nothing
Set Conn = nothing
%>
71
8.5 注册成为会员
8.5.6 忘记密码的处理为了满足会员的需求,很多网站开始把忘记密码的服务搬上网络,让用户自行上网查询密码,以降低配置服务人员的成本。
忘记密码的做法原则上是利用会员原先留存的数据,要求用户输入先前所登录的会员数据供系统验证,如右图所示,待输入的相关字段验证无误后,再将密码通过原留存的 E-mail 账号发给用户或在线上显示密码。考虑到在线显示密码的安全,一般会搭配使用 SSL 安全机制,以确保密码不会在线上传输时曝光。
72
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 HTML程序 forgetpwd.htm代码为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>忘记密码 </title>
<style type="text/css">
<!--
.style1 {color,#FF0000}
.style2 {color,#0000FF}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="forgetpwd.asp">
<p class=“style1”>亲爱的用户,为了确保您的权益,因此请您输入一些个人的基本资料,来得知您的密码,谢谢! </p>
<p><span class="style2">请输入您的姓名,</span>
<input type="text" name="name"> </p>
73
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 HTML程序 forgetpwd.htm代码 (续 ):
<p><span class="style2">请输入您的用户名,</span>
<input type="text" name="uid"></p>
<p><span class="style2">请输入您的出生年、月、日,</span>
<input name="yymmdd" type="text" size="17" maxlength="17"> </p>
<p><span class="style2">请输入您的电话号码,</span>
<input name="teln" type="text" size="23"> </p>
<p><span class="style2">请输入您的 E-Mail</span>:
<input type="radio" name="br1" value="0">
<input name="email" type="text" size="20"> </p>
<p>
<input type="radio" name="br1" value="1">
<span class="style2">我没有 E-Mail</span></p>
<p>
<input type="submit" name="Submit" value="确定 ">
<input type="reset" name="reset" value="重新设定 "> </p>
</form>
</body>
</html>
74
8.5 注册成为会员
8.5.6 忘记密码的处理当系统要求的字段输入完毕,并按下确定按钮后,ASP程序将自动比对用户输入的信息是否正确,在正确无误的条件下,程序将密码显示于画面上 (为了安全起见,可将此改为以 E-mail将密码发给用户 )。忘记密码的 ASP程序 (forgetpwd.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=hlfjob;Server=(Local);uid=sa;pwd="
Function GetUserInfo(uid)
If Request("rb1")="0" Then
femail="email"
Else
femail=""
End If
SQL = "SELECT uid,pwd,name,birthday,br1,teln" + femail + " FROM Resume WHERE "
SQL = SQL + "uid='" + uid + "' AND "
SQL = SQL + "name='" + Request("name") + "' AND "
SQL = SQL + "birthday='" + Request("yymmdd") + "' AND "
SQL = SQL + "br1='" + Request("br1") + "' AND "
75
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 ASP程序 forgetpwd.asp (续 ),
SQL = SQL + "teln='" + Request("teln") + "' "
If Request("br1")="0" Then
SQL = SQL + "AND email='" + Request("email") + "'"
End If
Set rs = Conn.Execute(SQL)
If rs.Eof = False Then
GetUserInfo = True
Else
GetUserInfo = False
End If
End Function
%>
<% If GetUserInfo(Request("uid")) = True Then %>
<% Response.Redirect(“wripwd.htm”) %>?wripwd.htm为通知用户已找到密码网页或以 E-Mail将密码寄出,或将密码显示于画面上。
<% Else %>
<font color=red>错误! </font>
<hr size=1>
输入的数据与原先登录时的不一致。
76
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 ASP程序 forgetpwd.asp (续 ),
请返回 <a href="javascript:history.back(1)">上一页 </a>,查明后再重新输入。
<%
End If
Set rs = Nothing
Set Conn = Nothing
%>
说明:网页上有“后退”的超级链接。通常设计员会直接将上一页的网页名称置于 Hyperlink中,但是此种写法有一个缺点,那就是每次都必须指定网页名称。现在有一种写法可以解决上述的问题,
那就是使用 JavaScript来处理。例如:
<a href="javascript:history,Back(1) ">后退 </a>。
77
8.6 如何将文本文件导入 SQL
Server 2000数据库文本文件是最通用的数据交换格式。任何的平台都可以轻易的读取文本文件的格式,因此有许多数据均是以文本文件的类型进行交换,尤其是大型主机的数据要转给个人计算机的数据库使用时。 SQL Server 2000提供的数据转换服务 (Data Transformation Services)提供数据导入 /导出向导,可轻易地将文本文件导入 SQL Server数据库。
为了让读者了解 SQL Server数据导入的功能,下面我们以自行定义的 eweb2000数据库的 NewsPaper表为例
(表结构见下页表 ),为读者示范将文本文件导入数据库的操作。
78
8.6 如何将文本文件导入 SQL
Server 2000数据库操作步骤:
( 1)进入 SQL Server 2000的企业管理器 (Enterprise Manager),展开
eweb2000数据库,并将光标移至 NewsPaper表上。单击鼠标右键,
选取“所有任务 \导入数据”命令,如下图所示。
字段名称 数据类型 长 度
EMail varchar 50
Status char 1
79
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 2)打开,DTS导入 /导出向导”,请单击 按钮,如下图 a所示。
( 3),DTS导入 /导出向导”可轻易地将文件 (文本文件、数据库及
Excel等 )转换至数据库中。在导入的过程中的第一个步骤,我们必须指定数据源,如下图 b所示。
图 a 图 b
80
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 4)请将“数据源”选项的内容改为“文本文件”项目;然后点选
“文件名”旁边的 按钮。
( 5)打开“选择文件”窗口,然后指定导入的文本文件 (本例为
c:\maillist.txt),最后单击 按钮,如下图 a所示。
( 6)回到选择数据源窗口后,单击 按钮,如下图 b所示。
图 a 图 b
81
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 7 ) 在指定数据来源之后,接下来,DTS 导入 /导出向导
(Import/Export Wizard)”会要求用户定义数据的格式,其中包括字段间的分隔字符,文件的类型 (ANSI),每条数据的分隔字符
({CR},{LF})及文本前后是否以双引号包起来等设置 。 由于文本文件的格式只有两个字段,请以逗点,,,为分隔字符,单击按钮,如下图所示 。
82
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 8) 这个画面主要设置文本文件字段间的分隔字符 。 由于
c:\maillist.txt是以逗号,,,为分隔字符 (故窗口中出现 Col001及
Col002两个字段及部分数据范例 ),请选取,逗号,单选项,单击按钮,如下图所示 。
83
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 9) 接下来要设置导入数据库的相关参数 。 在本例中请点选目的地 (Destination)选项中的,用于 SQL Server 的 Microsoft OLE DB提供程序 (Microsoft OLE DB Provider for SQL Server)”项目,登录数据库采用 Windows 身份认证的方式登录 SQL Server数据库 (若采用
SQL Server身份验证须输入登录的 Username及 Password),并在指定导入的数据库 (eweb2000)后,单击 按钮,如下图所示 。
84
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 10) 在指定导入的数据库后,接下来必须指定导入哪一个表
(Table)。 在本范例为 NewsPaper表,因此请点选,目的,表下拉列表框中的,NewsPaper”表,单击 按钮,如下图所示 。
85
8.6 如何将文本文件导入 SQL
Server 2000数据库说明:若您想了解数据导入相对应的字段,请点选上图中
Transform字段的 按钮,启动,列映射和转换,,如下图所示,
您可以看到文本文件与数据库字段对照的情形 。
86
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 11)在下图 a所示的画面中,我们可以定义 DTS导入 /导出向导何时执行转换操作或将此定义存成 DTS包文件供日后使用,请勾选
“立即运行”复选框,然后单击 按钮。
( 12)我们已经完成 DTS 导入 /导出向导的相关定义,然后请单击按钮,如下图 b所示。
图 a 图 b
87
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 13)系统依据先前的定义将数据由文本文件加载数据库,并显示如图 a所示导入结果。 DTS已成功的将文本文件导入 SQL Server,
单击 按钮,如图 a所示。
( 14)在“正在执行包”窗口的状态中,看到导入成功的条数,
本范例为完成 (7),代表转换成功条数为 7条,请单击 按钮,
回到企业管理器窗口,如图 b所示。
图 a 图 b
88
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 15)当我们回到企业管理器窗口,我们可以在 NewsPaper表上右击,点选“打开表 /返回所有行”命令,查看所有数据导入的情形,
如下图所示。
看到这里,您就会了解 SQL Server的威力。通过 DTS导入 /导出向导我们可以轻轻松松将文本文件导入数据库,而且连一行的程序代码都不用写,您说是不是太神奇了。这种处处为用户考虑的思维方式,不正是微软能称霸 Windows平台的原因之一吗!
89
8.7 如何将 SQL Server 2000的数据转到文本文件前面提及文本文件是数据交换的最通用格式之一,但不知道您是否想像过 SQL Server 2000这种大型数据库,它的数据如何转成可交换的文本文件格式呢? 或许有些会写程序的人说,写一段小的程序将数据导出来就可以了。但是有没有方法可以不写程序就可以完成这项工作呢? 或许就没有人想过了。
SQL Server 2000易学易用的特色,着实给数据库的老大哥们
(如 Oracle,Informix及 Sybase等 )上了一课,并且让数据库管理员的工作负荷减轻不少,更赢得了 Windows NT平台占有率的第一名,
创造了进入市场最晚但占有率最高的奇迹。在 SQL Server 2000中,
DTS服务除提供导入 (Import)以外,还提供导出 (Export)的功能。通过 DTS 导入 /导出向导 (Import /Export Wizard),我们可以将 SQL
Server 2000的数据轻易地转成其他的数据库 (Oracle,Informix,...)
格式,另外更可以转成文本文件格式。
下面我们将一步一步地带领您实践 SQL Server 2000导出数据至文本文件的操作:
90
8.7 如何将 SQL Server 2000的数据转到文本文件操作步骤:
( 1)进入企业管理器窗口,然后查看导出的表内容 (本例我们使用前一个范例的表 NewsPaper),如下图 a所示。
( 2)请在 NewsPaper表上,单击鼠标右键,点选“所有任务 \导出数据”命令,如下图 b所示。
图 a 图 b
91
8.7 如何将 SQL Server 2000的数据转到文本文件
( 3)启动 DTS导入 /导出向导,请单击 按钮,如图 a所示。
( 4)请指定 DTS导入 /导出向导要导出的数据来源。数据源的地方请指定数据库的驱动程序名称,在此为用于 SQL Server的 Microsoft
OLE DB提供程序,服务器在本例为 (local) (若 SQL Server在别的主机,请自行修正 );至于 SQL Server 用户的登录认证,我们可选用
Windows 的身份验证或 SQL Server的身份验证 ( 须输入 Username及
Password );最后设置数据库选项中的数据库名称为 eweb2000,单击 按钮,如图 b所示。
图 a 图 b
92
8.7 如何将 SQL Server 2000的数据转到文本文件
( 5) 在指定完数据库后,接下来请指定数据库导出的目的地 。 由于本例为文本文件,因此目的地选项请指定为文本文件,至于下方的文件名可指定任何合法的文件名称,原则上扩展文件名以,txt为最好 。 本例为 D:\MyASP\chapter8\maillist.txt,单击 按钮,如下图所示 。
93
8.7 如何将 SQL Server 2000的数据转到文本文件
( 6) 在本窗口中,我们可以看到数据是由 Microsoft SQL Server转至 Flat File(文本文件为 Flat File的一种 ),单击 按钮,如下图所示 。
说明:我们也可以指定将文件抄写到文本文件中,或以 SQL查询语言指定所导出的数据条件 (在导出部分数据时特别有用 ),在本例中我们来用整个数据表导出的方式,故点选第一个选项 。
94
8.7 如何将 SQL Server 2000的数据转到文本文件
( 7) 下图这个画面主要供指定导出的文本文件格式,相关的参数说明见下页:
95
8.7 如何将 SQL Server 2000的数据转到文本文件带分隔符,选用字段分隔字符方式,导出的每条数据格式为变长。
通常此种格式最适用于 Visual Basic及 Excel等软件。
固定字段,字段数据以固定长度的方式导出,以方便其他程序语言的导入,例如大型主机使用的 Cobol语言。
文件类型,指定文件的类型,文件类型可以是 ANSI,Oem及
Unicode。本例我们采用标准文本文件格式,因此选用 ANSI选项。
若您有 Unicode的需求,请改为 Unicode。
行分隔符,每条数据的分隔字符,分隔字符选项有 {CR}{LF},{CR}
及 {LF}三种。在 Dos/Windows平台上,文本文件中每条数据的分隔字符有两个字节,分别是 ASCII的 13{CR}及 10{LF}。若数据要与
Unix平台做数据交换,请将此设置改为 {LF}。因为 Unix的文本文件每条记录( Record)的分隔字符为 ASCII 10{LF},Mac操作系统的分隔字符为 {CR}。
96
8.7 如何将 SQL Server 2000的数据转到文本文件列分隔符,此参数用以指定字段间的分隔字符,可能的选项有下列三种:
● 逗号
● 冒号
● 定位字符文本限定符,指定导出文本字段的合法表示方式,默认值为双引号。但本例中我们使用 <无 >(<none>)。
第一行含有列名称,若选中时,输出文件的第一列复选框为字段名称。
97
8.7 如何将 SQL Server 2000的数据转到文本文件
( 8)至此我们已经完成 DTS导入 /导出向导的设置,接下来我们可以定义 DTS导入 /导出向导何时执行转换操作,或将此定义存成 DTS包
(DTS Package)文件供日后使用。在本例为立即运行,请选中“立即运行”复选框,然后按 钮,如下图 a所示。
( 9)我们已经完成 DTS导入 /导出向导的相关定义,请按 钮,
如下图 b所示。
图 a 图 b
98
8.7 如何将 SQL Server 2000的数据转到文本文件
( 10)系统依据先前的定义将表 NewsPaper导出至文本文件
(D:\MyASP\chapter8\maillist.txt),单击 按钮,如下图 a所示。
( 11)我们可以在正在执行包窗口的状态中,看到导出的成功记录的数目。本范例为完成 (7),代表导出成功记录数目为 7条,然后请单击 按钮,回到企业管理器窗口,如下图 b所示。
图 a 图 b
99
8.7 如何将 SQL Server 2000的数据转到文本文件
(12)导出完毕,我们可以使用,记事本,打开文本文件
D:\MyASP\chapter8\maillist.txt,查看一下成果,DTS 导入 /导出向导导出的格式如下图所示 。
虽然导入 /导出的介绍与 ASP较为无关,但实际运用上还是会用到,因此我们在此做一个简单的介绍 。
10
0
第 8章 ASP与 SQL Server
ASP 提供的是一种编程语言,数据库是用来存储程序中用到的数据。本章主要介绍了 SQL Server数据库的建立与访问方法,以及利用 ASP和 SQL Server开发数据库应用程序的方法。
101
第 8章 ASP与 SQL Server
习题
1,请编写一会员忘记密码的处理,将密码改用 e-Mail(SMTP)
方式发给用户。
2,请自己以记事本建立一个文本文件,然后试着以 Import
Data… 导入 SQL Server数据库中 (数据库请自行建立 )。
3,请自行利用 SQL Server内建的北风数据库,实践 Export
Data… 的功能。
ASP动态网页设计教程
2
第 8章 ASP与 SQL Server
目前世界上著名的关系型数据库 (RDBMS)包括 Oracle,Informix、
Sybase,SQL Server 及 Interbase等。在这么多的数据库中,到底我们该选择哪一种作为 Web 数据库呢? 不用怀疑,SQL Server 绝对是
Windows NT平台上与 ASP最好配的组合,毕竟有谁能“比微软更了解微软”。
SQL Server 是微软惟一的服务器 /客户结构 (Client/Server)数据库产品。在互联网蓬勃发展的今天,数据库扮演着储存交易数据的重要角色。或许您会认为 SQL Server很复杂,但是在微软提供的数据库管理工具包装下,让数据库管理员的工作减轻许多,因此拉近了数据库管理员与 SQL Server 的距离,也从此让 SQL Server成为
Windows NT平台上最受欢迎的数据库。
3
第 8章 ASP与 SQL Server
目前,较著名的关系型数据库产品中,Oracle为全球最大的数据库软件公司,其数据库产品 Oracle为全球数据库最大品牌,而微软的 SQL Server则是 Windows NT平台上占有率最高的数据库产品,
它与 Sybase数据库是同卵双胞胎的产品 (微软与 Sybase合作后取得数据库技术 )。因此在过去 SQL Server 7.0 版以前,通过 Sybase的数据库驱动程序 DB-Library也可以访问 SQL Server。前些年由于微软已能自行控制 SQL Server,所以 SQL Server与 Sybase已渐行渐远,
逐渐摆脱 Sybase的影子而自成一格。特别是微软的 SQL Server
2000问世以来,Microsoft SQL Server 2000 扩展了 Microsoft SQL
Server 7.0 版的性能、可靠性、质量和易用性,增加了几种新的功能,由此成为大规模联机事务处理 (OLTP)、数据仓库和电子商务应用程序的优秀数据库平台。
4
第 8章 ASP与 SQL Server
8.1 数据库驱动程序
8.2 数据库访问标准 —ODBC
8.3 访问 SQL Server数据库
8.4 数据库基本操作
8.5 注册成为会员
8.6 如何将文本文件导入 SQL Server 2000
数据库
8.7 如何将 SQL Server 2000的数据转到文本文件
5
8.1 数据库驱动程序所谓数据库驱动程序 (Database Driver),就是数据库厂商或系统提供者针对特定的数据库系统所开发的一组程序,应用软件通过此程序可以访问数据库的数据,这一组程序我们就称为数据库驱动程序。
一般数据库发展厂商均会随数据库产品附赠数据库驱动程序。原厂提供的数据库驱动程序,我们称为原始的数据库驱动程序 (Native Database Driver)。由于数据库厂商最了解自己的数据库产品,因此原始的数据库驱动程序的执行效率通常会比其他厂商提供的产品更好。
6
8.2 数据库访问标准 —ODBC
如果您使用过像 dBase,FoxPro,Parsdox或 Access等数据库产品的话,相信您会知道每一种数据库的结构不尽相同,因此访问数据库的驱动程序也不一样。例如 Oracle采用 SQL*Net; SQL Server
采用 DB Library; Informix则有 Informix-Client等,如下图所示。因为数据库的驱动程序都不相同,造成软件开发厂商必须针对不同的数据库,发展不同的软件版本,因此也阻碍了应用程序的发展。
7
8.2 数据库访问标准 —ODBC
为了解决数据库驱动程序的问题,Microsoft制定了一套开放式数据库连接标准,称为 Open DataBase Connectivity,ODBC。数据库厂商或驱动程序发展厂商,只要遵循 ODBC的规格提供数据库驱动程序 (如,Oracle ODBC驱动程序,Informix ODBC驱动程序 ),应用程序就可以在不用修改的状况下,通过标准的 ODBC
数据库驱动程序的 API,访问不同的数据库产品,如下图所示。
8
8.2 数据库访问标准 —ODBC
未来当应用程序连接的数据库不一样时 (例如由
Oracle改为 SQL Server),我们只要更换 ODBC数据库驱动程序,就可以连接不同的数据库,如下图所示。
9
8.3 访问 SQL Server数据库
SQL Server为 Microsoft服务器 /客户 (Client/Server)
结构的数据库产品。它非常适用于发展互联网的数据库应用程序,是目前 Windows平台上最好的数据库产品。由于服务器架构的 Client端分布在不同的办公室,
因此安全更加显得格外的重要。为防止非法的用户闯入数据库进行不当的访问,一般数据库管理系统
(DataBase Management System,DBMS) 均提供完整的安全认证机制,包括联机时的登录 (Login)程序以及权限的划分等。只有经过合法授权的用户才能访问数据库的数据,而授予数据库权限的管理人员,我们称为数据库管理员 (DataBase Administrator,简称 DBA)。
10
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
8.3.2 调用 Connection对象的 Execute方法创建 RecordSet对象
8.3.3 RecordSet对象
8.3.4 Field对象
8.3.5 Fields对象
8.3.6 RecordSet的方法及属性
11
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
要连接至 SQL Server必须经过登录 (Login)的程序,才能使用
SQL Server数据库的数据。然而在 ASP中要如何才能连上 SQL
Server呢? 答案很简单,首先我们必须创建与 SQL Server的联机 (使用 Connection对象 ),连接的方式如下:
Set Conn = Server.CreateObject("ADODB.Connection")
其中 Conn即为连接 SQL Server的 Connection对象。在创建
Connection对象之后,我们可以使用 Connection对象的 Open方法打开指定的 SQL Server数据库,其用法如下:
Conn.Open"DRIVER={SQL Server};Database=dbname;
Server=(local);uid=userid;pwd=password"
12
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
由于我们要打开的数据库为 SQL Server,所以在 Open的参数必须指定打开 SQL Server数据库的相关信息,参数与参数之间以分号隔开。相关参数的说明如下:
● DRIVER={SQL Server}:指定访问数据库的驱动程序名称 (SQL
Server)。
● Database=dbname,dbname为 SQL Server上存在的数据库名称,例如北风数据库 (Northwind),该数据库为 SQL Server 2000系统数据库。
● Server=(Local):用来指定数据库所在的机器地址,通常为 IP
Address,例如,Server= 168.95.3.112。
说明:若为了成本考虑,我们将 SQL Server与 Web Server置于同一部机器,则此处可以写成 Server=(Local)。
13
8.3 访问 SQL Server数据库
8.3.1 连接 SQL Server
● Uid=userid:用以指定连接至 SQL Server的用户名称,此用户必须为合法的 SQL Server数据库用户。例如 SQL Server的数据库管理员
SA(System Administrator)。
● Pwd=password:此处须填写登录数据库的用户密码 (注意密码的大小写 )。
说明:基于安全上的考虑,我们并不建议您使用 SA作为登录
SQL Server数据库的用户账号。
14
8.3 访问 SQL Server数据库
8.3.2 调用 Connection对象的 Execute方法创建 RecordSet对象关系型数据库在访问数据库时并非以传统的记录
(Record) 方式处理,取而代之的是数据集 (RecordSet)
的概念。因此,要处理 SQL Server 数据库,光是使用
Conn.Open 打开数据库还是不够的,我们必须要创建
RecordSet 的对象,方能进行数据库的访问。创建
RecordSet的方式如下:
Set rs = Conn.Execute("Customers")
15
8.3 访问 SQL Server数据库
8.3.2 调用 Connection对象的 Execute方法创建 RecordSet对象
Conn.Open 用以打开与数据库的连线操作。要访问数据库则必须通过 RecordSet 对象。创建 RecordSet
有多种不同的方法,主要看用途而定。通常
Conn.Execute的参数为 SQL Command,但是在对表的添加操作时,参数值为表的名称。在本例中我们打开北风数据库 Northwind中的 Customers表,并传回
RecordSet对象给变量 rs。
16
8.3 访问 SQL Server数据库
8.3.3 RecordSet对象关系型数据库中表的结构,可以把它看成是 Excel
电子表格的外观,它是由列 (Column)与行 (Row)所组成的。其中列 (Column)的部分,为数据库的字段 (Field);
行 (Row) 则称为记录 (Record) ;相关记录所组成的集合,称为数据集
(RecordSet);而所有记录所成的集合则称为表
(Table),如右图所示。
17
8.3 访问 SQL Server数据库
8.3.4 Field对象字段 (Field)在关系型数据库中称为 Column,它是数据库中最小的数据单位。在 ADO对象中,字段对应的对象为 Field,它有以下三个属性,如下表所示。
属性 (property) 说 明
Name 字段名称
Value 字段的值 (内容 )
Type 字段数据类型 (数值类型 )
18
8.3 访问 SQL Server数据库
8.3.5 Fields对象
Fields对象为 Field对象所成的集合 (集合对象 ),它是以对象数组的方式存在,数组中每一个元素我们可以看成是单一的 Field对象。
至于 Fields集合对象的个数,我们可以利用 Count属性得知。下面是我们利用 SQL Server北风数据库中的 Customers表,取得 Customers的字段个数及第一条数据的 ASP范例程序 (ch8-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 = "Customers"
rs.open SQL,conn,3,2
Response.Write("Database,Northwind<br>")
Response.Write("Table,Customers<br>")
Response.Write("<table border=1>")
Response.Write("<tr bgcolor=#ffccee>")
Response.Write("<td align='center'>字段名称 </td>")
19
8.3 访问 SQL Server数据库
8.3.5 Fields对象
ch8-1.asp (续 ):
Response.Write("<td align='center'>数据类型 </td>")Response.Write("<td align='center'>字段值 </td>")
Response.Write("</tr>")
For i=0 to rs.Fields.Count - 1Response.Write("<tr>")
Response.Write("<td>" & rs.Fields(i).Name & "</td>")Select Case rs.Fields(i).type
Case 130
Response.Write("<td>nchar</td>")Case 202
Response.Write("<td>nvarchar</td>")End Select
Response.Write("<td>" & rs.Fields(i).Value & " </td>")
Response.Write("</tr>")Next
Response.Write("</table>")Set rs = Nothing
Set Conn = Nothing
%>
20
8.3 访问 SQL Server数据库
8.3.5 Fields对象此 ASP范例程序的输出画面如下图所示。
21
8.3 访问 SQL Server数据库
8.3.6 RecordSet的方法及属性使用 SQL访问关系型数据库,后端的数据库对于查询的结果是以 RecordSet的形式存在于内存中。但是,对于前端的应用程序而言,数据的访问还是 Record by
Record的访问方式。因此,RecordSet对象提供许多数据的访问方法,其说明如下表所示。
方 法 说 明
MoveFirst 将记录移至第一条
MoveLast 将记录移至最后一条
MoveNext 将记录移至下一条
MovePrevious 将记录移至上一条
22
8.3 访问 SQL Server数据库
8.3.6 RecordSet的方法及属性
RecordSet 对象除了提供上述的方法以外,另外也配合数据库的访问,提供了三个有用的属性,其功能说明如下表所示。
方 法 说 明
BOF 判断数据是否移过了第一条 (begin of file)
EOF 判断数据是否移过了最后一条 (end of file)
AbsolutePosition
=n
将记录移至第 n条 (适用于随机数抽奖或由试题数据库中随机数选取 20 题出来测试时使用 )
23
8.4 数据库基本操作数据库的操作不外乎添加 (INSERT)、修改
(UPDATE)、删除 (DELETE)、及查询 (SELECT)等四大功能。通常要访问 SQL数据库 (关系型数据库 )您必须熟悉 SQL 语言,否则势必会遇上许多的困难。但若您是使用 Microsoft 的 ASP 搭配 SQL Server 来开发
Web数据库应用程序,那么就可以使用 Microsoft 的数据库对象 (ADO) 来简化数据库的访问操作,大幅度地降低数据库的使用门槛。建议您最好也具备
SQL 的基础,因为有许多 SQL的特性用 Microsoft 的数据库对象是无法完成的。
24
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
8.4.2 利用 SQL Command访问 SQL Server
25
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作下面我们将针对 SQL Server的添加、修改、删除、
及查询等四大操作,利用 RecordSet对象示范如何访问
SQL Server。
1,添加在数据库中添加一条数据,必须使用 AddNew方法添加一条记录,然后再设置各字段的值,最后再调用
Update方法,将数据添加到数据库中。
ASP的程序代码 (ch8-2.asp)见下页:
26
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
<%
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 = "Customers"
rs.open SQL,conn,3,2
rs.AddNew
rs("CustomerID") = "海河 "
rs("CompanyName") = "海河摄影艺术会 "
rs("ContactName") = "高笑明 "
rs("ContactTitle") = "摄影记者 "
rs("City") = "天津 "
rs.Update
Set rs = Nothing
Set Conn = Nothing
%>
Insert complete.
说明:在 SQL Server中有一种特殊的数值字段,它具有自动增加某固定值 (例如每次加 1)的功能 (类似产生流水号 ),切记此种字段在添加时,不须特别指定该字段的值,因为系统会自动赋予字段应有的值。数据库字段若有默认值,
使用本操作时字段的值将被初始化,因此可能会导致默认值发生错误的情况。
27
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
2,修改要修改 SQL Server中的数据,首先我们必须先找出该条记录,在确认数据无误后,更新表相关字段内容之后,使用 Update方法将修改后的数据写回数据库。
更正数据的 ASP程序代码范例 (ch8-3.asp)见下页:
28
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
<%
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 WHERE CustomerID='ALFKI'"
rs.open SQL,conn,3,2
if not rs.Eof Then
rs("City") = "柏林 (Berlin)"
rs.Update
End If
Set rs = Nothing
Set Conn = Nothing
%>
Update complete.
29
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
3,删除将数据库中无用的数据删除,以免占用数据库的空间。删除数据的范例 (ch8-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")
SQL = "SELECT * FROM Customers WHERE CustomerID='海河 '"
rs.open SQL,conn,3,2
If not rs.Eof Then
rs.Delete
Response.Write("Delete complete.")
Else
Response.Write("Record not found !")
End If
Set rs = Nothing
Set Conn = Nothing
%>
30
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
4,查询在数据库的 SQL Command中,查询 (SELECT)的语法是最复杂的。它可以变化的地方最多,应用的层面也最为广泛,其中
SELECT...FROM是 SQL Command中最简单也最常用的查询命令。
例如,我们要列出所有北风数据库中 Customers表的 CustomerID及
CompanyName两个字段,并将输出字段以表格的方式输出 (奇数行与偶数行颜色不同 )。 ASP的程序代码 (ch8-5.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 CustomerID,CompanyName FROM Customers”
rs.open SQL,conn,3,2
Response.Write("<TABLE BORDER=1>")
Response.Write("<TR BGCOLOR=cyan>")
31
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作
ch8-5.asp(续 ):
Response.Write("<TD>CustomerID</TD>")
Response.Write("<TD>CompanyName</TD>")
Response.Write("</TR>")
RecCount = 0
Do While not rs.eof
RecCount = RecCount + 1
If RecCount Mod 2 = 0 Then
BGColor = "#eeeeee"
Else
BGColor = "#ffffff"
End If
Response.Write("<TR BGCOLOR=" & BGColor & ">")
Response.Write("<TD>" & rs("CustomerID") & "</TD>")
Response.Write("<TD>" & rs("CompanyName") & "</TD>")
Response.Write("</TR>")
rs.MoveNext
Loop
Response.Write("</TABLE>")
Set rs = Nothing
Set Conn = Nothing
%>
32
8.4 数据库基本操作
8.4.1 SQL Server四大基本操作说明:实际上,我们经常会选出前十大客户,然后对客户提供特别优惠的方案,此时我们可以使用下列的 SQL Command (假设 Customers表按销售金额排序 ),完成我们的需求:
SQL = "SELECT TOP 10 * FROM Customers"
ch8-5.asp程序执行结果如下图所示。
33
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
ASP除了提供 ADO对象供程序员编写数据库应用程序以外,也允许我们直接使用 SQL Command来访问数据库,并可以完全利用
SQL Server所提供的特异功能 (例如字段内默认值 [Default Value]的自动设置及自动增加字段值的功能等 )。只是这要求您必须非常熟悉
SQL Command,否则将无法享受 SQL Command所带来的好处。下面是直接利用 SQL Command访问 SQL Server的范例:
1,添加使用 SQL Command添加数据,您必须精通 SQL Command的语法,
因此其复杂程度较使用 RecordSet对象高,是属于专业层级的人使用。
添加数据的 SQL语法有两种写法,兹分述如下:
34
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
● 格式一
INSERT INTO tablename VALUES(value1,value2,...)
此种格式的用法较简单,但是使用限制较多。因为在添加数据时,字段的值必须依照表当初创建时的字段顺序排列 (天啊 ! 谁记得当初创建表的字段顺序 ),否则容易发生字段错置导致数据不正确的情形,或发生数据类型不符的情形 (将文本存至数字字段 )。
● 格式二
INSERT INTO tablename(field1,field2,...)
VALUES(value1,value2,...)
这种格式的语法较为复杂,但是使用起来较为浅显易懂,只要字段与值的顺序互相对应,就可以正常地操作。因此这种写法较常为程序设计员所采用。
35
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
为了示范数据库添加的方法,我们利用 SQL的 INSERT INTO语法,在北风数据库的 Customers表中添加一条记录。 ASP添加数据的原始程序代码( ch8-6.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "INSERT INTO Customers"
SQL = SQL + " (CustomerID,CompanyName,ContactName,ContactTitle,City)"
SQL = SQL + " VALUES('海河 ','海河摄影艺术会 ','高笑明 ','摄影记者 ','天津 ')"
On Error Resume Next
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Response.Write("Insert complete.")
Else
Response.Write("Insert fail!")
End If
Set rs = Nothing
Set Conn = Nothing
%>
36
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
当直接使用 SQL进行数据库的访问时,若数据的值出现单引号或其他特殊字符,可能导致执行时发生错误。例如:
SQL = "INSERT INTO Customers VALUES(" ' & CustID & "',"'
& CustName & "',"' & Note & "') "
当 CustID="10001",CustName="hlfjob"及 Note="It?s good."时
( Note字段内容出现单引号),则 SQL字符串的内容如下:
INSERT INTO Customers VALUES('10001','hlfjob','It's good.')
此时由于 Note字段多了一个单引号,因此在执行 SQL Command
的时候,会发生 SQL语法错误的情形。因此建议初学者采用
RecordSet的访问方法。
37
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
2,更新在 SQL语法中,更新数据库的用法如下:
UPDATE tablename SET field1 = value1,field2 =
value2,...WHERE condition
当 UPDATE未附带条件式时,它会针对表中所有的记录进行更新,这种操作较适合成批的更新。例如教师人员明年的调薪幅度为
3%,则使用 SQL更新数据库的语法如下:
UPDATE staff SET Salary = Salary * 1.03
若仅是针对特定人员调薪,则必须指定调薪的条件。例如总经理的薪水由每月 80万调整为 40万,则调整的 SQL语法如下:
UPDATE staff SET salary = 400000 WHERE staff_name='高琪 '
38
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
若为了安全起见,我们可以将 SQL写得更为严谨,以避免有错误的情形发生。我们可将上述的 SQL语法改为如下,如此就能确保更正操作可正确执行。
UPDATE staff SET salary = 400000
WHERE staff_name='高琪 ' AND Salary = 800000
39
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
为了让用户了解 UPDATE数据库的用法,我们以上面的添加示例为例,为您示范如何使用 SQL更新数据库中的数据。更正数据的
ASP的程序代码 (ch8-7.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "UPDATE Customers SET City = '天津 ' WHERE CustomerID='ALFKI'"
On Error Resume Next
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Response.Write("Update complete.")
Else
Response.Write("Update fail!")
End If
Set rs = Nothing
Set Conn = Nothing
%>
40
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
3,删除使用 SQL删除数据的杀伤力很大,因此在使用上要非常小心!
因为只要一个不小心,将可能会造成数据全毁的下场。实际上,我们常犯的错误是未指定删除的条件,导致数据全部被删除。例如:
DELETE FROM Customers
下面是我们将上面添加的数据 (海河摄影艺术会 ),从数据库中删除的范例。详细的 ASP程序代码 (ch8-8.asp)如下:
41
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "DELETE FROM Customers WHERE CustomerID='海河 '"
On Error Resume Next
Set rs = Conn.Execute(SQL)
If Err.Number = 0 Then
Response.Write("Delete complete.")
Else
Response.Write("Delete fail!")
End If
Set rs = Nothing
Set Conn = Nothing
%>
说明:在上面的语法中,DELETE FROM 常被写成 DELETE
* FROM,这在 SQL Server中是不被允许的。
42
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
4,查询利用 SQL Command 执行查询是使用 SQL访问数据库最简单的一件事了,因为它的语法比采用 RecordSet对象的方式更为简洁 (您可以与 RecordSet的查询程序比较 )。范例程序 (ch8-9.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=northwind;
Server=(Local);uid=sa;pwd="
SQL = "SELECT * FROM Customers"
On Error Resume Next
Set rs = Conn.Execute(SQL)
Response.Write("<TABLE BORDER=1>")
Response.Write("<TR BGCOLOR=cyan>")
Response.Write("<TD>CustomerID</TD>")
43
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
ch8-9.asp (续 )
Response.Write("<TD>CompanyName</TD>")
Response.Write("</TR>")
RecCount = 0
Do While not rs.eof
RecCount = RecCount + 1
If RecCount Mod 2 = 0 Then
BGColor = "#eeeeee"
Else
BGColor = "#ffffff"
End If
Response.Write("<TR BGCOLOR=" & BGColor & ">")
Response.Write("<TD>" & rs("CustomerID") & "</TD>")
Response.Write("<TD>" & rs("CompanyName") & "</TD>")
Response.Write("</TR>")
rs.MoveNext
Loop
Response.Write("</TABLE>")
Set rs = Nothing
Set Conn = Nothing
%>
44
8.4 数据库基本操作
8.4.2 利用 SQL Command访问 SQL Server
上述程序执行结果如下图所示。
45
8.5 注册成为会员要实现网站自动增加会员人数的功能,就必须设计一个会员登录数据系统,用来登录个人的基本数据。
只要在网站上登录个人基本数据,就可以注册成为会员。某网站新用户注册的网页如下图所示。
46
8.5 注册成为会员该网页的 HTML代码 (newuser.htm)为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>新用户注册 </title>
<style type="text/css"><!--
.style1 {color,#0000FF}
.style2 {color,#FF0000}.style5 {font-size,large; color,#FF0000; font-family,"隶书 "; font-style,italic; }
--></style>
</head>
<body><p class="style1 style5">新用户注册 </p>
<p class="style1">请输入您的用户名及密码等相关信息( <span class="style2">﹡ </span>为必填项目)
</p>
<form name="form1" method="post" action="register.asp"><p>用户名
<input name="uid" type="text" id="uid">
47
8.5 注册成为会员
newuser.htm (续 ):
<span class="style2">﹡ </span> </p>
<p>密码<input name="pwd" type="text" id="pwd">
<span class="style2">﹡ </span></p>
<p>确认密码<input name="repwd" type="text" id="repwd">
<span class="style2">﹡ </span> </p>
<p>姓名<input name="name" type="text" id="name">
<span class="style2">﹡ </span></p><p>性别
<input type="radio" name="sex" value="男 ">男
<input type="radio" name="sex" value="女 ">女 </p><p>出生日期
<input name="birthday" type="text" id="birthday"><span class="style1">输入格式,y/mm/dd</span></p>
<p>
<input type="submit" name="Submit" value="注册 "><input type="reset" name="clear" value="重写 "> </p>
</form></body>
</html>
48
8.5 注册成为会员当用户填好相关信息后按 钮,提交给 register.asp,若填写内容正确则显示“注册成功!”,并可进入登录页面,如下图所示。
register.asp程序代码为:
<%@ Language=VBScript %>
<% Response.buffer=true %>
<%
dim uid
dim pwd
49
8.5 注册成为会员
register.asp程序代码 (续 ):
dim repwd
dim name
dim sex
dim birthday
dim conn
dim rs
dim sqlstr
uid=lcase(trim(request.Form("uid")))
pwd=lcase(trim(request.Form("pwd")))
repwd=lcase(trim(request.Form("repwd")))
name=lcase(trim(request.Form("name")))
birthday=lcase(trim(request.Form("birthday")))
select case Request.Form("sex")
case"男 "
sex="男 "
case"女 "
sex="女 "
end select
if uid="" or pwd="" or repwd="" or name="" then
response.write"<html><head><title>出错提示 </title
50
8.5 注册成为会员
register.asp程序代码 (续 ):
<meta http-equiv='Content-Type'
content='text/html';charset=gb2312'></head>"
response.write"<body bgcolor='#ffcc99'>
<table width='364'cellpadding='10'align='center'><tr align='center'><td>"
response.Write"<p>对不起,带 *号为必须填写项目 </p>"
response.Write"<p><a href='newuser.htm'>单击此处进行修改 </a></p>"
response.write"</td></tr></table></body></html>"
response.end
end if
if repwd<>pwd then
response.write"<html><head><title>密码错误 </title>
<meta http-equiv='Content-Type?
content='text/html';charset=gb2312'></head>"
response.write"<body bgcolor='#ffcc99'>
<table width='364'cellpadding='10'align='center'><tr align='center'><td>"
response.Write"<p>对不起,您输入的密码不正确 </p>"
response.Write"<p><a href='newuser.htm'>单击此处进行修改 </a></p>"
response.write"</td></tr></table></body></html>"
response.end
end if
51
8.5 注册成为会员
register.asp程序代码 (续 ):
set conn=Server.CreateObject("ADODB.Connection")
Conn.Open "Driver=SQL Server;Database=hlfjob;Server=(Local);uid=sa;pwd="
'验证登录者的身份
Function ValidPersonal(uid,pwd)
SQL = "SELECT uid,pwd,name FROM Resume WHERE uid='" + uid + "?
AND pwd='" + pwd + "' AND name='" + name + "'"
Set rs = Conn.Execute(SQL)
If rs.Eof Then
ValidPersonal = False
Else
ValidPersonal = True
End If
End Function
set rs=server.createobject("adodb.recordset")
sqlstr="SELECT * FROM Resume where Resume.uid='" & uid & "'"
rs.open sqlstr,conn
if not rs.eof then
response.write"<html><head><title>出错提示 </title>
<meta http-equiv='Content-Type' content='text/html';charset=gb2312'></head>"
response.write"<body bgcolor='#ffcc99'>
52
8.5 注册成为会员
register.asp程序代码 (续 ):
<table width='364'cellpadding='10'align='center'><tr align='center'><td>"
response.Write"<p>对不起,您输入的名字已被注册 </p>"
response.Write"<p><a href='newuser.htm'>单击此处进行修改 </a></p>"
response.write"</td></tr></table></body></html>"
response.end
else
conn.Execute("INSERT INTO Resume(uid,pwd,name) VALUES ('"& uid
&"','"& pwd &"','"& name &"')")
end if
%>
<html>
<head>
<meta name="GENERATOR" Content="Microsoft Visual Studio,NET 7.1">
</head>
<body>
<div align="center"><span class="style1">注册成功 !</span>
<a href="login.htm">登录请按此键 </a></div>
</body>
</html>
53
8.5 注册成为会员在该登录数据系统设计中,会员在填写个人信息时必须填写用户名、密码、确认密码和姓名,作为日后查询应聘机会时,系统辨认会员身份之用。至于非会员,虽然也可以查询应聘机会,但是只提供招聘信息的部分内容 (隐藏重要的部分 ),以吸引个人注册成为会员,这是网站行销的手法之一。
54
8.5 注册成为会员
8.5.1 会员登录的身份验证
8.5.2 会员登录的陷阱
8.5.3 如何防止非会员利用 URL闯入会员专区
8.5.4 如何动态切换网页
8.5.5 密码更改
8.5.6 忘记密码的处理
55
8.5 注册成为会员
8.5.1 会员登录的身份验证当用户填写会员数据并成为会员之后,数据库中已经拥有会员的相关信息 (例如用户名及密码等 )。日后当用户连上本网站并进入会员专区时,系统会自动要求会员输入用户名及密码,以便进行用户身份的确认。 hlfjob人才求职网的会员登录页面如下图所示。
56
8.5 注册成为会员
8.5.1 会员登录的身份验证
login,htm代码为:
<html>
<head>
<style type="text/css">
<!--
.topic { font-family,"宋体 ";font-size,11 pt;
vertical-align:middle; line-height:16pt}
.small { font-family,"宋体 ";
font-size,9 pt; vertical-align:middle;line-height:16pt}
input { font-family,"宋体 ";
font-size,9 pt; 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:normal}
.style1 {
color,#990000;
font-weight,bold;
font-family,"宋体 "; }
57
8.5 注册成为会员
8.5.1 会员登录的身份验证
login,htm代码 (续 ):
.style2 {color,#CC0000}
-->
</style>
<title>登录,Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF">
<div align="center" class="style1 style2">会员登录 </div>
<form action="login.asp" method="post">
<table align="center" border="1" cellspacing="0" cellpadding="1"
bordercolorlight="#cccccc" bordercolordark="#FFFFFF"
bgcolor="#f2fdfd">
<tr bgcolor="#FFEFBF">
<td colspan=4 align="center" class=topic>请直接输入您的 </td>
</tr>
<tr bgcolor="#EAEAF4" class=small>
<td align=right nowrap> 用户名 </td>
<td> <input type="text" name="uid" size="16"
58
8.5 注册成为会员
8.5.1 会员登录的身份验证当用户输入用户名及密码之后,按下 钮执行 Login.asp页面所包含的程序,进行登录操作,登录的 ASP程序代码直接读取履历表
(Resume),检查用户名与密码是否存在于履历表中。若表中存在相同的用户名及密码,即代表登录的用户为会员,然后以 Session对象记录会员的用户名、密码及姓名后,进入会员专区 (pvip.htm),否则显示错误信息 (mvipb.htm)。会员登录的 ASP程序代码 (Login.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server}; Database=hlfjob;Server=(Local);uid=sa;pwd="
Function ValidPersonal(uid,pwd)
SQL = "SELECT uid,pwd,name FROM Resume WHERE uid='" + uid + "' AND
pwd='" + pwd + "'"
Set rs = Conn.Execute(SQL)
If rs.Eof Then
ValidPersonal = False
Else
ValidPersonal = True
End If
End Function
59
8.5 注册成为会员
8.5.1 会员登录的身份验证
Login.asp (续 ):
uid = Request("uid")
pwd = Request("pwd")
'若为合法会员 (用户名及密码存在于数据库 )
If ValidPersonal(uid,pwd) = True Then
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("pvip.htm")
Else
Response.Redirect("mvipb.htm")
End If
Set rs = Nothing
Set Conn = Nothing
%>
60
8.5 注册成为会员
8.5.2 会员登录的陷阱数据类型也可能会导致程序发生错误,原因是疏忽数据类型的特性所导致的,其中最常见的就是固定长度字符 CHAR(n)与变动长度字符 VARCHAR(n)数据类型的差异。在数据库中若我们将密码声明为
CHAR(8),则当会员密码的长度小于 8码时 (例如 asp 2000),则存入数据库中的值变成,asp 2000,。也就是数据库系统会自动以空格符补满密码字段,造成日后会员登录,输入密码,asp 2000”时,SQL的
SELECT语句比较,asp 2000”不等于,asp 2000,的情况,发生合法会员却无法登录的情形。解决这一问题的方式,有下列两种:
● 修改 pwd字段,将数据类型改为变动长,例如 VARCHAR(8)。
● 不改变数据库字段,但是在必须修改 SQL的 SELECT语句,将密码补满 8个字符,就可避免发生找不到会员数据的问题了。例如:
uid = uid + space(8-len(uid)) '以空格符补满
pwd = pwd + space(8-len(pwd)) '以空格符补满
SQL = "SELECT uid,pwd,name FROM Resume "
SQL = SQL + "WHERE uid = '" + uid + " ' AND pwd = '" + pwd + " '"
61
8.5 注册成为会员
8.5.3 如何防止非会员利用 URL闯入会员专区一般浏览器均提供类似 IE的收藏功能。为了防止会员将登录后的 URL告知其亲朋好友,取得与会员同样的信息来源,我们必须在会员的服务专区中加入判断用户是否经过正常渠道 (会员登录 )进入的验证,若用户经由 Bookmark或直接输入 URL而欲进入会员专区时,系统会自动将画面切换至会员登录的画面,完成入口管制的功能。使用此项服务我们可以利用 Session对象中的变量 Logined来判断。假如 Session("Logined“)的值为 Yes,代表会员是经由正常渠道登录的,否则即为非法用户。相关的程序代码片段如下:
<%
If Session("Logined") = False Then '非正常渠道登录
Response.Redirect("login.htm") '切换至 login.htm网页
End If
:
%>
62
8.5 注册成为会员
8.5.4 如何动态切换网页上面提到用户若尚未登录时,系统会自动切换至会员登录的画面。假如登录的画面为 Login.htm,则我们可以使用 Response对象的 Redirect方法,将网页重定向至 Login.htm,即可以完成画面切换的操作。但是本项操作有一个前提,那就是在做输出重定向 (Redirect)
之前,不能出现任何的 HTML的 Tag,因为输出重定向的命令必须置于 http的 Request标题 (Header)。若在
Redirect之前已经输出 HTML,则 Header会自动被填入默认的标题。
63
8.5 注册成为会员
8.5.4 如何动态切换网页
● 错误的示范
<HTML>
<BODY>
<%
If Session("Logined") = False Then
Response.Redirect("login.htm")
End If
:
%>
:
</BODY>
</HTML>
64
8.5 注册成为会员
8.5.4 如何动态切换网页
● 正确的示范
<%
If Session("Logined") = False Then
Response.Redirect("login.htm")
End If
:
%>
<HTML>
<BODY>
:
</BODY>
</HTML>
当上述的 If条件成立时,ASP程序会自动将网页切换至会员登录的网页 (login.htm),让用户按照正常渠道登录系统。
65
8.5 注册成为会员
8.5.5 密码更改在会员服务中,密码更改是不可或缺的功能。通常用户更改密码的原因不外乎系统要求用户更改 ( 例如系统设置每半年必须更改一次密码、或用户第一次登录时须更改密码 ),或用户发现密码有外泄的疑虑时。密码更改的网页如下图所示。
66
8.5 注册成为会员
8.5.5 密码更改该网页的 HTML的源代码 (recipher.htm)如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>更改密码 </title>
<style type="text/css">
<!--
.style2 {
font-family,"隶书 ";
font-size,24px;
color,#000000;
}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="recipher.asp">
67
8.5 注册成为会员
8.5.5 密码更改
recipher.htm (续 ):
<p> <span class="style2">更改密码 </span></p>
<p>请输入用户名:
<input type="text" name="uid"></p>
<p>请输入原密码:
<input type="password" name="pwd"></p>
<p>请输入新密码:
<input type="password" name="pwd1"></p>
<p>请确认输入新密码:
<input type="password" name="pwd2">
</p>
<p>
<input type="submit" name="Submit" value="确认 ">
<input type="reset" name="Submit2" value="重填 ">
</p>
</form>
</body>
</html>
68
8.5 注册成为会员
8.5.5 密码更改通常系统设计时,程序设计员会基于减少数据库负荷的考虑,
将用户密码置于 Session对象的变量中。例如 Session(“pwd”),待用户更改密码时,只要核对旧密码是否与 Session(“pwd”)的值一致,即可确定密码无误,省掉须再次读取数据库的验证工作;至于新密码则考虑密码输入时,不显示内容的原因 (在网页的输入区只显示,·”或
,*”字符 ),因此必须以再输入一次新密码的方式确认,避免用户误触其他按键而导致密码更改后,下次再进入系统时,因密码错误
(永久忘记 )所造成的密码丢失。更改密码后,单击 按钮,提交给
recipher.asp,其 ASP程序代码见下页:
69
8.5 注册成为会员
8.5.5 密码更改
recipher.asp:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=hlfjob; Server=(Local);uid=sa;pwd="
'密码更改函数 Passwd
Function Passwd(pwd1,pwd2)
On Error Resume Next
If pwd1=pwd2 Then
SQL = "UPDATE Resume SET pwd = '" + pwd1 + "' 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
'旧密码相同,且两次新密码一致
70
8.5 注册成为会员
8.5.5 密码更改
recipher.asp(续 ):
If Session("pwd")=Request("pwd") and Request("pwd1")=Request("pwd2") Then
'将数据库中的密码改为新密码
If Passwd(Request("pwd1"),Request("pwd2")) = True Then
Result = True
Else
Result = False
End If
Else
Result = False
End If
If Result = True Then
Session("pwd") = Request("pwd1")
'Session("pwd") = 新的密码
Response.Redirect("ciphersucceed.htm")
'显示密码更改成功网页
Else
Response.Redirect("cipherbaulk.htm")
'显示密码更改失败网页
End If
Set rs = nothing
Set Conn = nothing
%>
71
8.5 注册成为会员
8.5.6 忘记密码的处理为了满足会员的需求,很多网站开始把忘记密码的服务搬上网络,让用户自行上网查询密码,以降低配置服务人员的成本。
忘记密码的做法原则上是利用会员原先留存的数据,要求用户输入先前所登录的会员数据供系统验证,如右图所示,待输入的相关字段验证无误后,再将密码通过原留存的 E-mail 账号发给用户或在线上显示密码。考虑到在线显示密码的安全,一般会搭配使用 SSL 安全机制,以确保密码不会在线上传输时曝光。
72
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 HTML程序 forgetpwd.htm代码为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>忘记密码 </title>
<style type="text/css">
<!--
.style1 {color,#FF0000}
.style2 {color,#0000FF}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="forgetpwd.asp">
<p class=“style1”>亲爱的用户,为了确保您的权益,因此请您输入一些个人的基本资料,来得知您的密码,谢谢! </p>
<p><span class="style2">请输入您的姓名,</span>
<input type="text" name="name"> </p>
73
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 HTML程序 forgetpwd.htm代码 (续 ):
<p><span class="style2">请输入您的用户名,</span>
<input type="text" name="uid"></p>
<p><span class="style2">请输入您的出生年、月、日,</span>
<input name="yymmdd" type="text" size="17" maxlength="17"> </p>
<p><span class="style2">请输入您的电话号码,</span>
<input name="teln" type="text" size="23"> </p>
<p><span class="style2">请输入您的 E-Mail</span>:
<input type="radio" name="br1" value="0">
<input name="email" type="text" size="20"> </p>
<p>
<input type="radio" name="br1" value="1">
<span class="style2">我没有 E-Mail</span></p>
<p>
<input type="submit" name="Submit" value="确定 ">
<input type="reset" name="reset" value="重新设定 "> </p>
</form>
</body>
</html>
74
8.5 注册成为会员
8.5.6 忘记密码的处理当系统要求的字段输入完毕,并按下确定按钮后,ASP程序将自动比对用户输入的信息是否正确,在正确无误的条件下,程序将密码显示于画面上 (为了安全起见,可将此改为以 E-mail将密码发给用户 )。忘记密码的 ASP程序 (forgetpwd.asp)如下:
<%
dim Conn,rs
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={SQL Server};Database=hlfjob;Server=(Local);uid=sa;pwd="
Function GetUserInfo(uid)
If Request("rb1")="0" Then
femail="email"
Else
femail=""
End If
SQL = "SELECT uid,pwd,name,birthday,br1,teln" + femail + " FROM Resume WHERE "
SQL = SQL + "uid='" + uid + "' AND "
SQL = SQL + "name='" + Request("name") + "' AND "
SQL = SQL + "birthday='" + Request("yymmdd") + "' AND "
SQL = SQL + "br1='" + Request("br1") + "' AND "
75
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 ASP程序 forgetpwd.asp (续 ),
SQL = SQL + "teln='" + Request("teln") + "' "
If Request("br1")="0" Then
SQL = SQL + "AND email='" + Request("email") + "'"
End If
Set rs = Conn.Execute(SQL)
If rs.Eof = False Then
GetUserInfo = True
Else
GetUserInfo = False
End If
End Function
%>
<% If GetUserInfo(Request("uid")) = True Then %>
<% Response.Redirect(“wripwd.htm”) %>?wripwd.htm为通知用户已找到密码网页或以 E-Mail将密码寄出,或将密码显示于画面上。
<% Else %>
<font color=red>错误! </font>
<hr size=1>
输入的数据与原先登录时的不一致。
76
8.5 注册成为会员
8.5.6 忘记密码的处理忘记密码的 ASP程序 forgetpwd.asp (续 ),
请返回 <a href="javascript:history.back(1)">上一页 </a>,查明后再重新输入。
<%
End If
Set rs = Nothing
Set Conn = Nothing
%>
说明:网页上有“后退”的超级链接。通常设计员会直接将上一页的网页名称置于 Hyperlink中,但是此种写法有一个缺点,那就是每次都必须指定网页名称。现在有一种写法可以解决上述的问题,
那就是使用 JavaScript来处理。例如:
<a href="javascript:history,Back(1) ">后退 </a>。
77
8.6 如何将文本文件导入 SQL
Server 2000数据库文本文件是最通用的数据交换格式。任何的平台都可以轻易的读取文本文件的格式,因此有许多数据均是以文本文件的类型进行交换,尤其是大型主机的数据要转给个人计算机的数据库使用时。 SQL Server 2000提供的数据转换服务 (Data Transformation Services)提供数据导入 /导出向导,可轻易地将文本文件导入 SQL Server数据库。
为了让读者了解 SQL Server数据导入的功能,下面我们以自行定义的 eweb2000数据库的 NewsPaper表为例
(表结构见下页表 ),为读者示范将文本文件导入数据库的操作。
78
8.6 如何将文本文件导入 SQL
Server 2000数据库操作步骤:
( 1)进入 SQL Server 2000的企业管理器 (Enterprise Manager),展开
eweb2000数据库,并将光标移至 NewsPaper表上。单击鼠标右键,
选取“所有任务 \导入数据”命令,如下图所示。
字段名称 数据类型 长 度
EMail varchar 50
Status char 1
79
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 2)打开,DTS导入 /导出向导”,请单击 按钮,如下图 a所示。
( 3),DTS导入 /导出向导”可轻易地将文件 (文本文件、数据库及
Excel等 )转换至数据库中。在导入的过程中的第一个步骤,我们必须指定数据源,如下图 b所示。
图 a 图 b
80
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 4)请将“数据源”选项的内容改为“文本文件”项目;然后点选
“文件名”旁边的 按钮。
( 5)打开“选择文件”窗口,然后指定导入的文本文件 (本例为
c:\maillist.txt),最后单击 按钮,如下图 a所示。
( 6)回到选择数据源窗口后,单击 按钮,如下图 b所示。
图 a 图 b
81
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 7 ) 在指定数据来源之后,接下来,DTS 导入 /导出向导
(Import/Export Wizard)”会要求用户定义数据的格式,其中包括字段间的分隔字符,文件的类型 (ANSI),每条数据的分隔字符
({CR},{LF})及文本前后是否以双引号包起来等设置 。 由于文本文件的格式只有两个字段,请以逗点,,,为分隔字符,单击按钮,如下图所示 。
82
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 8) 这个画面主要设置文本文件字段间的分隔字符 。 由于
c:\maillist.txt是以逗号,,,为分隔字符 (故窗口中出现 Col001及
Col002两个字段及部分数据范例 ),请选取,逗号,单选项,单击按钮,如下图所示 。
83
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 9) 接下来要设置导入数据库的相关参数 。 在本例中请点选目的地 (Destination)选项中的,用于 SQL Server 的 Microsoft OLE DB提供程序 (Microsoft OLE DB Provider for SQL Server)”项目,登录数据库采用 Windows 身份认证的方式登录 SQL Server数据库 (若采用
SQL Server身份验证须输入登录的 Username及 Password),并在指定导入的数据库 (eweb2000)后,单击 按钮,如下图所示 。
84
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 10) 在指定导入的数据库后,接下来必须指定导入哪一个表
(Table)。 在本范例为 NewsPaper表,因此请点选,目的,表下拉列表框中的,NewsPaper”表,单击 按钮,如下图所示 。
85
8.6 如何将文本文件导入 SQL
Server 2000数据库说明:若您想了解数据导入相对应的字段,请点选上图中
Transform字段的 按钮,启动,列映射和转换,,如下图所示,
您可以看到文本文件与数据库字段对照的情形 。
86
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 11)在下图 a所示的画面中,我们可以定义 DTS导入 /导出向导何时执行转换操作或将此定义存成 DTS包文件供日后使用,请勾选
“立即运行”复选框,然后单击 按钮。
( 12)我们已经完成 DTS 导入 /导出向导的相关定义,然后请单击按钮,如下图 b所示。
图 a 图 b
87
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 13)系统依据先前的定义将数据由文本文件加载数据库,并显示如图 a所示导入结果。 DTS已成功的将文本文件导入 SQL Server,
单击 按钮,如图 a所示。
( 14)在“正在执行包”窗口的状态中,看到导入成功的条数,
本范例为完成 (7),代表转换成功条数为 7条,请单击 按钮,
回到企业管理器窗口,如图 b所示。
图 a 图 b
88
8.6 如何将文本文件导入 SQL
Server 2000数据库
( 15)当我们回到企业管理器窗口,我们可以在 NewsPaper表上右击,点选“打开表 /返回所有行”命令,查看所有数据导入的情形,
如下图所示。
看到这里,您就会了解 SQL Server的威力。通过 DTS导入 /导出向导我们可以轻轻松松将文本文件导入数据库,而且连一行的程序代码都不用写,您说是不是太神奇了。这种处处为用户考虑的思维方式,不正是微软能称霸 Windows平台的原因之一吗!
89
8.7 如何将 SQL Server 2000的数据转到文本文件前面提及文本文件是数据交换的最通用格式之一,但不知道您是否想像过 SQL Server 2000这种大型数据库,它的数据如何转成可交换的文本文件格式呢? 或许有些会写程序的人说,写一段小的程序将数据导出来就可以了。但是有没有方法可以不写程序就可以完成这项工作呢? 或许就没有人想过了。
SQL Server 2000易学易用的特色,着实给数据库的老大哥们
(如 Oracle,Informix及 Sybase等 )上了一课,并且让数据库管理员的工作负荷减轻不少,更赢得了 Windows NT平台占有率的第一名,
创造了进入市场最晚但占有率最高的奇迹。在 SQL Server 2000中,
DTS服务除提供导入 (Import)以外,还提供导出 (Export)的功能。通过 DTS 导入 /导出向导 (Import /Export Wizard),我们可以将 SQL
Server 2000的数据轻易地转成其他的数据库 (Oracle,Informix,...)
格式,另外更可以转成文本文件格式。
下面我们将一步一步地带领您实践 SQL Server 2000导出数据至文本文件的操作:
90
8.7 如何将 SQL Server 2000的数据转到文本文件操作步骤:
( 1)进入企业管理器窗口,然后查看导出的表内容 (本例我们使用前一个范例的表 NewsPaper),如下图 a所示。
( 2)请在 NewsPaper表上,单击鼠标右键,点选“所有任务 \导出数据”命令,如下图 b所示。
图 a 图 b
91
8.7 如何将 SQL Server 2000的数据转到文本文件
( 3)启动 DTS导入 /导出向导,请单击 按钮,如图 a所示。
( 4)请指定 DTS导入 /导出向导要导出的数据来源。数据源的地方请指定数据库的驱动程序名称,在此为用于 SQL Server的 Microsoft
OLE DB提供程序,服务器在本例为 (local) (若 SQL Server在别的主机,请自行修正 );至于 SQL Server 用户的登录认证,我们可选用
Windows 的身份验证或 SQL Server的身份验证 ( 须输入 Username及
Password );最后设置数据库选项中的数据库名称为 eweb2000,单击 按钮,如图 b所示。
图 a 图 b
92
8.7 如何将 SQL Server 2000的数据转到文本文件
( 5) 在指定完数据库后,接下来请指定数据库导出的目的地 。 由于本例为文本文件,因此目的地选项请指定为文本文件,至于下方的文件名可指定任何合法的文件名称,原则上扩展文件名以,txt为最好 。 本例为 D:\MyASP\chapter8\maillist.txt,单击 按钮,如下图所示 。
93
8.7 如何将 SQL Server 2000的数据转到文本文件
( 6) 在本窗口中,我们可以看到数据是由 Microsoft SQL Server转至 Flat File(文本文件为 Flat File的一种 ),单击 按钮,如下图所示 。
说明:我们也可以指定将文件抄写到文本文件中,或以 SQL查询语言指定所导出的数据条件 (在导出部分数据时特别有用 ),在本例中我们来用整个数据表导出的方式,故点选第一个选项 。
94
8.7 如何将 SQL Server 2000的数据转到文本文件
( 7) 下图这个画面主要供指定导出的文本文件格式,相关的参数说明见下页:
95
8.7 如何将 SQL Server 2000的数据转到文本文件带分隔符,选用字段分隔字符方式,导出的每条数据格式为变长。
通常此种格式最适用于 Visual Basic及 Excel等软件。
固定字段,字段数据以固定长度的方式导出,以方便其他程序语言的导入,例如大型主机使用的 Cobol语言。
文件类型,指定文件的类型,文件类型可以是 ANSI,Oem及
Unicode。本例我们采用标准文本文件格式,因此选用 ANSI选项。
若您有 Unicode的需求,请改为 Unicode。
行分隔符,每条数据的分隔字符,分隔字符选项有 {CR}{LF},{CR}
及 {LF}三种。在 Dos/Windows平台上,文本文件中每条数据的分隔字符有两个字节,分别是 ASCII的 13{CR}及 10{LF}。若数据要与
Unix平台做数据交换,请将此设置改为 {LF}。因为 Unix的文本文件每条记录( Record)的分隔字符为 ASCII 10{LF},Mac操作系统的分隔字符为 {CR}。
96
8.7 如何将 SQL Server 2000的数据转到文本文件列分隔符,此参数用以指定字段间的分隔字符,可能的选项有下列三种:
● 逗号
● 冒号
● 定位字符文本限定符,指定导出文本字段的合法表示方式,默认值为双引号。但本例中我们使用 <无 >(<none>)。
第一行含有列名称,若选中时,输出文件的第一列复选框为字段名称。
97
8.7 如何将 SQL Server 2000的数据转到文本文件
( 8)至此我们已经完成 DTS导入 /导出向导的设置,接下来我们可以定义 DTS导入 /导出向导何时执行转换操作,或将此定义存成 DTS包
(DTS Package)文件供日后使用。在本例为立即运行,请选中“立即运行”复选框,然后按 钮,如下图 a所示。
( 9)我们已经完成 DTS导入 /导出向导的相关定义,请按 钮,
如下图 b所示。
图 a 图 b
98
8.7 如何将 SQL Server 2000的数据转到文本文件
( 10)系统依据先前的定义将表 NewsPaper导出至文本文件
(D:\MyASP\chapter8\maillist.txt),单击 按钮,如下图 a所示。
( 11)我们可以在正在执行包窗口的状态中,看到导出的成功记录的数目。本范例为完成 (7),代表导出成功记录数目为 7条,然后请单击 按钮,回到企业管理器窗口,如下图 b所示。
图 a 图 b
99
8.7 如何将 SQL Server 2000的数据转到文本文件
(12)导出完毕,我们可以使用,记事本,打开文本文件
D:\MyASP\chapter8\maillist.txt,查看一下成果,DTS 导入 /导出向导导出的格式如下图所示 。
虽然导入 /导出的介绍与 ASP较为无关,但实际运用上还是会用到,因此我们在此做一个简单的介绍 。
10
0
第 8章 ASP与 SQL Server
ASP 提供的是一种编程语言,数据库是用来存储程序中用到的数据。本章主要介绍了 SQL Server数据库的建立与访问方法,以及利用 ASP和 SQL Server开发数据库应用程序的方法。
101
第 8章 ASP与 SQL Server
习题
1,请编写一会员忘记密码的处理,将密码改用 e-Mail(SMTP)
方式发给用户。
2,请自己以记事本建立一个文本文件,然后试着以 Import
Data… 导入 SQL Server数据库中 (数据库请自行建立 )。
3,请自行利用 SQL Server内建的北风数据库,实践 Export
Data… 的功能。