第三章：一个数据库版本的简单留言簿

在前两章我们介绍了文件版本的留言簿，现在我们不妨来设想一下：如果留言文件里面的留言很多，而你又急于想寻找其中的某条留言时，这时打开txt留言文件，对着一段段的留言记录，你敢担保你不会当场晕倒吗？而且文件留言簿最令人讨厌还远不只是这个原因，更气人的是：譬如你已经找到了你要找的留言，而且是非要将其删除不可（当然是因为那段留言竟毫不留情地往你脸上抹黑的缘由啦），那么此时其余想对你大发赞赏之言的朋友，就会因为你正在做留言删除的操作而不能留言了。看，这有多可惜！不过，你也无须叹气，虽然留言文件不能供多人共用，但是改成数据库来管理留言记录，当你在做删除留言的期间，访问者的留言还是可以加进来的。既然数据库留言簿能对你的系统如此照顾入微，我们现在就事不宜迟，立即来揭开她的庐山真面目。

至于如何建立自已的数据库版本的留言簿，我们还是通过分步骤的方法来说明吧。要编写一个数据库版本的留言簿，我们大致可以从以下三个步骤来完成。
步骤一：使用Access先建立用来存放留言的数据表。（当然，如果你想使你的数据库能很好地工作在高需求、高质量的Web应用程序的客户-服务器数据库，而且无论是在性能还是在可靠性上都能经受得起严格的考验，那么你最好是用服务器等级的数据库，如：SQL server、Oracle等。对于非服务器等级的数据库，我推荐使用Access中文版来建立。凡是用Access来建立的数据表，都是以.mdb为后缀名，如：book0.mdb。)
Access的界面非常友好，操作也非常简便，相信聪明的读者们，即使以往从未用过Access的，只要动手试试，也定能很快对其驽驾自如，所以我在这里也就不再赘述（当然也不排除有那么几分懒惰的成份）。

步骤二：设计一个留言表单的网页也同样是不可或缺的（如：guestbook0.htm)。

步骤三：又到编写处理留言的ASP程序了。（我们可以将下述代码COPY下来，然后另存为manage0a.asp文件。）
< !--#include file="adovbs.inc" -->
'调用adovbs.inc文件，所谓inc 文件顾名思义是include file的意思,adovbs.inc是IIS/PWS所提供的文件，存放着ADO相关常数的定义，使用inc文件可以使我们的程序，增加可读性，更易于开发和维护。
< % Function SqlStr( data )
SqlStr = "'" & Replace( data, "'", "''" ) & "'"
End Function
'这里用了SqlStr函数，其作用是将数据中的一个单引号改成两个单引号，并且在前后加上单引号。之所以要用该函数是由于上网者输入的数据必须以用单引号括起来的形式'输入的数据'与Insert Into命令组合在一起，但是如果用户输入的数据含有单引号，则'输入的数据'将会产生错误，因此输入的数据必须经过SqlStr的切换（将单引号切换成两个单引号）才是正确的。
Name = Request("Name")
Tel=Request("Tel")
Email = Request("Email")
Subject = Request("Subject")
Memo = Request("Memo")
'从留言表单取得数据
If Name = "" Or Tel="" Or Email = "" Or Subject = "" Or Memo = "" Then Response.Write "输入框不能为空白!"
Response.End
End If
'检查表单的各输入框是否有信息输入，若留有空输入框没填则显示说明信息："输入框不能为空白!" 并停止执行下面的程序。
Set conn = Server.CreateObject("ADODB.Connection")
'用Server.CreateObject取得对象ADODB.Connection。因为在ASP中，如果要访问数据必须首先创建与数据库的链接，因此建立连接是存取Web数据库不可缺少的步骤，执行以上语句之后，conn便是一个 Connection对象。
DBPath = Server.MapPath("book0.mdb")
'通过调用服务器对象的MapPath方法来获取book0.mdb的完整路径。
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
'因为我们想打开的是Access(.mdb)数据库，所以我们要透过Access的ODBC驱动程序{Microsoft Access Driver (*.mdb)}来存取数据库，dbp参数则是用来指定想打开的数据库文件，因为它必须是完整路径名称，所以我们上一语句用了Server.MapPath 函数 。
Name = Left( Name, 40 )
Tel = Left(Tel,10)
Email = Left( Email, 80 )
Subject = Left( Subject, 127 )
'截短输入到各字段里数据的长度，以避免因输入到某一字段中的数据超长而引发的错误，当然假如我们将数据库book0.mdb中的各字段的数据类型都有设为“备注”，我们则再无需担心上网者所输入的数据有多长。
sql = "Insert Into GuestBook (姓名, 电话, Email, 主题, 留言) Values( "
sql = sql & SqlStr(Name) & ", "
sql = sql & SqlStr(Tel) & ", "
sql = sql & SqlStr(Email) & ", "
sql = sql & SqlStr(Subject) & ", "
sql = sql & SqlStr(Memo) & ")"
'在"guestbook"数据表中增加一个数据记录，然后把其中的各字段 (姓名, 电话, Email, 主题, 留言)分别设置成从留言表单上取下的对应的数据。
conn.Execute sql
'执行sql指令。
%>