欢迎光临
我们一直在努力

ASP 3.0高级编程(四十)

建站超值云服务器,限时71元/月

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的灵活性所在,可以根据当前的情况,以及对当前任务的适用性选择使用任一种对象。

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

9.1.1 返回一个记录集

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

connection.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方法也有一些可选参数,如表9-2所示:

表9-2 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命令,并且保证不会创建新的记录集。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP 3.0高级编程(四十)
分享到: 更多 (0)