选择显示字体大小

应用数据库的唯一性约束并在asp中捕捉数据库的错误

本文中所提到的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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons