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)。
|