下載 PDF
Visual Studio Professional 和 Team System 版本可讓您設定中斷點,並逐步執行 SQL Server 內的預存程序,使偵錯預存程序就像偵錯應用程式程式碼一樣簡單。 本教學課程示範預存程序的直接資料庫偵錯和應用程式偵錯。
簡介
Visual Studio 提供豐富的偵錯體驗。 透過幾個按鍵或點按滑鼠,就可以使用中斷點停止執行程式,並檢查其狀態和控制流程。 除了偵錯應用程式程式碼之外,Visual Studio 也支援從 SQL Server 內偵錯預存程序。 就像可以在 ASP.NET Code-behind 類別或業務邏輯層的類別程式碼內設置中斷點一樣,也可以在預存程序中設置它們。
在本教學課程中,我們將探討如何在 Visual Studio 的伺服器總管中進行逐步調試預存程序,並設定中斷點,以便在執行中的 ASP.NET 應用程式呼叫預存程序時觸發中斷點。
注意
不幸的是,預存程序只能透過 Visual Studio 的 Professional 和 Team System 版本逐步執行和偵錯。 如果您使用的是 Visual Web Developer 或標準版本的 Visual Studio,歡迎閱讀,我們將逐步解說偵錯預存程序所需的步驟,但您將無法在機器上重複這些步驟。
SQL Server 偵錯概念
Microsoft SQL Server 2005 的設計旨在提供與公共語言執行階段 (CLR) 之整合,這是所有 .NET 組件使用的執行階段。 因此,SQL Server 2005 支援受控資料庫物件。 也就是說,您可以建立預存程序和使用者定義的函式 (UDF) 等資料庫物件,做為 Visual Basic 類別中的方法。 這可讓這些預存程序和 UDF 利用 .NET Framework 和您自己的自訂類別中的功能。 當然,SQL Server 2005 也支援 T-SQL 資料庫物件。
SQL Server 2005 為 T-SQL 和受控資料庫物件提供偵錯支援。 不過,這些物件只能透過 Visual Studio 2005 Professional 和 Team Systems 版本進行偵錯。 在本教學課程中,我們將探討 T-SQL 資料庫物件的偵錯。 後續教學課程會探討如何偵錯受控資料庫物件。
SQL Server 2005 中的 T-SQL 和 CLR 偵錯概述部落格文章(來自SQL Server 2005 CLR 整合小組),強調從 Visual Studio 偵錯 SQL Server 2005 物件的三種方法:
- 直接資料庫除錯 (DDD) - 從伺服器總覽器,我們可以逐步偵錯任何 T-SQL 資料庫物件,例如預存程序和 UDF。 我們將在步驟 1 中分析 DDD。
- 應用程式偵錯 - 我們可以在資料庫物件內設定中斷點,然後執行 ASP.NET 應用程式。 當資料庫物件執行時,中斷點將會觸發,並將控制權轉交給除錯器。 請注意,在進行應用程式偵錯時,我們無法深入到資料庫元件從應用程式程式碼中進行檢查。 我們必須在我們希望偵錯工具停止的預存程序或 UDF 中明確設定中斷點。 在步驟 2 中,會開始分析應用程式偵錯。
- 從 SQL Server 專案進行偵錯 - Visual Studio Professional 和 Team Systems 版本包含一個通常用來建立受控資料庫物件的 SQL Server 專案類型。 我們將在下一個教學課程中探討如何使用 SQL Server 專案以及偵錯其內容。
Visual Studio 可以在本機和遠端 SQL Server 執行個體上偵錯預存程序。 本機 SQL Server 執行個體是安裝在與 Visual Studio 相同的電腦上。 如果您使用的 SQL Server 資料庫不在開發電腦上,則視為遠端執行個體。 在這些教學課程中,我們都是使用本機 SQL Server 執行個體。 在遠端 SQL Server 執行個體上偵錯預存程序所需的設定步驟比偵錯本機執行個體上的預存程序還要多。
如果您使用本機 SQL Server 執行個體,可以從步驟 1 開始,並逐步完成本教學課程。 不過,如果您使用遠端 SQL Server 執行個體,必須先確定在偵錯時,您是使用在遠端執行個體上具有 SQL Server 登入的 Windows 使用者帳戶登入開發電腦。 此外,這個資料庫登入以及用來從執行中的 ASP.NET 應用程式連接到資料庫的資料庫登入都必須是sysadmin角色的成員。 如需設定 Visual Studio 和 SQL Server 以偵錯遠端執行個體的詳細資訊,請參閱本教學課程結尾的「偵錯遠端執行個體上的 T-SQL 資料庫物件」一節。
最後,要知道對 T-SQL 資料庫物件的偵錯支援,功能並不如對 .NET 應用程式的偵錯支援那麼豐富。 例如,停止條件和篩選器不受支援,只有部分偵錯視窗可用,您無法使用 [編輯後繼續] 功能,[立即] 視窗也無法使用,等等。 請參閱偵錯工具命令和功能的限制以獲得更多資訊。
步驟 1:直接逐步執行預存程序
Visual Studio 可讓您輕鬆地直接偵錯資料庫物件。 讓我們看看如何使用 Direct Database Debugging (DDD) 功能進入 Northwind 資料庫中的Products_SelectByCategoryID 預存程序。 正如其名,Products_SelectByCategoryID會傳回特定類別的產品資訊;它是在「使用現有預存程序以具類型 DataSet 的 TableAdapter」教學課程中建立的。 首先,移至伺服器總管,然後展開 Northwind 資料庫節點。 接下來,進入 [Stored Procedures] 資料夾,對 Products_SelectByCategoryID 儲存程序按右鍵,從操作功能表中選擇 [逐步執行儲存程序] 選項。 這會啟動偵錯工具。
由於 Products_SelectByCategoryID 預存程序需要 @CategoryID 輸入參數,因此要求我們提供此值。 輸入 1,這會傳回飲料的相關資訊。
使用值 1於@CategoryID參數"
@CategoryID 參數"/>"
圖 1:針對參數使用值 1
在提供 @CategoryID 參數的值之後,便會執行預存程序。 不過,偵錯工具會在第一個陳述式上停止執行,而不是執行至完成。 請注意邊界中的黃色箭號,指出預存程序中的目前位置。 您可以透過 [監看式] 視窗檢視和編輯參數值,或將滑鼠停留在預存程序中的參數名稱上。
圖 2:偵錯工具在預存程序第一個陳述式上停止 (按一下以檢視完整大小的影像)
若要逐步執行儲存過程中的一個陳述式,請按一下工具列中的 [單步略過] 按鈕,或按 F10 鍵。
Products_SelectByCategoryID 預存程序包含單一 SELECT 陳述式,因此按 F10 會略過該單一陳述式並完成執行預存程序。 預存程序完成之後,其輸出會出現在 [輸出] 視窗中,而偵錯工具將會終止。
注意
T-SQL 偵錯是發生在陳述式層級;您無法逐步進入 SELECT 陳述式。
步驟 2:設定網站以進行應用程式偵錯
雖然直接從伺服器總管偵錯預存程序十分方便,但在許多情況下,我們更有興趣在從 ASP.NET 應用程式呼叫預存程序時對其進行偵錯。 我們可以從 Visual Studio 內將中斷點新增至預存程序,然後開始對 ASP.NET 應用程式進行偵錯。 從應用程式叫用具有中斷點的預存程序時,執行會在中斷點停止,我們可以檢視和變更預存程序的參數值,並逐步執行其陳述式,就像我們在步驟 1 中所做的一樣。
我們必須先指示 ASP.NET Web 應用程式與 SQL Server 偵錯工具整合,才能開始偵錯從應用程式呼叫的預存程序。 首先,以滑鼠右鍵按一下方案總管中的網站名稱 (ASPNET_Data_Tutorial_74_VB)。 從操作功能表中選擇 [屬性頁] 選項,選取左側的 [開始選項] 項目,然後核取 [偵錯工具] 區段中的 [SQL Server] 核取方塊 (見 [圖 3])。
在應用程式的屬性頁中,勾選 [SQL Server] 核取方塊。
圖 3:在應用程式的屬性頁中勾選 [SQL Server] 核取方塊 (按一下以查看完整大小的影像)
此外,我們需要更新應用程式所使用的資料庫連接字串,以便停用連接共用。 當資料庫的連接關閉時,對應的 SqlConnection 物件會放在可用的連接池中。 建立資料庫的連接時,可以從這個集區擷取可用的連接物件,而不必建立和確立新的連接。 這個連接物件共用可增強效能,且預設會啟用。 不過,在偵錯時,我們想要關閉連接共用,因為在處理取自集區的連接時偵錯基礎結構並沒有正確地重新建立。
若要停用連接共用,請更新 NORTHWNDConnectionString 中的 Web.config,使其包含設定 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])以重啟連線共用。
此時,ASP.NET 應用程式已設定為允許 Visual Studio 在透過 Web 應用程式叫用時偵錯 SQL Server 資料庫物件。 現在剩下的就是將中斷點新增至預存程序並開始偵錯!
步驟 3:新增中斷點和偵錯
開啟Products_SelectByCategoryID 預存程序,並在 SELECT 陳述式開頭設定中斷點。可以在適當位置的邊界中點擊或將游標放在 SELECT 陳述式開頭並按下 F9。 如 [圖 4] 所示,中斷點會在邊界中顯示為紅色圓圈。
在 Products_SelectByCategoryID 預存程序中設定中斷點
圖 4:在 Products_SelectByCategoryID 儲存過程中設定中斷點 (按一下以檢視完整大小的影像)
為了讓 SQL 資料庫物件透過用戶端應用程式進行偵錯,資料庫必須設定為支援應用程式偵錯。 當您第一次設定中斷點時,應該會自動開啟此設定,但最好是再檢查一次。 以滑鼠右鍵按一下伺服器總管中的 NORTHWND.MDF 節點。 快捷功能表應該包含一個名為 [應用程式偵錯] 的核取選項。
確保已啟用 [應用程式偵錯] 選項
圖 5:確定 [應用程式偵錯] 選項已啟用
設定中斷點並啟用 [應用程式偵錯] 選項後,我們就準備好在從 ASP.NET 應用程式呼叫預存程序時對其進行偵錯。 移至 [偵錯] 功能表並選擇 [開始偵錯]、按 F5 或按工具列中的綠色播放圖示,以啟動偵錯工具。 這會啟動偵錯工具並啟動網站。
Products_SelectByCategoryID 預存程序是在 使用現有預存程序的教學課程中為具類型 DataSet 的 TableAdapters 建立的。 其相對應的網頁 (~/AdvancedDAL/ExistingSprocs.aspx) 包含 GridView,以顯示此預存程序返回的結果。 透過瀏覽器瀏覽此頁面。 到達頁面時,會打到 Products_SelectByCategoryID 儲存過程中的中斷點,控制將返回到 Visual Studio。 就像在步驟 1 中一樣,您可以逐步執行預存程序的陳述式,並檢視和修改參數值。
圖 6:此頁面最初會顯示飲料 (按此檢視全尺寸影像)
已到達預存程序的中斷點
圖 7:已到達預存程序中斷點 (按一下以檢視完整大小的影像)
如「圖 7」中的「監看視窗」所示,@CategoryID 參數的值是 1。 這是因為 ExistingSprocs.aspx 頁面最初會顯示飲料類別中的產品,其 CategoryID 值為 1。 從下拉式清單中選擇不同類別。 此舉會導致回傳並重新執行 Products_SelectByCategoryID 預存程序。 中斷點再次觸發,但這次 @CategoryID 參數的值會反映選取的下拉式清單項目的 CategoryID。
從下拉式清單中選擇不同類別。
圖 8:從下拉式清單中選擇不同類別 (按一下以檢視完整大小的影像)
<參數 @CategoryID 反映從網頁選取的類別 />
圖 9:此參數反映自網頁選取的類別 (按此以查看完整尺寸圖像)
注意
如果在瀏覽 ExistingSprocs.aspx 頁面時未叫用 Products_SelectByCategoryID 預存程序中的中斷點,請確定在 ASP.NET 應用程式的屬性頁面上的 [偵錯工具] 區段中已勾選 [SQL Server] 核取方塊,連接集區已停用,並且資料庫的 [應用程式偵錯] 選項已啟用。 如果您仍然遇到問題,請重新啟動 Visual Studio,然後再試一次。
偵錯遠端執行個體上的 T-SQL 資料庫物件
當 SQL Server 資料庫執行個體位於與 Visual Studio 相同的電腦上時,透過 Visual Studio 偵錯資料庫物件相當直接了當。 不過,如果 SQL Server 和 Visual Studio 位於不同的電腦上,則需要謹慎進行一些設定,才能讓一切適當運作。 我們面臨兩項核心工作:
- 請確定透過 ADO.NET 用來連接到資料庫的登入帳號屬於
sysadmin角色。 - 確保開發機器上的 Visual Studio 所使用的 Windows 使用者帳戶是作為有效的 SQL Server 登入帳戶,並且屬於
sysadmin角色。
第一個步驟相當直接明瞭。 首先,識別用來從 ASP.NET 應用程式連接到資料庫的使用者帳戶,然後從 SQL Server Management Studio 將該登入新增至 sysadmin 角色。
第二項工作會要求您用來偵錯應用程式的 Windows 使用者帳戶是遠端資料庫的有效登入。 不過,您登入工作站的 Windows 帳戶有可能不是 SQL Server 的有效登入。 與其將特定登入帳戶新增至 SQL Server,更好的選擇是將某些 Windows 使用者帳戶指定為 SQL Server 偵錯帳戶。 然後,若要偵錯遠端 SQL Server 執行個體的資料庫物件,您可以使用該 Windows 登入帳戶的認證來執行 Visual Studio。
舉例應該有助於釐清事情。 想像 Windows 網域內有一個名為 SQLDebug 的 Windows 帳戶。 此帳戶必須新增至遠端 SQL Server 執行個體作為有效的登入,並成為sysadmin角色的成員。 然後,若要從 Visual Studio 偵錯遠端 SQL Server 執行個體,我們需要以 SQLDebug 使用者身分執行 Visual Studio。 這可以透過登出工作站、以 SQLDebug 身分重新登入,然後啟動 Visual Studio 來達成,但更簡單的方法是使用自己的認證登入工作站,然後使用 runas.exe 以 SQLDebug 使用者身分啟動 Visual Studio。
runas.exe 允許以不同的使用者帳戶身分執行某個特定應用程式。 若要將 Visual Studio 啟動為 SQLDebug,您可以在命令列輸入下列指令:
runas.exe /user:SQLDebug "%PROGRAMFILES%\Microsoft Visual Studio 8\Common7\IDE\devenv.exe"
如需此程序的詳細說明,請參閱 William R. Vaughn 的《Hitchhiker's Guide to Visual Studio and SQL Server, 第七版》。
注意
如果您的開發電腦執行 Windows XP Service Pack 2,您必須設定網際網路連線防火牆以允許遠端偵錯。 如何:啟用 SQL Server 2005 偵錯這篇文章指出,這涉及兩個步驟:(a) 在 Visual Studio 主機電腦上,您必須將 Devenv.exe 新增至例外狀況清單,並開啟 TCP 135 埠;(b) 在遠端 (SQL) 機器上,您必須開啟 TCP 135 埠,並將 sqlservr.exe 新增至例外狀況清單。 如果您的網域原則要求透過 IPSec 進行網路通訊,則必須開啟 UDP 4500 和 UDP 500 連接埠。
摘要
除了對 .NET 應用程式程式碼提供偵錯支援之外,Visual Studio 也針對 SQL Server 2005 提供各種偵錯選項。 在本教學課程中,我們探討了其中兩個選項:直接資料庫偵錯和應用程式偵錯。 若要直接偵錯 T-SQL 資料庫物件,請透過伺服器總管找出該物件,然後按一下右鍵,選擇 [執行步驟]。 如此會啟動偵錯工具,並在資料庫物件的第一個陳述式上停止,此時您可以逐步執行該物件的陳述式,並檢視和修改參數值。 在步驟 1 中,我們使用此方法逐步進入 Products_SelectByCategoryID 預存程序。
應用程式偵錯允許直接在資料庫物件內設定中斷點。 從用戶端應用程式 (例如 ASP.NET Web 應用程式) 叫用具有中斷點的資料庫物件時,程式會在偵錯工具接管時停止。 應用程式偵錯很有用,因為它更清楚地顯示哪些應用程式動作會導致叫用特定的資料庫物件。 然而,它所需的組態和設定比直接資料庫偵錯稍微多一點。
資料庫物件也可以透過 SQL Server 專案進行偵錯。 我們將在下一個教學課程中探討如何使用 SQL Server 專案,以及如何使用它們來建立和偵錯受控資料庫物件。
祝您程式設計愉快!
關於作者
斯科特·米切爾,七本 ASP/ASP.NET 書籍和 4GuysFromRolla.com 創始人的作者,自1998年以來一直與Microsoft Web 技術合作。 Scott 擔任獨立顧問、講師和作家。 他的新書是《24小時自學ASP.NET 2.0》。 可以透過 mitchell@4GuysFromRolla.com 聯絡他。
上一個 下一個
偵錯工具在預存程序的第一個陳述式上停止
ExistingSprocs.aspx 頁面最初會顯示飲料