分享
 
 
 

ASP 3.0高级编程(四十)

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

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集合中到底有些什么。

属 性

说 明

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

%>

这个程序检测是否有错误,如果有,则为每一个错误创建一个表格这并不是一个技术含量较高的解决方案,但确实是用VBScript所能做到的最好的解决方案。真正的不足是必须自己检测错误。

8.6 小结

现在,应该扩展基础知识,研究Command对象,理解如何使用一些高级特性去改进性能和维护ASP页面。

||||||第9章 连接、命令和过程

上一章讨论了ADO的基础知识,内容主要涉及Recordset对象以及对数据的处理。在大多数例子中,只是通过指定数据库的表名来获取数据,但正如从对象模型中看到的,ADO还有其他允许访问数据的对象。

本章将要更详细地介绍这些对象,特别将研究以下内容:

· Connection对象,以及如何用它来获取数据和运行命令。

· Command对象,为什么需要该对象及其所具有的功能。

· 如何运行存储过程,特别是那些需要参数的存储过程。

· 一些简单的改善ADO性能的优化技巧。

· 数据整形的概念及如何使用。

如同介绍Recordset对象那样,我们不打算覆盖所涉及对象的全部方法和属性。在这里只探讨其中最重要的主题,以及那些适用于ASP开发人员的方法与属性。

9.1 Connection对象

前一章中已经提及,Connection对象是为我们与数据存储提供连接的对象,但这并非Connection对象的全部功能。除了存储连接的细节外(比如数据存储的类型,以及其支持的特性),也可以利用Connection对象运行命令。

这些命令可能是查询动作,比如更新、插入或删除操作,也可以是返回一个记录集的命令。读者可能会觉得奇怪:既然有了Recordset对象,这又有什么用?这正是ADO的灵活性所在,可以根据当前的情况,以及对当前任务的适用性选择使用任一种对象。

从Connection对象运行的命令一般是查询动作,但了解能够得到返回的记录集也是非常有用的。

9.1.1 返回一个记录集

为了从Connection对象返回一个记录集,要使用Execute方法。语法是:

onnection.Execute CommandText, [RecordsAffected], [Options]

参数及说明如表9-1所示:

表9-1 Connection对象的Execute方法的参数及说明

参 数

说 明

CommandText

执行的命令文本。与Recordset的Open方法中的Source参数相同,也能代表一个现有的Command对象

RecordsAffected

受命令执行影响的记录数

Options

命令选项,可以是一个或多个CommandTypeEnum或ExecuteOptionEnum常数,详细的值请见上一章

Execute方法可选择地返回一个记录集,在这种情况下只要将返回值赋给记录集变量。例如:

Set conPubs = Server.CreateObject("ADODB.Connection")

conPubs.Open strConn

Set rsAuthors = conPubs.Execute("Authors")

读者可能会奇怪使用Connection对象的Execute方法与使用Recordset对象的Open方法之间到底有什么区别?看上去区别不是很大,使用Recordset对象的Open方法可以改变光标类型和锁定类型。这些选项对于Connection对象的Execute方法是不可用的,因此永远只能得到一个只能前移的、只读的记录集。

9.1.2 操作命令

如果正在运行操作命令,比如一个SQL UPDATE语句,那么可以使用RecordAffected参数找出有多少条记录受到该命令的影响。例如:

Dim strSQL As String

Dim lngRecs As Long

strSQL = "UPDATE Titles SET Price = Price * 1.10" & "WHERE Type='Business'"

conPubs.Execute strSQL, lngRecs, adCmdText

Response.Write lngRecs & " records were updated."

上述代码将所有类型为Business的书的单价增加了10%。一旦Execute命令执行完毕,受Update命令影响的记录数就返回到变量lngRecs中,这就是RecordsAffected参数。

注意,已经为命令指定了adCmdText选项,告诉ADO CommandText参数是一个文本命令。一般这不是严格必须的,其目的只是让ADO预先知道执行的命令属于何种类型,这样能够提高性能。记住,这个值可以是一个或多个CommandTypeEnum值。

无记录集返回

如果上面的例子不返回记录集,那么在Execute语句中加入另一个选项也是较好的方法:

conPubs.Execute strSQL, lngRecs, adCmdText + adExecuteNoRecords

使用adExecuteNoRecords告诉ADO执行的命令不返回任何记录。所以,ADO不必费心去创建一个记录集。如果省略了该选项,那么ADO将会创建一个空的记录集,很明显这浪费了时间,因此加上这个选项会加快语句的执行。

9.2 Command对象

Command对象特定地为处理各种类型的命令而设计,特别是那些需要参数的命令。与Connection对象相似,Command对象可以运行返回记录集和不返回记录集两种类型的命令。实际上,如果命令不含有参数,那么它并不关心是使用Connection对象,还是Command对象,还是Recordset对象。

9.2.1 返回记录集

对于一个返回记录集的命令,可使用Execute方法。然而,与Connection对象不同,必须使用CommandText属性,而不能在Execute方法中使用命令文本。

Set cmdAuthors = Server.CreateObject("ADODB.Command")

cmdAuthors.CommandText = "Authors"

Set rsAuthors = cmdAuthors.Execute

这是告诉Command对象去执行一个简单的、返回一个只读记录集的命令的最简单方法。

Execute方法也有一些可选参数

参 数

说 明

RecordsAffected

受命令影响的记录数

Parameters

参数值数值

Options

命令选项,与Recordset的Open方法中的Options选项相似

参数RecordsAffected与Options同前面解释的一样,另外也可以使用CommandType属性设置命令类型:

Set cmdAuthors = Server.CreateObject("ADODB.Command")

cmdAuthors.CommandText = "Authors"

cmdAuthors.CommandType = adCmdTable

如果不设置其他参数,也可以在Execute行上设置,必须为它们使用逗号:

Set rsAuthors = cmdAuthors.Execute(, , adCmdTable)

在本章后面处理存储过程时,将会看到参数Parameters的用途。

改变光标类型

值得注意是,使用Execute方法返回的记录集具有缺省的光标类型。这意味着这是只能前移的、只读的记录集。虽然使用Execute方法不能改变这种情况,但对这个问题有一个解决的方法。

如果需要使用一个命令,并且要求不同的光标和锁定类型,那么应该使用Recordset的Open方法,此时Command对象作为Recordset的数据源。例如:

cmdAuthors.ActiveConnection = strConn

cmdAuthors.CommandText = "Authors"

cmdAuthors.CommandType = adCmdTable

rsAuthors.Open cmdAuthors, , adOpenDynamic, adLockOptimistic

注意,在Open命令行中忽略了连接细节,因为连接设置在Command对象中。连接细节在命令打开前已经设置在Command对象的ActiveConnection属性中。

9.2.2 操作命令

对于操作命令,比如那些无记录返回的更新命令,整个过程相似,只需移去设置记录集的代码:

Set cmdUpdate = Server.CreateObject("ADODB.Command")

strSQL = "UPDATE Titles SET Price = Price * 1.10" & "WHERE Type='Business'"

cmdUpdate.ActiveConnection = strConn

cmdUpdate.CommandText = sSQL

cmdUpdate.CommandType = adCmdText

cmdUpdate.Execute , , adExecuteNoRecords

注意,我们在此设置了命令类型,然后在Execute行中增加了额外的设置选项。这段代码运行UPDATE命令,并且保证不会创建新的记录集。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有