本文中所提到的asp页面,除特别声明外,均指<@page languege=”vbscript”>
写asp与数据库的结合的程序时,经常会遇到同一数据表中不允许存在重复值的问题,比如用户注册程序中不允许出现相同的用户id。这样的情况下,我以前采取的办法是读取数据库中的已存在值,然后与用户输入的值比较,如果有相同,则提示已被注册,须重新填写。这样做可以达到预期的目的,但是因为有一次额外的数据库存取操作,比较浪费资源。
我们都知道,数据表中的列可以设置唯一性约束,就是从数据库限制该字段不允许出现重复值,违反唯一性约束后,数据库将返回2627错误,提示“违反了 %1! 约束 ''%2!''。不能在对象 ''%4!'' 中插入重复键”,这是数据库的输出,sql server 的所有错误都存储在系统表 master.dbo.sysmessages 中。用户定义的消息也可以存储在 sysmessages 中。在asp中调用存储过程的时候,由于存储过程没有容错处理,会返回该提示到页面,并终止语句的执行,@@error返回值为0。如果页面设置了容错,则不会出现错误提示,但因为错误是数据库中出现的,所以err.number不能得到其错误号。(也可能是我的数据库不熟的原因:-),还请大虾指点)。近日研究ado,找到了一种更加简便的方式实现该控制。
ado(activex data objects)被广泛的用于应用程序与数据库的连接,asp也可以通过他来实现对数据库的操作的。ado 2.1的connection对象中有一个error对象,通过它可以捕捉到来自数据库的错误,以在asp页面中控制。该对象常用的property有如下几个,均为只读:
description:字符型,返回来自数据库的错误描述
source:字符型,错误来源
sqlstate:字符型,odbc api(驱动程序管理器)错误,sql server 2000中对其有如下描述:
sqlstate 返回的字符串值由两个字符的类值后接三个字符的子类值组成。类值 01 表明是一种警告,后跟随 sql_success_with_info 的返回代码。只要类值不是 01(im 除外),则表明是一种错误,后跟随 sql_error 的返回代码。类 im 专门用于表明从 odbc 实现产生的警告和错误。任何类中子类值 000 均用于实现给定类中所定义条件。这种类值和子类值的分配方法由 sql-92 定义。
跑题了跑题了,回到刚才的话题~~~
number:返回与错误相关联的数字值,是一个 32 位的值。较高的 16 位字是设施代码,而较低的字才是真正的错误代码。
nativeerror:这就是我们今天要用到的,msdn对他的描述是:
the nativeerror property on a error(是不是m$的bug?我英语不及格:-))object indicates the provider-specific error code for a given error object. this property returns a a long value that indicates the error code.
还有helpfile和helpcontext,都是有关帮助的,这里就不详述了。
在这里我们用到了nativeerror,用它来捕捉来自数据库的错误,他返回了该错误的编号。源程序片断如下:
<%on error resume next 'vbscript的容错
set conn = server.createobject("adodb.connection")
set rs = server.createobject("adodb.recordset")
conn.open"dsn=bbii; uid=sa; pwd="
sql="exec ch_insnovel 'd','22','33','44','55'"
'sql = "insert into novel (name,author,yy,ee)values('nn','ee','jj')",与上句效果是一样的
rs.open sql,conn
if conn.errors.count = 0 then'判断错误的个数
issucc = " 成功 "'
else
select case conn.errors.item(0).nativeerror
case 2627
issucc = "ddddddd" '你可以根据需要,定义多个自己的错误返回值
end select
end if
response.write "<br>:::"&issucc
%>
注意select case…一句中的“conn.errors.item(0).nativeerror”,返回一组item中的第一个。在我们这个例子当中,伴随2627措促同时发生的是“语句已终止”(3621),严格来讲,他不是错误,而是一般性警告(严重级别=10)。所以我们需要用来判断的是第一个错误,当然,你可以定义i = i + 1来查看所有发生的错误。这样,我们就能够知道来自sql server的错误的具体内容,可以更容易的控制了。
附:错误编号
<!—errlp.asp-->
<%on error resume next
set conn = server.createobject("adodb.connection")
conn.open "driver={sql server}; server=127.0.0.1; database=master; uid=sa; pwd="
set rs = server.createobject("adodb.recordset")
sql = "select * from sysmessages where msglangid = 2052 order by error"
rs.open sql,conn,3,2
page = clng(request("txtpage"))
rs.pagesize = 100
if page < 1 then page = 1
if page > rs.pagecount then page = rs.pagecount
rs.absolutepage = page
%>
<style>
td
{
font-family: verdana;
font-size: 10pt;
}
</style>
<div>
<form method="get">
<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#999999">
<tr>
<td width="100">总计数:<%=rs.recordcount%></td>
<td width="80">总页数:<%=rs.pagecount%></td>
<td width="90">目前页次:<%=page%></td>
<td width="80">转到<input type="text" name="txtpage" size="2" style="font-family: verdana; font-size: 8pt; border-style: solid; border-width: 1">页</td>
<td width="60">
<%
if page <> 1 then
response.write"<a href=errorlp.asp?txtpage=1>第一页</a>"%> </td>
<td width="60">
<%response.write"<a href=errorlp.asp?txtpage="&(page - 1)&">上一页</a>"%> </td>
<%
end if
if page <>rs.pagecount then%>
<td width="60">
<%response.write"<a href=errorlp.asp?txtpage="&(page + 1)&">下一页</a>"%> </td>
<td width="70"><%response.write"<a href=errorlp.asp?txtpage="&rs.pagecount&">最后一页</a>"
end if
%>
</td>
<td> </td>
</tr>
</table>
</form>
</div>
<p>
<div>
<table cellspacing="0" cellpadding="0" border="1" width="100%" bordercolor="#999999">
<tr>
<td>错误号</td>
<td>严重级别</td>
<td>dlevel</td>
<td>信息</td>
</tr>
<%for ipage = 1 to rs.pagesize%>
<tr onmouseover="javascript:this.style.background='#dddddd';" onmouseout="javascript:this.style.background='';">
<td><%=rs("error")%></td>
<td><%=rs("severity")%></td>
<td><%=rs("dlevel")%></td>
<td><%=rs("description")%></td>
</tr>
<% rs.movenext
if rs.eof then exit for
next
set rs = nothing
set conn = nothing
%>
</table>
</div>
<!--corpright by cheery_ke-->
另:有关ado2.1与conn.errors的说明,请见ms-help://ms.msdnvs.2052/dnaxctrl/html/ado_objm.htm
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器