FrontPage 2000和 Visual IntDev 6.0是微軟公司提供的開發(fā) Web工程的有力工具,它們能大大提高程序員的工作效率。我們可以用 FrontPage 2000設計制作網頁界面,用 Visual IntDev 6.0給網頁添加 VBScript或 Java Script腳本程序,以及在網頁中嵌入 COM組件,使之成為功能強大的 ASP頁面。 問題的提出 通常我們可以用瀏覽器(最好用 IE 5.0以上版本)調試頁面,以排除程序中的錯誤。不過,在開發(fā)實踐中,筆者發(fā)現(xiàn)瀏覽器對 ASP頁面的調試能力不太理想,尤其是當 ASP頁面中含有對數(shù)據(jù)庫操作的腳本代碼時,效果更不理想。 例如,某個程序中含有如下代碼段: <% strConnString =“ Provider=SQLOLEDB.1;Password=mypassword;”&“ Persist Security Info=True;User ID=myuid;”&“ Initial Catalog=mydbname;”&“ Data Source=myserver;Connect Timeout=15” Set conn1 = Server.CreateObject(“ ADODB.Connection” ) Conn1.Open strConnString q=“ insert into students (xm,xh) values(‘張三’ ,‘ S001’ )” conn1.Execute (q) % > 此段代碼首先建立起連接對象 conn1與 mydbname數(shù)據(jù)庫的連接,然后向學生表( students)中插入姓名( xm)為“張三”、學號( xh)為“ S001”的記錄。假如學生表中學號為“主鍵”,且表中已有學號為“ S001”的記錄存在,那么這一插入操作必定會因主鍵沖突而出錯。但是,當我們用瀏覽器瀏覽該頁面時,瀏覽器只會提示該頁面的第 8行(即 conn1.Execute (q)行)出錯,并不會告訴我們究竟具體發(fā)生了什么錯誤。因此,在大部分情況下,我們不得不再借助于 Visual IntDev 6.0內嵌的查詢分析工具( Query)或 SQL Server的查詢分析器等工具來做進一步的調試,不過,這樣做往往比較費時、費力。所以,如何直接提高瀏覽器的調試能力,就成為解決問題的關鍵。 問題的解決 為提高瀏覽器的調試能力,我們可以利用它的輸出功能,在 ASP頁面中插入一段捕獲 ADO錯誤的代碼,這樣就可以讓瀏覽器清楚地告訴我們究竟發(fā)生了什么。修改后代碼如下: <% strConnString =“ Provider=SQLOLEDB.1;Password=mypassword;”&“ Persist Security Info=True;User ID=myuid;”&“ Initial Catalog=mydbname;”&“ Data Source=myserver;Connect Timeout=15” Set conn1 = Server.CreateObject(“ ADODB.Connection” ) Conn1.Open strConnString ’屏蔽瀏覽器的錯誤提示功能 on error resume next q=“ insert into students(xm,xh) values(‘張三’ ,‘ S001’ )” conn1.Execute (q) ’枚舉連接對象 conn1的錯誤集合并顯示每個 Error對象的屬性 For Each errLoop In conn1.Errors strError =“ Error#”& errLoop.Number& vbCr&“”& errLoop.Description& vbCr&“ (Source:”& errLoop.Source&“ )”& vbCr&“ (SQL State:”& errLoop.SQLState&“ )”& vbCr&“ (NativeError:”& errLoop.NativeError&“ )”& vbCr If errLoop.HelpFile =“” Then strError = strError&“ No help file available”& vbCr& vbCr Else strError = strError&“ (HelpFile:”& errLoop.HelpFile&“ )”& vbCr&“ (HelpContext:”& errLoop.HelpContext&“ )”& vbCr& vbCr End If ’輸出錯誤信息 Response.Write strError Next % > 上述 For~ Next循環(huán)中的代碼捕獲 ADO連接對象 conn1的 Errors集合中的所有錯誤對象( Error對象)。這些 Error對象的屬性包括: ●Number屬性表示用于唯一標識 Error對象的數(shù)字; ●Description屬性表示與 Error對象相關聯(lián)的說明性字符串; ●SQLState屬性表示給定 Error對象的 SQL狀態(tài); ●NativeError屬性表示給定 Error對象或特定提供者的錯誤代碼; ●Source屬性表示產生錯誤的原始對象或應用程序的名稱。 瀏覽器把這些屬性顯示在窗口中,這樣我們就能清楚地知道究竟發(fā)生了什么錯誤。 在 Error對象的諸多屬性中, Description屬性包含錯誤說明信息,查看這一屬性,基本上可以知道錯誤的原因,為簡化代碼,也可以只查看這一屬性。 此外,通過捕獲 ADO錯誤,還可以向用戶給出有用的提示信息。例如,當用戶錄入重復的學號時,我們可以給他合適的提示。代碼如下: <% ’屏蔽瀏覽器的錯誤提示功能 on error resume next strConnString =“ Provider=SQLOLEDB.1;Password=mypassword;”&“ Persist Security Info=True;User ID=myuid;”&“ Initial Catalog=mydbname;”&“ Data Source=myserver;Connect Timeout=15” Set conn1 = Server.CreateObject(“ ADODB.Connection” ) Conn1.Open strConnString ’檢查數(shù)據(jù)庫連接,出錯則給出提示 For Each errLoop In conn1.Errors If errLoop.NativeError=6 then% > <script language=vbscript> <!-- alert "數(shù)據(jù)庫可能已停止運行,請和數(shù)據(jù)庫管理員聯(lián)系!" //--> </script> <% End If If errLoop.NativeError=0 then% > <script language=vbscript> <!-- alert "數(shù)據(jù)庫連接有問題,請和web站點管理員聯(lián)系!" window.history.back 1 //--> </script> <% End If Next q=“ insert into students(xm,xh) values(‘張三’ ,‘ S001’ )” conn1.Execute (q) ’判斷是否存在主鍵沖突,存在則給出警告 For Each errLoop In cnn1.Errors If errLoop.NativeError=2627 then% > <script language=vbscript> <!-- alert "學好已經存在,請重新輸入!" //--> </script> <% End If Next % > 這樣,就可以通過瀏覽器提示用戶,其操作有什么問題,以利于用戶改正。其中錯誤號表示: ●NativeError=6的錯誤是由 Net Library返回的錯誤號,錯誤來自于底層的網絡軟件; ●NativeError=0的錯誤是由驅動程序返回的錯誤號,錯誤來自于數(shù)據(jù)庫驅動程序(如 SQL Server Driver); ●NativeError=2627的錯誤是由 SQL Server返回的錯誤號,錯誤來自于數(shù)據(jù)源。 關于 SQL Server返回的錯誤信息,如果想獲得更詳細的信息,請查看 SQL Server 7.0 sysmessages系統(tǒng)表( select error,description from sysmessages)。
|