






















首先:不要问我为何还要用ASP来解释,也不要问我为何不用ASP.NET。因为我这里只讨论ASP+XML。虽然ASP已经被ASP.NET所代替,但我仍然为ASP的简单易用、功能强大而着迷,也许是我比较笨吧。:) ![]()
好了,闲话少说,进入正题了。
一、 为何会选择用XML?
不知大家有没有这样的体会,无论用什么工具,与数据库打交道速度始终是一个问题,特别是涉及到多个表的复杂查询,就算你用存储过程,第一次执行的速度也是非常之慢的。而存储过程返回的数据集,又与普通的RecordSet有很大的区别,不支持光标、不支持分页、不支持记录集统计…。而假设我一定要用XML,也一定要对返回的结果再进行分页、查询、并存储起来多次利用,怎么办?解决方法:1、可以在数据库中建立表保存查询结果集;2、换个思路,用文件的形式储存查询结果集。第一种方法,我想绝大多数的人不会选。第二种方式,简单、直接,且被ADO支持,特别是使用XML文件格式保存,使用方法更与和数据库交互没有什么两样。
二、 如何使用XML?
假设在ASP程序中已经能正确调用数据库存储过程,接下来该如何做?
1、 按行返回存储过程结果集
Set CmdSP = Server.CreateObject(“AdoDb.Command”)
CmdSP.Commandtype = adCmdStoredProc
……
‘其它参数
Set Rs = CmdSP.Execute
2、 存储为XML文件
(1)、设计文件名:要使工作自动化,当然文件名也需要自动化,目的是要使相同查询条件的存储过程只执行一次,以便让查询结果给N个人N多次反复使用。为了能重复利用,通过连接N个参数(条件)作为文件名来判断是否执行过同等条件的存储过程。
(2)、在保存为文件之前先判断文件是否存在,如果存在就不执行存储过程并且不保存为文件,而直接使用先前已存储的XML文件,除非指定了重新生成查询文件的条件。
Function IsFileExists(sfilename)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists(sfilename)) Then
IsFileExists=true
Else
IsFileExists=false
End If
set fso=nothing
End Function
if IsFileExists(sFileName) = False then
call openCmdSP ‘打开存储过程
Rs.Save sFileName ,adPersistXML
Rs.close
Set rs = nothing
end if
3、 使用持久XML文件来重新建立 Recordset 对象
Set Rs = Server.CreateObject("AdoDB.RecordSet")
rs.open sFileName,conn, 1, 1,adCmdFile
注意参数adCmdFile,如果open 中的source为文件路径的话,就一定要加adCmdFile,否则会出错
4、 使用重新建立的Recordset对象
用Rs.Open source,adCursorType, adLockType, cmdFile形式打开持久XML文件建立的Recordset对象,与普通recordset对象的使用并无什么不同。如:
分页:
rs.pageSize = MaxPerPage
totalpages = Rs.PageCount
rs.Absolutepage = Currentpage
rscount = rs.recordcount
赋值:
firstname = rs(“firstname”)
lastname = rs(“lastname”)
过滤:
rs.filter = “age>30”
三、 结语
通过建立XML持久文件,让存储过程的结果集能重复使用,大大加快了数据库查询速度、提升了程序交互的性能,并解决了存储过程结果集不能分页,在结果集中再过滤条件等一系列使用上的问题。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。