8.5.1 Errors集合
Errors集合包含由单个ADO命令的执行而引起的每一个错误的Error对象。使用Errors集合的原因是由于在一个命令的执行过程中,可能会引起多个错误,OLE DB提供者需要提供一种方式通知客户方已有多个错误发生。
关于Errors集合有两个重要的地方需要注意:
? 每次执行ADO命令,如果发生错误,就清空错误集,同时代之以新的错误内容。当然,如果没有错误发生,Errors集合不会受到影响。所以,即使ADO命令成功执行,这个集合中也可能含有错误信息。
? OLE DB提供者可能会将包含信息的消息或警告装入Errors集合,错误号为0。所以不能只检查集合中的错误号而假定错误已经发生。比如,使用ODBC提供者与SQL Server连接,可能会得到一个“错误”,告知缺省的数据库已经改变了。
如果回头看一下本章开始讲到的对象模型,可能会发现Errors集合只能由Connection对象访问。读者可能会觉得奇怪,如果不显式地创建一个Connection对象,如何访问Errors集合?Recordset对象有一个ActiveConnection属性,含有当前记录集的Connection对象,这意味着可以这样得到Errors集合:
rsAuthors.ActiveConnection.Errors
如果想看发生的全部错误,则需要遍历整个Errors集合:
For Each errAuthors In rsAuthors.ActiveConnection.Errors
' Display error
Next
为了显示一些合理的错误信息,需要确切知道在Errors集合中到底有些什么。
Error对象包含表8-5所示的属性:
表8-5 Error对象的属性及说明
属 性
说 明
Number
ADO错误号
NativeError
从数据提供者获得的错误号
SQLState
连接到SQL数据库时,5位的SQL状态代码
Source
引起错误的对象
Description
错误说明文本
这意味着循环过程现在可以变成这样:
For Each errAuthors In rsAuthors.ActiveConnection.Errors
Response.Write "Number: " & errAuthors.Number & _
"<BR>NativeError: " & errAuthors.NativeError & _
"<BR>SQLState: " & errAuthors.SQLState & _
"<BR>Source: " & errAuthors.Source & _
"<BR>Description: " & errAuthors.Description & _
"<P>"
Next
8.5.2 ASP页面中的ADO错误
在第4、7章,我们研究了ASP的错误,以及如何简洁并彻底地处理这些错误。ASP 3.0的一个新特征就是自定义错误页面,但这对于ADO确实用处不大,因为脚本中的变量无法传入自定义的错误页面。这就意味着我们无法检测Errors集合。
面对这样的情况,必须提供自己的错误处理。如果你使用JScript作为服务器端编程语言,那么你将拥有新的try/catch特性,但是VBScript对于错误的处理仍然有许多不足。目前,最好的检测错误的方法是使用On Error Resume Next语句,然后在可能会引起错误的每一行ADO代码后检查Errors集合。就像这样:
<%
On Error Resume Next
Dim rsAuthors
Dim strSQL
Set rsAuthors = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT MissingColumn1, MissingColumn2, au_lname, au_fname " & _
"FROM authors"
rsAuthors.Open strSQL, strConn, adOpenDynamic, adLockOptimistic, adCmdText
If CheckForErrors (rsAuthors.ActiveConnection) = False Then
While Not rsAuthors.EOF
Response.Write rsAuthors("au_lname") & ", " & _
rsAuthors("au_fname") & "<BR>"
rsAuthors.MoveNext
Wend
End If
rsAuthors.Close
Set rsAuthors = Nothing
%>
这里可使用CheckForErrors子程序来检测是否有错误发生:
Function CheckForErrors(objConn)
Dim objError ' Error object
' Errors means the count will be greater than 0
If objConn.Errors.Count > 0 Then
' Loop through the errors
For each objError in objConn.Errors
' Eorros with number 0 are informational
If objError.number <> 0 then
Response.Write "<TABLE BORDER=1>" & _
"<TR><TD>Error Property</TD><TD>Contents</TD>" & _
"</TR><TR><TD>Number</TD><TD>" & objError.Number & _
"</TD></TR><TR><TD>NativeError</TD><TD>" & _
objError.NativeError & "</TD></TR>" & _
"<TR><TD>SQLState</TD><TD>" & objError.SQLState & _
"</TD></TR><TR><TD>Source</TD><TD>" & _
objError.Source & "</TD></TR>" & _
"<TR><TD>Description</TD><TD>" & _
objError.Description & "</TD></TR></TABLE><P>"
CheckForErrors = True
End If
Next
Else
CheckForErrors = False
End If
End Function
%>
这个程序检测是否有错误,如果有,则为每一个错误创建一个表格,并给出了如图8-11所示的结果。
图8-11 显示的错误结果
这并不是一个技术含量较高的解决方案,但确实是用VBScript所能做到的最好的解决方案。真正的不足是必须自己检测错误。
8.6 小结
现在,应该扩展基础知识,研究Command对象,理解如何使用一些高级特性去改进性能和维护ASP页面。
第9章 连接、命令和过程
上一章讨论了ADO的基础知识,内容主要涉及Recordset对象以及对数据的处理。在大多数例子中,只是通过指定数据库的表名来获取数据,但正如从对象模型中看到的,ADO还有其他允许访问数据的对象。
本章将要更详细地介绍这些对象,特别将研究以下内容:
? Connection对象,以及如何用它来获取数据和运行命令。
? Command对象,为什么需要该对象及其所具有的功能。
? 如何运行存储过程,特别是那些需要参数的存储过程。
? 一些简单的改善ADO性能的优化技巧。
? 数据整形的概念及如何使用。
如同介绍Recordset对象那样,我们不打算覆盖所涉及对象的全部方法和属性。在这里只探讨其中最重要的主题,以及那些适用于ASP开发人员的方法与属性。
9.1 Connection对象
前一章中已经提及,Connection对象是为我们与数据存储提供连接的对象,但这并非Connection对象的全部功能。除了存储连接的细节外(比如数据存储的类型,以及其支持的特性),也可以利用Connection对象运行命令。
这些命令可能是查询动作,比如更新、插入或删除操作,也可以是返回一个记录集的命令。读者可能会觉得奇怪:既然有了Recordset对象,这又有什么用?这正是ADO的灵活性所在,可以根据当前
Errors集合包含由单个ADO命令的执行而引起的每一个错误的Error对象。使用Errors集合的原因是由于在一个命令的执行过程中,可能会引起多个错误,OLE DB提供者需要提供一种方式通知客户方已有多个错误发生。
关于Errors集合有两个重要的地方需要注意:
? 每次执行ADO命令,如果发生错误,就清空错误集,同时代之以新的错误内容。当然,如果没有错误发生,Errors集合不会受到影响。所以,即使ADO命令成功执行,这个集合中也可能含有错误信息。
? OLE DB提供者可能会将包含信息的消息或警告装入Errors集合,错误号为0。所以不能只检查集合中的错误号而假定错误已经发生。比如,使用ODBC提供者与SQL Server连接,可能会得到一个“错误”,告知缺省的数据库已经改变了。
如果回头看一下本章开始讲到的对象模型,可能会发现Errors集合只能由Connection对象访问。读者可能会觉得奇怪,如果不显式地创建一个Connection对象,如何访问Errors集合?Recordset对象有一个ActiveConnection属性,含有当前记录集的Connection对象,这意味着可以这样得到Errors集合:
rsAuthors.ActiveConnection.Errors
如果想看发生的全部错误,则需要遍历整个Errors集合:
For Each errAuthors In rsAuthors.ActiveConnection.Errors
' Display error
Next
为了显示一些合理的错误信息,需要确切知道在Errors集合中到底有些什么。
Error对象包含表8-5所示的属性:
表8-5 Error对象的属性及说明
属 性
说 明
Number
ADO错误号
NativeError
从数据提供者获得的错误号
SQLState
连接到SQL数据库时,5位的SQL状态代码
Source
引起错误的对象
Description
错误说明文本
这意味着循环过程现在可以变成这样:
For Each errAuthors In rsAuthors.ActiveConnection.Errors
Response.Write "Number: " & errAuthors.Number & _
"<BR>NativeError: " & errAuthors.NativeError & _
"<BR>SQLState: " & errAuthors.SQLState & _
"<BR>Source: " & errAuthors.Source & _
"<BR>Description: " & errAuthors.Description & _
"<P>"
Next
8.5.2 ASP页面中的ADO错误
在第4、7章,我们研究了ASP的错误,以及如何简洁并彻底地处理这些错误。ASP 3.0的一个新特征就是自定义错误页面,但这对于ADO确实用处不大,因为脚本中的变量无法传入自定义的错误页面。这就意味着我们无法检测Errors集合。
面对这样的情况,必须提供自己的错误处理。如果你使用JScript作为服务器端编程语言,那么你将拥有新的try/catch特性,但是VBScript对于错误的处理仍然有许多不足。目前,最好的检测错误的方法是使用On Error Resume Next语句,然后在可能会引起错误的每一行ADO代码后检查Errors集合。就像这样:
<%
On Error Resume Next
Dim rsAuthors
Dim strSQL
Set rsAuthors = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT MissingColumn1, MissingColumn2, au_lname, au_fname " & _
"FROM authors"
rsAuthors.Open strSQL, strConn, adOpenDynamic, adLockOptimistic, adCmdText
If CheckForErrors (rsAuthors.ActiveConnection) = False Then
While Not rsAuthors.EOF
Response.Write rsAuthors("au_lname") & ", " & _
rsAuthors("au_fname") & "<BR>"
rsAuthors.MoveNext
Wend
End If
rsAuthors.Close
Set rsAuthors = Nothing
%>
这里可使用CheckForErrors子程序来检测是否有错误发生:
Function CheckForErrors(objConn)
Dim objError ' Error object
' Errors means the count will be greater than 0
If objConn.Errors.Count > 0 Then
' Loop through the errors
For each objError in objConn.Errors
' Eorros with number 0 are informational
If objError.number <> 0 then
Response.Write "<TABLE BORDER=1>" & _
"<TR><TD>Error Property</TD><TD>Contents</TD>" & _
"</TR><TR><TD>Number</TD><TD>" & objError.Number & _
"</TD></TR><TR><TD>NativeError</TD><TD>" & _
objError.NativeError & "</TD></TR>" & _
"<TR><TD>SQLState</TD><TD>" & objError.SQLState & _
"</TD></TR><TR><TD>Source</TD><TD>" & _
objError.Source & "</TD></TR>" & _
"<TR><TD>Description</TD><TD>" & _
objError.Description & "</TD></TR></TABLE><P>"
CheckForErrors = True
End If
Next
Else
CheckForErrors = False
End If
End Function
%>
这个程序检测是否有错误,如果有,则为每一个错误创建一个表格,并给出了如图8-11所示的结果。
图8-11 显示的错误结果
这并不是一个技术含量较高的解决方案,但确实是用VBScript所能做到的最好的解决方案。真正的不足是必须自己检测错误。
8.6 小结
现在,应该扩展基础知识,研究Command对象,理解如何使用一些高级特性去改进性能和维护ASP页面。
第9章 连接、命令和过程
上一章讨论了ADO的基础知识,内容主要涉及Recordset对象以及对数据的处理。在大多数例子中,只是通过指定数据库的表名来获取数据,但正如从对象模型中看到的,ADO还有其他允许访问数据的对象。
本章将要更详细地介绍这些对象,特别将研究以下内容:
? Connection对象,以及如何用它来获取数据和运行命令。
? Command对象,为什么需要该对象及其所具有的功能。
? 如何运行存储过程,特别是那些需要参数的存储过程。
? 一些简单的改善ADO性能的优化技巧。
? 数据整形的概念及如何使用。
如同介绍Recordset对象那样,我们不打算覆盖所涉及对象的全部方法和属性。在这里只探讨其中最重要的主题,以及那些适用于ASP开发人员的方法与属性。
9.1 Connection对象
前一章中已经提及,Connection对象是为我们与数据存储提供连接的对象,但这并非Connection对象的全部功能。除了存储连接的细节外(比如数据存储的类型,以及其支持的特性),也可以利用Connection对象运行命令。
这些命令可能是查询动作,比如更新、插入或删除操作,也可以是返回一个记录集的命令。读者可能会觉得奇怪:既然有了Recordset对象,这又有什么用?这正是ADO的灵活性所在,可以根据当前