導言:
Visual Studio有很多的調試功能.我們只需要稍稍點點滑鼠,敲敲鍵盤就可以使用斷點(breakpoints)來打斷某個程式的執行,並查看其狀態.除了調試代碼以外,Visual Studio也支援對SQL Server裡面的預存程序進行調試.就像可以在ASP.NET頁面的後台代碼類或Business Logic Layer class類裡設定斷點一樣,我們也可以在預存程序裡設定斷點.
本文我們將考察如何在Visual Studio的Server Explorer裡進入預存程序並設定斷點.當ASP.NET程式調用該預存程序時就會碰到該斷點.
注意:不幸的是只能在Visual Studio的Professional和Team Systems版本裡才能對預存程序設定斷點.如果你使用的是Visual Web Developer或Visual Studio的標準版,你就只能看教程是如何一步步的做的,但不能在自己的機器上實踐.
SQL Server調試主題
Microsoft SQL Server 2005集合了公用語言運行庫(Common Language Runtime (CLR)),它可以被所有.NET模組使用.因此SQL Server 2005支援對資料庫物件的管理.
我們可以建立資料庫物件,比如預存程序、使用者定義的函數((UDFs)等,就像在一個C#類裡定義的方法一樣.你可以在從.NET Framework或自己定義的類裡使用這些預存程序和自訂函數.當然,SQL Server 2005也支援T-SQL資料庫物件.SQL Server 2005支援對T-SQL資料庫物件以及管理資料庫對象(managed database objects)的調試.不過只能在Visual Studio 2005專業版或Team Systems版本裡才行.本文我們將考察對T-SQL資料庫的調試.後面的教程我們將考察對管理資料庫對象的調試.文章《Overview of T-SQL and CLR Debugging in SQL Server 2005》(http://blogs.msdn.com/sqlclr/archive/2006/06/29/651644.aspx)歸納了在Visual Studio裡調試SQL Server 2005對象的3種途徑:
.直接資料庫調試(DDD)—在伺服器總管裡進入某個T-SQL資料庫物件,比如預存程序或使用者定義函數UDFs.我們將在第一步考察該模式.
.應用程式調試—我們可以在一個資料庫物件裡設定斷點,然後再返回到一個ASP.NET應用程式.當執行這些資料庫物件時,將遇到斷點並轉到調試器.注意,在應用程式偵錯模式,我們不能在應用程式代碼裡打入一個資料庫物件,所以我們必須直接在這些預存程序或使用者義函數裡設定斷點.我們將在第二步考察該模式.
.通過一個SQL Server Project來調試
Visual Studio專業版及Team Systems版包含一個SQL Server Project類型,它通常用來建立管理資料庫對象(managed database objects),我們將在後面的教程考察SQL Server Projects及如何調試其內容.Visual Studio可以對本地或外部SQL Server執行個體進行調試。如果你使用的SQL Server資料庫不在本地,那麼自然,它就是一個外部執行個體.本文我們將使用本地SQL Server執行個體,調試外部SQL Server執行個體的預存程序要比調試本地的多出一些步驟.
如果你使用的是一個本地SQL Server執行個體,那麼你可以從第一步看到結尾.如果你使用的是外部SQL Server執行個體,那麼你首先要確保是以Windows user帳戶登入電腦,且包含一個串連到外部SQL Server執行個體的登入介面.此外,應全部以系統管理員角色登入.你可以參閱本文結尾的“Debugging T-SQL Database Objects on Remote Instances”部分,查看如何配置Visual Studio 和 SQL Server以調試外部執行個體.
最後,我們應該明白支援T-SQL資料庫物件調試的特性沒有支援.NET應用程式調試的特性豐富.比如,不支援斷點條件過濾(breakpoint conditions and filters),只能用到寥寥幾個調試視窗;你無法使用Edit 和 Continue等等。更多詳情請參閱文章《Limitations on Debugger Commands and Features》(http://msdn2.microsoft.com/en-us/library/ms165035(VS.80).aspx)
第一步:直接進入儲存過程
使用Visual Studio我們可以很容易地直接進入一個資料庫物件。我們來看如何使用Direct Database Debugging (DDD)特性進入Northwind資料庫裡的Products_SelectByCategoryID預存程序.就像其名字揭示的那樣,該預存程序返回特定category的產品資訊。我們在第68章建立了該預存程序,在伺服器總管裡展開Northwind資料庫節點,接下來進入預存程序檔案夾,在Products_SelectByCategoryID預存程序上按右鍵,選“Step Into Stored Procedure”,這將開啟調試器.因為該預存程序接受一個@CategoryID輸入參數,我們輸入1,這將返回“飲料”類產品的資訊。
圖1:使用值為“1”的@CategoryID輸入參數
指定@CategoryID參數的值後,就可以執行預存程序了.不過調試器執行完第一條Statement後就中止了,而不會完全運行預存程序.。注意邊框上的黃色箭頭,它指出了Statement在預存程序的當前位置.你可以在Watch視窗查看或編輯參數值,或者改寫預存程序用到的參數名稱.
圖2:調試器調試完第一條Statement後就中止了
希望一次只調試一條statement語句的話,點擊工具列上的“Step Over”按鈕或按F10鍵。由於Products_SelectByCategoryID預存程序只包含了一條SELECT statement,所以按F10鍵將跨過這條語句並完成預存程序的執行。執行完畢後,其結果將顯示在 Output視窗裡,調速器也就中止了.
注意:T-SQL調試發生在statement層級,但對SELECT statement無效
第二步:為Website設定應用程式調試
直接在伺服器總管裡調試預存程序時需要手動設定,但很多時候我們感興趣的是,當在ASP.NET應用程式裡調用預存程序時才對其進行調試。當一個設定了斷點的預存程序被應用程式調用,在執行過程中將遇到這個斷點。我們可以查看和改變預存程序的參數值,就像我們在第一步做的那樣.
不過在次此之前我們需要將ASP.NET web應用程式與SQL Server調試器聯絡起來.在方案總管裡,在website名稱(ASPNET_Data_Tutorial_74_CS)上按右鍵,選“Property Pages”項,再在左邊選“Start Options”,選中Debuggers地區的SQL Server選擇框,如圖3:
圖3:在應用程式的屬性頁面選擇SQL Server方框
另外,我們還要更新資料庫連接字串以禁用“串連池”。當關閉一個資料庫的串連時,一個對應的SqlConnection對象將存放在串連池裡。當建立一個資料庫連接時,就可以重新擷取該SqlConnection對象而用不著再建立一個新的串連.串連池提高了執行效能,預設時,其處於啟用狀態.不過在調試時我們將關閉串連池,因為處理從串連池檢索來的串連時,不能正確的建立相應的調試基礎構造(debugging infrastructure).
要禁用串連池的話,更新Web.config檔案的NORTHWNDConnectionString,包含一個“Pooling=false”設定.
<connectionStrings> <add name="NORTHWNDConnectionString" connectionString= "Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/NORTHWND.MDF; Integrated Security=True;User Instance=True;Pooling=false" providerName="System.Data.SqlClient" /></connectionStrings>
注意:一旦你完成從ASP.NET應用程式對SQL Server的調試後,務必還原串連池,在連接字串裡將Pooling設定刪除或設定為“Pooling=true”.
完成設定後,我們還需要對預存程序添加一個斷點,並開始調試
第三步:添加斷點並調試
開啟Products_SelectByCategoryID預存程序,在SELECT statement的開頭部分設定斷點。方法點擊邊框恰當的地方或將游標放在SELECT statement開始的地方再按F9。如圖9所示,斷點在邊框呈現為一個紅色圓點.
圖4:在Products_SelectByCategoryID預存程序設定斷點
為了在用戶端程式對一個 SQL 資料庫對象進行調試,我們有必要設定資料庫支援“應用程式調試”(application debugging),在伺服器總管裡點到NORTHWND.MDF節點,按右鍵,選“Application Debugging”.
圖5:確保選中Application Debugging 項
當設定好斷點且啟用“Application Debugging ”項時,我們就可以從ASP.NET 應用程式調用預存程序來進行調試。要調試的話,在“調試”菜單裡選“開始調試”,或點 F5或點工具列裡的綠色小表徵圖。這將開啟調試器.
Products_SelectByCategoryID預存程序是在第68章建立的,其對應的頁面(~/AdvancedDAL/ExistingSprocs.aspx)包含了一個GridView控制項,以顯示該預存程序返回的結果.在瀏覽器裡登入該頁面,當執行過程遇到設定的斷點時頁面將返回到Visual Studio,就像在第一步看到的那樣,我們可以進入預存程序的statements,查看並修改參數值.
圖6:ExistingSprocs.aspx頁面最開始顯示的是 飲料類的產品
圖7:執行到預存程序設定的斷點
在如圖7所示的 Watch 視窗,參數@CategoryID的值為1,這是由於ExistingSprocs.aspx頁面最開始顯示的是飲料類產品的資訊,而飲料類的CategoryID 值為1.在下拉式清單裡選擇一個不同的值。這將導致頁面回傳並重新執行Products_SelectByCategoryID預存程序。再次遇到斷點時,@CategoryID 參數的值就是你在下拉式清單方塊裡選擇的CategoryID值.
圖8:在下拉式清單裡選擇一個不同的類
圖9:參數@CategoryID反映的是在Web頁面選擇的類
注意:如果你登入ExistingSprocs.aspx 頁面時,沒有碰到在Products_SelectByCategoryID預存程序裡設定的斷點,一定要確保ASP.NET應用程式的“屬性頁面”的 Debuggers地區的SQL Server項被選中;關閉串連池;啟用資料庫的Application Debugging項.如果仍然還有問題的話,重新啟動Visual Studio並再試一次.
調試T-SQL 資料庫對象的遠程執行個體
在本地電腦上通過Visual Studio調試是比較直觀容易的,但如果SQL Server和Visual Studio沒有裝在同一台機器上的話,我們需要做一些設定以使各方面工作正常,為此我們要做2方面的工作:
.確保以系統管理員的角色(sysadmin role)通過ADO.NET串連到資料庫
.確保開發環境上Visual Studio使用的Windows user帳戶是一個有效屬於系統管理員的角色(sysadmin role)的SQL Server登入帳戶.
第一項相對比較簡單.首先確定從ASP.NET應用程式串連到資料庫的使用者帳戶,接下來通過SQL Server Management Studio,將該帳戶添加到sysadmin角色.
第二項,你用來偵錯工具的Windows user帳戶必須是串連到遠端資料庫的一個有效帳戶,問題就在於你在本地工作站登入的Windows帳戶不一定就是登入SQL Server的有效帳戶.與其將你具體的登入帳戶添加給SQL Server,一個更好的選擇是將一些Windows user帳戶分配為SQL Server調試帳戶(SQL Server debugging account).然後,要調試一個遠程SQL Server執行個體的資料庫物件的話,你可以使用這些Windows登入帳戶的認證(credentials)來運行Visual Studio.
用一個例子來進行闡述。假設有個Windows帳戶,名為SQLDebug.該帳戶應該添加到遠程SQL Server執行個體,以系統管理員角色進行合法登入.然後要從Visual Studio來調試遠程SQL Server執行個體的話,我們應該以SQLDebug帳戶來運行Visual Studio.於是我們可以這樣來操作:退出我們的工作站,以SQLDebug帳戶再次登入,然後運行Visual Studio.不過還有一個更簡單點的方法,不用退出工作站,通過使用runas.exe來以SQLDebug的名義運行Visual Studio.這個runas.exe允許一個應用程式假借另一個帳戶的名義來執行.要以SQLDebug的名義來運行Visual Studio的話,你可以在命令列鍵入如下的statement:
runas.exe /user:SQLDebug "%PROGRAMFILES%/Microsoft Visual Studio 8/Common7/IDE/devenv.exe"
關於該過程的更詳細介紹請參閱文章《How To: Set SQL Server Permissions for Debugging》(http://msdn2.microsoft.com/en-us/library/w1bhybwz(VS.80).aspx)
注意:如果你的開發機為Windows XP Service Pack 2版本的話,你需要對Internet串連防火牆進行配置以允許遠端偵錯。文章《The How To: Enable SQL Server 2005 Debugging》(http://msdn2.microsoft.com/en-us/library/s0fk6z6e(VS.80).aspx)對此進行了描述,該過程包括2步:(a)在Visual Studio所在的主機,你必須向Exceptions list添加Devenv.exe,並開啟TCP 135連接埠;(b)在遠程(SQL)機器,你必須開啟TCP 135連接埠,且向Exceptions list添加Dsqlservr.exe.如果你的域策略(domain policy)需要通過IPSec來進行網路通訊(network communication)的話,你必須開啟UDP 4500 和 UDP 500連接埠。
結語:
除了支援對.NET程式碼進行調試外,Visual Studio也提供了對SQL Server 2005進行調試的多種選擇.在本文,我們考察了這些選擇中的2種:直接資料庫調試(Direct Database Debugging)以及應用程式調試.要直接對一個T-SQL資料庫物件進行調試的話,在伺服器總管裡找到該對象,再按右鍵選“Step Into …”. 這將開啟調試器,且運行到該對象的第一條statement就終止了.此時,你可以進入該對象的statements,查看並修改參數值.在第一步,我們用該方法對Products_SelectByCategoryID預存程序進行了設定.
應用程式調試允許直接在資料庫物件裡設定斷點.當一個用戶端程式(比如一個ASP.NET web程式)調用一個包含斷點的資料庫物件時,程式終止且切換到調試器介面。應用程式調試很有用,因為它更清楚的顯示了到底是什麼程式行為調用了某個具體的資料庫物件.然而,該方法比直接資料庫調試要多一些配置和步驟.
資料庫物件也可以通過SQL Server Projects來進行調試,在下一章我們將考察使用SQL Server Projects,以及如何利用其來建立和調試管理資料庫對象(managed database objects)
祝編程快樂!
作者簡介
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創始人,自1998年以來一直應用 微軟Web技術。大家可以點擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0資料教程》,希望對大家的學習ASP.NET有所協助。