• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    應用數據庫的唯一性約束并在asp中捕捉數據庫的錯誤

    發布: 2007-7-14 19:37 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 17次 | 進入軟件測試論壇討論

    領測軟件測試網 本文中所提到的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


    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>