在本章,与以往有所不同的是,我希望向你介绍在使用RecordSet对象的Open方法时,游标类型和锁定类型的参数方法传递的另一种方法,即直接指定常量名。以往,我们使用过如下代码:rs.Open sql,conn,1,1,这里我们可以使用:rs.Open sql,conn, adOpenForwardOnly, adLockReadOnly来代替,当然,两种方法其实都是类似的,你按照自己的喜好选择一种即可。
不过,如果使用制定常量名的方式,那么我们必须引入ado的常量库,我前面曾提到过这个问题,你有两种方法,第一种是复制adovbs.inc文件到你站点的目录,并且用<!--#include file="adovbs.inc"-->代码来引入,而另外一种方法就是使用METADATA方法引入typelib,这里我们在数据库文件中使用了后者。
本章数据库链接文件conn.asp如下:
<%
'定义变量
Dim oConn,sConn,sPath
'设定数据库文件路径
sPath = "data.mdb"
'设定数据链接字符串
sConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(sPath)
'建立数据库链接对象的实例oConn
Set oConn=Server.CreateObject("Adodb.Connection")
'打开数据连接
oConn.open sConn
%>
在本章,仍然和上一章一样的,建立了include/function.asp文件用来存放程序中常用的函数,这里大多数函数和上一章的相同(实际上,这是我常用的函数库J),但是新增了如下几个函数来帮我们完成程序:
l PostBack()函数
此函数代码如下:
Function PostBack()
'如果请求方式为POST
If UCase(Trim(Request.ServerVariables("REQUEST_METHOD"))) = "POST" Then
'则返回True
PostBack = True
Else
'否则返回False
PostBack = False
End If
End Function
在前面的章节中,我们大量使用了代码:
If UCase(Trim(Request.ServerVariables("REQUEST_METHOD"))) = "POST" Then
来判断页面的请求方式,从而将表单处理和显示部分分开,这里我们不妨将其编写为函数,在使用时,可以简化为:If PostBack() Then了。
l GenRadomString()函数
此函数代码如下:
Function GenRadomString(Length)
dim i, tempS, v
dim c(39)
tempS = ""
'将数组c的各个元素定义为可用的随机字符,这里我们选取所有小写字母和0-9的数字
c(1) = "a": c(2) = "b": c(3) = "c": c(4) = "d": c(5) = "e": c(6) = "f": c(7) = "g"
c(8) = "h": c(9) = "i": c(10) = "j": c(11) = "k": c(12) = "l": c(13) = "m": c(14) = "n"
c(15) = "o": c(16) = "p": c(17) = "q": c(18) = "r": c(19) = "s": c(20) = "t": c(21) = "u"
c(22) = "v": c(23) = "w": c(24) = "x": c(25) = "y": c(26) = "z": c(27) = "1": c(28) = "2"
c(29) = "3": c(30) = "4": c(31) = "5": c(32) = "6": c(33) = "7": c(34) = "8": c(35) = "9"
If isNumeric(Length) = False Then
Response.Write "A numeric datatype was not submitted to this function."
Exit Function
End If
'进行Length次循环,以生成Length长度的随机字符串
For i = 1 to Length
'建立一个随机种子
Randomize
'通过Rnd生成随机数,并将其处理,以从数组的36个元素中选取
v = Int((35 * Rnd) + 1)
tempS = tempS & c(v)
Next
GenRadomString = tempS
End Function
在编写程序时,常常需要生成一段随机字符串,例如本案例中的密码找回部分,密钥的生成,因此我写了一个生成随机字符串的函数GenRadomString,此函数有一个参数length,用来指定要生成的随机字符串的长度。
本函数的原理是,首先生成一个数组,用来存放a-z的字母和0-9的数字,而后进行length次循环,在循环体中,生成随机数,随即取出数组中一个元素,作为该位置的随机字符,循环完毕后,就会得到一个指定长度的随机字符串。
l SendMail()过程
此过程代码如下:
Sub SendMail(strrecipient,strSubject,strContent)
SendMailByJmail strRecipient,strSubject,strContent
End Sub
由于本章需要在服务器上发送邮件,因此需要设计一个发送邮件的函数。此函数实际上是直接调用我们在第三章介绍的通过Jmail组件发送邮件的函数SendMailByJmail。你也可以扩展此函数,加入判断服务器上多种邮件组件,并调用存在的组件来发送邮件。
l CloseDb()过程
此过程代码如下:
Sub CloseDb()
'遇到错误则继续运行
On Error Resume Next
'如果oRs是一个对象,则说明其已经被设定为记录集对象的实例,则此时进行处理
If IsObject(oRs) Then
'如果记录集的状态为打开,则关闭
If oRs.State = 1 Then
oRs.Close
End If
'清空对象
Set oRs = Nothing
End If
'如果oConn是一个对象,则说明其已经被设定为数据链接对象的实例,则此时进行处理
If IsObject(oConn) Then
'如果数据链接的状态为打开,则关闭
If oConn.State = 1 Then
oConn.Close
End If
'清空对象
Set oConn = Nothing
End If
End Sub
在上一章中,我们为了维护系统的资源不被已经结束的数据处理占用,在每一次使用完毕后均要关闭记录集或者数据连接,并将对象置空,因此为了简便,本案例设计了过程CloseDB,用来完成这一操作。
请注意,在过程的开始部分我们使用了容错代码On Error Resume Next,这是因为,在调用这个过程时,你可能已经由于某种原因关闭并置空了记录集或数据连接对象,如果不加入此容错代码,则会因为已经关闭而发生错误。
l ShowSuccess ()过程和ShowError()过程
在页面处理中,我们经常需要用到对用户提示操作成果或者操作失败的一些操作,因此这里使用了公用过程来完成。
ShowSuccess()过程代码如下:
Sub ShowSuccess(strMessage)
'关闭数据库
CloseDb()
'重定向
Response.Redirect("Success.asp?Msg=" & Server.UrlENCode(strMessage))
End Sub
这里程序首先调用CloseDb()过程来关闭数据连接,而后使用Response.Redirect方法将页面跳转到成果提示页Success.asp,同时通过QueryString变量来传递要提示的信息。
ShowError()过程与此类似,只不过是跳转到Error.asp页面。
在系统中,我们在多个页面都可能调用显示图片列表或者相册列表,并显示,这样,如果我们希望对其显示的HTML代码进行改动,则十分麻烦,因此我建立了显示样式的一个“函数库”,在这里定义了相应的过程,用来打开记录集后循环调用,进行显示的处理。
首先来看显示相册部分的过程,此过程定义在include/def/album.asp文件中,代码如下:
Sub ShowAlbum(ByVal lngAlbumID,ByVal strAlbumName,ByVal strAlbumCover)
'显示列表中的图片
'如果相册封面图片为空
If Trim(strAlbumCover & "") = "" Then
'则设定其为默认封面图片
strAlbumCover = "images/default-cover.png"
End If
Response.Write("<li><a href=""list.asp?AlbumID=" & lngAlbumID & """ title=""相册:" & strAlbumName & """><img src=""" & strAlbumCover & """ /></a><p>" & strAlbumName & "</p></li>") & vbCrLf
End Sub
可以看到,此过程接受相册编号(lngAlbumID)、相册名称(strAlbumName)和相册封面图片(strAlbumCover)三个参数,并显示HTML代码,这里还有一个判断,如果strAlbumCover参数为空,那么我们将其设定为一个默认的相册封面图片的地址。
类似的,显示图片列表的过程,定义在include/def/list.asp文件中,代码如下:
Sub ShowPhotoThumb(lngPhotoID,strPhotoName,strPhotoUrl,strUserNickName,strPhotoAddTime)
'显示列表中的图片
'如果用户没有设定昵称
If Trim(strUserNickName & "") = "" Then strUserNickName = "没有设定昵称的用户"
Response.Write("<li><a href=""view.asp?PhotoID=" & lngPhotoID & """ title=""图片名称:" & strPhotoName & vbCrLf & "由" & strUserNickName & vbCrLf & "上传于:" & strPhotoAddTime & """><img src=""" & strPhotoUrl & """ /></a></li>") & vbCrLf
End Sub
此过程接受如下参数:
lngPhotoID:图片编号
strPhotoName:图片名称
strPhotoUrl:图片地址
strUserNickName:图片上传者的昵称
strPhotoAddTime:图片上传时间
本案例使用了Prototype+script.aculo.us的JavaScript框架来实现AJAX和页面特殊效果的显示,相应文件放置在js/lib/目录中。除此之外,还使用了上一案例中使用的diag.js文件,另外,为了增强效果,还使用了lightbox.js和star.js文件,这些我们将在后面的部分进行具体讲解。
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛