ASP技巧TOP10 (1)

---摘自互联网
1、避免使用DSN连接数据库
是否仍旧在使用ODBC系统或文件DSN连接数据库？请用OLEDB提供者代替它，这是一种速度更快而且不需要使用DSN的数据库连接技术。使用OLEDB提供者，你不必再为了创建系统DSN恳求ISP（或数据库管理员/网站管理员），也不必为了网站文件位置的变化而修改配置。
问：
我看到过大量通过数据资源名字（DSN）连接数据库的例子，不过我现在想不通过DSN连接数据库。在ASP中可以实现这一点吗？能否举几个具体的例子说明？我希望新的连接方法不依赖于系统DSN，但又可以在数据库连接串中指定驱动程序、服务器名字、数据库、数据库账号和密码。
答：
如果你使用的是SQL Server 7，请使用下面的数据库连接串：
strConnString = "DSN='';DRIVER={SQL SERVER};" & _
"UID=myuid;PWD=mypwd;" & _
"DATABASE=MyDb;SERVER=MyServer;"
其中最重要的参数在于“DRIVER=”部分。如果你希望绕过ODBC，直接通过OLEDB访问SQL Server（一般来讲这种方法速度更快），请使用下面这种连接串：
strConnString ="Provider=SQLOLEDB.1;Password=mypassword;" & _
"Persist Security Info=True;User ID=myuid;" & _
"Initial Catalog=mydbname;" & _
"Data Source=myserver;Connect Timeout=15"
如果你要使用数据库连接串，但又不熟悉OLEDB提供者的连接串语法，请使用Visual Basic的数据环境设计器或ADO数据控件创建一个，然后把它拷贝出来用于ADO连接对象就可以了。在立即窗口中，输入命令? dataenvironment1.connection1.ConnectionString可以得到连接串的代码。请注意Microsoft Access连接串的语法有所不同，参见《Syntax for DSN-Less Connection for MS Access》
参见：《ASP性能优化指南》中的数据库连接部分。
2、记录集中记录总数的计算
1062
刚开始在ASP页面中使用记录集的时候可能经常会遇到这个问题。如果你想访问记录集中的数据，首先必须保证记录集中确实包含数据。请记住，如果记录集中没有数据，系统将显示非常不友好的运行时错误信息。你可以使用下面的代码去解决这种问题。
问：
我已经有数年的VB经验，但刚刚开始学习ASP和VBScript。现在我要打开一个Access数据库，计算其中的记录总数并在Web页面中显示这些信息。数据库的名字叫sean.mdb，其中包含一个people表，表中有三个记录。然而，当我运行脚本时它总是说有-1个记录。
是否可以告诉我下面的代码什么地方出错了？
< %
Set objConn = Server.CreateObject("ADODB.Connection")
Set objRst = Server.CreateObject("ADODB.Recordset")
objConn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=
" & Server.Mappath("seannewelldbsean.mdb"))
strSQL = "SELECT * FROM people"
objRst.Open strSQL, objConn
Response.write( "< P >" & strSQL & "< /P >" )
Response.write("< H2 >There are " & objRst.RecordCount &
" People in the database< /H2 >")
If objRst.RecordCount > 0 Then
objRst.MoveFirst
Do While Not objRst.EOF
Response.write( "Name = " & objRst.fields(0) )
objRst.MoveNext
Loop
else
Response.write( "It's EMPTY!" )
End If
objRst.Close
Set objRst = Nothing
objConn.Close
Set objConn = Nothing
% >
答：
在低版本的MDAC中RecordCount属性返回-1。请在你的服务器上把MDAC文件更新到最新的版本，最新的MDAC文件可以在www.microsoft.com/data找到。
如果Web服务器由ISP管理而你又无权配置它，无法升级MDAC文件，那么必须修改代码。
原来使用下面的代码检查记录集中是否有记录：
If objRst.RecordCount > 0 Then ...
请改用下面的代码：
If objRst.BOF and objRst.EOF Then
' 记录集为空
Else
Do While not objRst.EOF
' 处理记录集
objRst.MoveNext
Loop
End If
2000年06月30日更新，新西兰的Daryl Egarr说：
可以看出，读者提问中的代码并没有错误。问题在于“在低版本的MDAC中RecordCount属性返回-1”，这一判断本身并没有错误，然而从提问内容来看作者不应该作出这种假定，因为原问题中没有任何一行代码意味着使用了低版本的MDAC。
作者考虑问题的方向不对，问题的要点在于并非所有的游标类型都支持所有的属性和方法（不管采用哪种数据库系统）。问题中代码出现错误的真正原因在于使用默认的CursorLocation时：
Recordset.CursorLocation = adUseServer
RecordCount属性只有在记录集的CursorType为1或者3（即adOpenKeyset，adOpenStatic）时才是可用的。出现错误的代码没有指定CursorType，也就是使用了0类型的游标（即adOpenForwardOnly，这是速度最快的游标类型），此时对RecordCount的引用将一直返回0。
解决问题的方法很简单，只要把原来代码中的：
objRst.Open strSQL, objConn
改成：
objRst.Open strSQL, objConn ,1