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