提高浏览器的调试能力
问题的提出
通常我们可以用浏览器(最好用 IE 5.0以上版本)调试页面,以排除程序中的错误。不过,在开发实践中,笔者发现浏览器对 ASP页面的调试能力不太理想,尤其是当 ASP页面中含有对数据库操作的脚本代码时,效果更不理想。
例如,某个程序中含有如下代码段:
<%
strConnString =“ Provider=SQLOLEDB.1;Password=mypassword;”&“ Persist Security Info=True;User ID=myuid;”&“ Initial Catalog=mydbname;”&“ Data Source=myserver;Connect Timeout=15”
Set conn1 = Server.CreateObject(“ ADODB.Connection” )
Conn1.Open strConnString
q=“ insert into students (xm,xh) values(‘张三’ ,‘ S001’ )”
conn1.Execute (q)
% >
此段代码首先建立起连接对象 conn1与 mydbname数据库的连接,然后向学生表( students)中插入姓名( xm)为“张三”、学号( xh)为“ S001”的记录。假如学生表中学号为“主键”,且表中已有学号为“ S001”的记录存在,那么这一插入操作必定会因主键冲突而出错。但是,当我们用浏览器浏览该页面时,浏览器只会提示该页面的第 8行(即 conn1.Execute (q)行)出错,并不会告诉我们究竟具体发生了什么错误。因此,在大部分情况下,我们不得不再借助于 Visual IntDev 6.0内嵌的查询分析工具( Query)或 SQL Server的查询分析器等工具来做进一步的调试,不过,这样做往往比较费时、费力。所以,如何直接提高浏览器的调试能力,就成为解决问题的关键。
问题的解决
为提高浏览器的调试能力,我们可以利用它的输出功能,在 ASP页面中插入一段捕获 ADO错误的代码,这样就可以让浏览器清楚地告诉我们究竟发生了什么。修改后代码如下:
<%
strConnString =“ Provider=SQLOLEDB.1;Password=mypassword;”&“ Persist Security Info=True;User ID=myuid;”&“ Initial Catalog=mydbname;”&“ Data Source=myserver;Connect Timeout=15”
Set conn1 = Server.CreateObject(“ ADODB.Connection” )
Conn1.Open strConnString
’屏蔽浏览器的错误提示功能
on error resume next
q=“ insert into students(xm,xh) values(‘张三’ ,‘ S001’ )”
conn1.Execute (q)
’枚举连接对象 conn1的错误集合并显示每个 Error对象的属性
For Each errLoop In conn1.Errors
strError =“ Error#”& errLoop.Number& vbCr&“”& errLoop.Description& vbCr&“ (Source:”& errLoop.Source&“ )”& vbCr&“ (SQL State:”& errLoop.SQLState&“ )”& vbCr&“ (NativeError:”& errLoop.NativeError&“ )”& vbCr
If errLoop.HelpFile =“” Then
strError = strError&“ No help file available”& vbCr& vbCr
Else
strError = strError&“ (HelpFile:”& errLoop.HelpFile&“ )”& vbCr&“ (HelpContext:”& errLoop.HelpContext&“ )”& vbCr& vbCr
End If
’输出错误信息
Response.Write strError
Next
% >
上述 For~ Next循环中的代码捕获 ADO连接对象 conn1的 Errors集合中的所有错误对象( Error对象)。这些 Error对象的属性包括:
●Number属性表示用于唯一标识 Error对象的数字;
●Description属性表示与 Error对象相关联的说明性字符串;
●SQLState属性表示给定 Error对象的 SQL状态;
●NativeError属性表示给定 Error对象或特定提供者的错误代码;
●Source属性表示产生错误的原始对象或应用程序的名称。
浏览器把这些属性显示在窗口中,这样我们就能清楚地知道究竟发生了什么错误。
在 Error对象的诸多属性中, Description属性包含错误说明信息,查看这一属性,基本上可以知道错误的原因,为简化代码,也可以只查看这一属性。
此外,通过捕获 ADO错误,还可以向用户给出有用的提示信息。例如,当用户录入重复的学号时,我们可以给他合适的提示。代码如下:
<%
’屏蔽浏览器的错误提示功能
on error resume next
strConnString =“ Provider=SQLOLEDB.1;Password=mypassword;”&“ Persist Security Info=True;User ID=myuid;”&“ Initial Catalog=mydbname;”&“ Data Source=myserver;Connect Timeout=15”
Set conn1 = Server.CreateObject(“ ADODB.Connection” )
Conn1.Open strConnString
’检查数据库连接,出错则给出提示
For Each errLoop In conn1.Errors
If errLoop.NativeError=6 then% >
<script language=vbscript>
<!--
alert "数据库可能已停止运行,请和数据库管理员联系!"
//-->
</script>
<% End If
If errLoop.NativeError=0 then% >
<script language=vbscript>
<!--
alert "数据库连接有问题,请和web站点管理员联系!"
window.history.back 1
//-->
</script>
<% End If
Next
q=“ insert into students(xm,xh) values(‘张三’ ,‘ S001’ )”
conn1.Execute (q)
’判断是否存在主键冲突,存在则给出警告
For Each errLoop In cnn1.Errors
If errLoop.NativeError=2627 then% >
<script language=vbscript>
<!--
alert "学好已经存在,请重新输入!"
//-->
</script>
<% End If
Next
% >
这样,就可以通过浏览器提示用户,其操作有什么问题,以利于用户改正。其中错误号表示:
●NativeError=6的错误是由 Net Library返回的错误号,错误来自于底层的网络软件;
●NativeError=0的错误是由驱动程序返回的错误号,错误来自于数据库驱动程序(如 SQL Server Driver);
●NativeError=2627的错误是由 SQL Server返回的错误号,错误来自于数据源。
关于 SQL Server返回的错误信息,如果想获得更详细的信息,请查看 SQL Server 7.0 sysmessages系统表( select error,description from sysmessages)。
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论