"dsn=employees;uid=sa;pwd=;"
FetchEmploymentStatusList = rs.GetRows() ‘' 以数组返回数据
rs.Close
Set rs = Nothing
End Function
对上面示例的进一步改进应当是缓存该列表的 HTML,而不是缓存数组。下面是一个简单的范例:
‘' 取记录集,以"HTML 选项"列表返回
Function FetchEmploymentStatusList
Dim rs, fldName, s
Set rs = createObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
s = "<select name=""EmploymentStatus">" & vbCrLf
Set fldName = rs.Fields("StatusName") ‘' ADO 字段绑定
Do Until rs.EOF
‘' 下面一行违背了不要进行字符串连接,
‘' 但这是可以的,因为我们正在建立高速缓存
s = s & " <option>" & fldName & "</option>" & vbCrLf
rs.MoveNext
Loop
s = s & "</select>" & vbCrLf
rs.Close
Set rs = Nothing ‘' 参见尽早释放
FetchEmploymentStatusList = s ‘' 以字符串返回数据
End Function
在正常的情况下,可以在 Application 或 Session 作用域中缓存 ADO 记录集本身。有两个警告:
ADO 必须为标记的自由线程
必须使用断开连接的记录集。
如果不能保证满足这两个要求,请不要缓存 ADO 记录集。在下面的非灵活组件和不要缓存连接技巧中,我们将讨论在 Application 或 Session 作用域中存储 COM 对象的危险。
如果在 Application 或 Session 作用域中存储数据,这些数据将一直保留在那儿,直到在程序中改变它、Session 过期或 Web 应用程序重新启动时为止。数据需要更新如何处理?若要用手工强制更新应用程序数据,可以调用只允许管理员访问的数据更新 ASP 页。另外,还可以通过函数,周期地自动刷新数据。下面的示例存储带缓存数据的时间戳,在指定时间间隔后刷新数据。
<%
‘' 未显示错误处理...
Const update_INTERVAL = 300 ‘' 刷新时间间隔,以秒计
‘' 函数返回雇佣状态列表
Function GetEmploymentStatusList
updateEmploymentStatus
GetEmploymentStatusList = Application("EmploymentStatusList")
End Function
‘' 定期更新缓存的数据
Sub updateEmploymentStatusList
Dim d, strLastupdate
strLastupdate = Application("Lastupdate")
If (strLastupdate = "") or _
(update_INTERVAL DateDiff("s", strLastupdate, Now)) Then
‘' 注意:此处可能有两个或多个调用。这是可以的,只不过
‘' 产生几个不必要的取指令罢了(就此有一个工作区)
‘' FetchEmploymentStatusList 函数(不显示)
‘' 从 DB 中取数据,返回一个数组
d = FetchEmploymentStatusList()
‘' 更新 Application 对象。用 Application.Lock()
‘' 来确保一致的数据
Application.Lock
Application("EmploymentStatusList") = d
Application("Lastupdate") = CStr(Now)