提高浏览器的调试能力
发表于:2007-06-30来源:作者:点击数:
标签:
FrontPage 2000和 Visual IntDev 6.0是微软公司提供的 开发 Web工程的有力工具,它们能大大提高 程序员 的工作效率。我们可以用 FrontPage 2000设计制作网页界面,用 Visual IntDev 6.0给网页添加 VB Script或 Java Script脚本程序,以及在网页中嵌入 COM组件
FrontPage 2000和 Visual IntDev 6.0是微软公司提供的
开发 Web工程的有力工具,它们能大大提高
程序员的工作效率。我们可以用 FrontPage 2000设计制作网页界面,用 Visual IntDev 6.0给网页添加
VBScript或 Java Script脚本程序,以及在网页中嵌入 COM组件,使之成为功能强大的 ASP页面。
问题的提出
通常我们可以用浏览器(最好用 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)。
原文转自:http://www.ltesting.net