写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
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


