优秀的软件开发团队:深圳升蓝软件 数据库开发 .Net技术  |  ASP技术 PHP技术 JSP技术 应用技术类     
热门推荐
升蓝OA办公自动化系统
基于.Net技术的网络
协同办公环境
 
ASP基础
数据库相关
安全加密
全文检索
ASP应用
打印相关
客户端相关
XML相关
系统相关
正则表达式
ASP技巧
组件开发
脚本编码
FSO专题
邮件相关
远程脚本
性能优化
 
相关链接
深圳升蓝软件:系统集成、办公自动化平台、电子商务、电子政务、Web数据库、企业网站、游戏、手机应用程序、CDMA软件、电子出版物等,为客户提供优秀的解决方案
 
升蓝(www.hi-blue.com)为企业管理、政府办公提供成熟的、易于实施的IT技术服务,我们的解决方案包括OA办公自动化系统CRM客户关系管理系统ERP企业生产管理和订单管理系统电子政务系统、知识管理系统、企业门户、商业智能、工程项目管理等等...
 
电子政务解决方案
塑料/橡胶管理系统
知识管理系统简介
多媒体光盘方案
ERP企业资源管理
订单计划管理系统
PM工程项目管理系统
会员管理系统
相关资料下载
OA办公自动化系统
CRM客户关系管理系统
在线试用版本说明
OA 系统的用户手册
 
 
 
 
升蓝开发团队 > 技术资料 > ASP技术 > 数据库相关 : 应用数据库的唯一性约束并在asp中捕捉数据库的错误

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


March 25,2004
    本文中所提到的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
数据库开发 | .Net技术 | ASP技术 | PHP技术 | JSP技术 | 应用技术类 | 升蓝开发小组
Copyright ? 2001-2004 Shenzhen Hi-blue Software Team 升蓝开发小组 All rights reserved