應用程式資料庫的唯一性限制式並在asp中捕捉資料庫的錯誤

來源:互聯網
上載者:User
錯誤|資料|資料庫     本文中所提到的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>
            



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。