通過 Visual Studio 的 Professional 和 Team System 版本,我們可以對 SQL Server 中的預存程序設定斷點並進入預存程序對其進行調試,這樣我們可以象調試應用程式代碼一樣輕鬆地調試預存程序。本教程講述對預存程序的兩種調試方式:直接資料庫調試和應用程式調試。
簡介
Visual Studio 提供豐富的調試體驗。我們只需按幾個按鍵或點幾下滑鼠,就可以使用斷點來中斷程式的執行,檢查程式的狀態和控制流程程。除了對應用程式代碼的調試外,Visual Studio 還支援對SQL Server 內的預存程序的調試。正如可以在 ASP.NET 的代碼檔案類或商務邏輯層的類的代碼中設定斷點一樣,也可以在預存程序中設定斷點。
本教程將介紹,怎樣在 Visual Studio 中通過 Server Explorer 進入預存程序,以及怎樣在其中設定斷點,從而使我們啟動並執行ASP.NET 應用程式在調用預存程序時能觸發斷點。
注意: 遺憾的是,Visual Studio 只有Professional 和 Team Systems 兩個版本可以進入和調試預存程序。如果您使用的是Visual Web Developer 或 Visual Studio 的標準版本,歡迎繼續閱讀下文以瞭解對預存程序進行調試所需的步驟,但在您自己的機器上無法執行這些步驟。
SQL Server 調試概念
Microsoft SQL Server 2005 旨在實現與通用語言執行平台 (CLR) 的整合,CLR 是所有 .NET 組譯工具所使用的運行時環境。因此,SQL Server 2005 支援管理的資料庫對象。也就是說,使用者可以在Visual Basic 類中以方法的形式建立如預存程序和使用者定義函數(UDF) 等資料庫物件。這使得預存程序和 UDF 能夠利用 .NET Framework 中以及定製類中的功能。當然,SQL Server 2005 也支援 T-SQL 資料庫對象。
SQL Server 2005 支援對T-SQL 資料庫對象和管理的資料庫對象的調試。但是只有Visual Studio 2005 Professional 版本和Team Systems 版本能夠對這些對象的進行調試。本教程將詳細介紹對T-SQL 資料庫對象的調試。而對管理的資料庫對象的調試將在下一篇教程中講述。
來自 SQL Server 2005 CLR 整合式團隊 的部落格文章 SQL Server 2005 中的 T-SQL 和 CLR 調試概述 重點講述了以下三種通過Visual Studio 調試 SQL Server 2005 對象的方法:
- 直接資料庫調試(DDD):我們可以從 Server Explorer 進入 (step into) 任何 T-SQL 資料庫對象,如預存程序及 UDF 。步驟 1 將詳細介紹 DDD 。
- 應用程式調試:我們可以在資料庫物件中設定斷點,然後運行ASP.NET 應用程式。當程式執行到含有斷點的資料庫物件時,會觸發斷點,並將程式控制權轉交給調試器。注意,在使用應用程式調試方法時,我們不能從應用程式代碼進入(step into) 資料庫物件進行調試,而必須在要調試的預存程序或UDF 中直接設定斷點,調試器將會在設定了斷點的預存程序或UDF 處停頓。從步驟 2 開始將講述應用程式調試方法。
- 通過SQL Server項目調試:Visual Studio Professional 和 Team Systems 這兩個版本均包含一個 SQL Server Project 類型,該類型常用於建立管理的資料庫對象。下一教程將詳細介紹對SQL Server Project 的使用及對其內容的調試。
Visual Studio 既可以調試本地又可以調試遠程SQL Server 執行個體中的預存程序。本地 SQL Server 執行個體就是與Visual Studio 安裝在同一台機器上的執行個體。如果當前使用的SQL Server 資料庫不在您的開發機器上,則為遠程執行個體。我們的教程一直都是使用的本地SQL Server 執行個體。比起對本地執行個體中的預存程序進行調試,對遠程SQL server 執行個體中的預存程序進行調試需要更多的配置步驟。
如果您使用的是本地 SQL Server 執行個體,則可以從步驟 1 開始一直進行到本教程最後一步。但如果您使用的是遠程SQL Server 執行個體,在調試時,首先要確保您登入開發機器時使用的Windows 使用者帳戶在遠程執行個體上相應地有一個SQL Server 登入帳戶。此外,此資料庫登入帳戶和從啟動並執行ASP.NET 應用程式串連到資料庫時使用的資料庫登入帳戶都必須是sysadmin 角色的成員。關於配置 Visual Studio 和 SQL Server 以調試遠程執行個體的詳細資料,請參見本教程末尾的“調試遠程執行個體中的T-SQL 資料庫對象”部分。
最後,應知道對 T-SQL 資料庫對象的調試功能不象對 .NET 應用程式的調試功能那樣豐富。例如,不支援斷點條件和斷點過濾器、只能使用一部分調試視窗、不能使用Edit 和 Continue ,呈現的Immediate 視窗無用,等等。詳情參見調試器命令和功能限制 。
步驟1:直接進入預存程序
通過Visual Studio ,我們可以容易地直接調試資料庫物件。我們來看看如何使用直接資料庫調試(DDD ,Direct Database Debugging )功能進入 Northwind 資料庫中的 Products_SelectByCategoryID 預存程序。顧名思義,Products_SelectByCategoryID 用於返回特定分類的產品資訊。它是在對強型別 DataSet的 TableAdapter使用現有預存程序 教程中建立的。首先進入 Server Explorer 並展開Northwind 資料庫節點。然後向下展開到 Stored Procedures 檔案夾,按右鍵 Products_SelectByCategoryID 預存程序,從關聯菜單中選擇 "Step Into Stored Procedure" 選項。此時調試器會啟動。
由於Products_SelectByCategoryID 預存程序準備接受 @CategoryID 輸入參數,系統會提示我們輸入此值。輸入1 ,這將返回飲料類產品的資訊。
圖1 :輸入 1 作為 @CategoryID 參數值
提供@CategoryID 參數值後,會執行該預存程序。調試器執行完第一條語句就停止,而不是執行到過程結束。注意邊框處出現的黃色箭頭,它指示在預存程序中的當前位置。可以通過Watch 視窗或將滑鼠停留在預存程序中的參數名稱上查看和編輯參數值。
圖2 :調試器在預存程序的第一條語句處停止
如要將預存程序當作一條語句一次跳過,單擊工具箱中的Step Over 按鈕或按下F10 。Products_SelectByCategoryID 預存程序包含一條 SELECT 語句,因此按下 F10 將跳過此語句並完成該預存程序的執行。預存程序執行完成後,其輸出將顯示在Output 視窗中,調試器將終止。
注意:T-SQL 調試在語句一級進行,因此不能進入 SELECT 語句。
步驟2:配置網站進行應用程式調試
雖然通過 Server Explorer 直接調試預存程序非常方便,但很多時候我們更想在我們的ASP.NET 應用程式調用預存程序時對其進行調試。我們可以從Visual Studio 中向預存程序添加斷點,然後開始調試ASP.NET 應用程式。當應用程式調用帶有斷點的預存程序時,程式的執行會在斷點處暫停,此時,我們可以查看並更改預存程序的參數值,逐步地調試其各條語句,就像我們在步驟1 中所做的那樣。
在我們可以對應用程式調用的預存程序進行調試之前,首先要指示ASP.NET web 應用程式與SQL Server 調試器相整合。首先,在 Solution Explorer 中按右鍵網站名稱(ASPNET_Data_Tutorial_74_VB) 。從關聯菜單中選擇 Property Pages 選項,然後選擇左側的Start Options 條目,選中 Debuggers 地區的 SQL Server 複選框(參見圖 3 )。
圖3 :在應用程式的 Property Pages 上選中 SQL Server 複選框
此外,我們還需要更新應用程式使用的資料庫連接字串以禁用串連池。當某個資料庫連接關閉時,相應的SqlConnection 對象將被放入到一個包含可用串連的池中。當建立一個資料庫連接時,則可從這個池中檢索到一個可用的連線物件,而無需建立並建立一個新的串連。連線物件的這種緩衝池功能提高了效能,該功能預設情況下是開啟的。但在調試時,我們要關閉串連池,其原因是,如果使用從該池中得到的串連,則不能正確重建調試的基礎架構。
為了禁用串連池,更改Web.config 檔案中的 NORTHWNDConnectionString ,使其包含 Pooling=false 設定。
Copy Code
<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 所示,斷點顯示為空白處的一個紅色圓圈。
圖4 :在 Products_SelectByCategoryID 預存程序中設定斷點
為了通過用戶端應用程式調試 SQL 資料庫對象,必須將該資料庫配置為支援應用程式調試。第一次設定斷點時,此設定應會自動開啟。但為謹慎起見,最好對此核實。在Server Explorer 中按右鍵 NORTHWND.MDF 節點。關聯菜單中的 Application Debugging 功能表項目應處於選中狀態。
圖5 :確保 Application Debugging 選項已啟用
設定了斷點並啟用了 Application Debugging 選項後,就可以調試從 ASP.NET 應用程式調用的預存程序了。啟動調試器:開啟Debug 菜單並選擇 Start Debugging ,或者按下F5 ,或者單擊工具列中的綠色 play 表徵圖。此時,調試器啟動,網站開啟。
Products_SelectByCategoryID 預存程序是在對強型別 DataSet的 TableAdapter使用現有預存程序教程中建立的。其相應的 web 頁面 (~/AdvancedDAL/ExistingSprocs.aspx) 包含一個 GridView 控制項,以顯示該預存程序返回的結果。通過瀏覽器訪問該頁面。開啟頁面後,Products_SelectByCategoryID 預存程序中的斷點將被觸發,程式控制權返回給Visual Studio 。如步驟 1 一樣,您可以逐步調試預存程序的各條語句、查看並更改參數值。
圖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 應用程式的Properties Page 中 Debuggers 地區的SQL Server 複選框是選中的,串連池已禁用,並且資料庫的Application Debugging 選項是啟用的。如果還有問題,請重啟Visual Studio 後重試。
調試遠程執行個體中的T-SQL 資料庫對象
若SQL Server 資料庫執行個體與 Visual Studio 在同一台機器上,則通過Visual Studio 調試資料庫物件相當簡單。但如果 SQL Server 與Visual Studio 位於不同的機器上,則需要進行仔細配置以使各方面工作正常。為此我們的兩個重要任務是:
- 確保通過 ADO.NET 串連到資料庫時使用的登入帳戶具有 系統管理員 (sysadmin) 的身份。
- 確保在開發機器上 Visual Studio 使用的 Windows 使用者帳戶是一個有效、具有 sysadmin 身份的 SQL Server 登入帳戶。
第一步相對簡單。首先,確定使用哪個使用者帳戶來從ASP.NET 應用程式串連到資料庫,然後通過SQL Server Management Studio 將此登入帳戶添加到 sysadmin 角色中。
第二個任務要求您在調試應用程式時所使用的Windows 使用者帳戶是遠端資料庫上的一個有效登入帳戶。但有時您登入到工作站的Windows 帳戶並非SQL Server 上的一個有效登入帳戶。比起將您的特定登入帳戶添加到SQL Server 來,一個更好的辦法是將某個Windows 使用者帳戶指定為 SQL Server 調試帳戶。然後,可以使用該Windows 登入帳戶的認證運行 Visual Studio ,以便調試遠程SQL Server 執行個體的資料庫物件。
下面用一個例子來說明上述情況。假設Windows 域中有一個名為 SQLDebug 的Windows 帳戶。需要將此帳戶添加到遠程 SQL Server 執行個體中,使其作為一個有效登入帳戶及sysadmin 角色的一個成員。然後,我們需要以 SQLDebug 使用者身份運行 Visual Studio ,以便通過 Visual Studio 調試遠程 SQL Server 執行個體。這可以通過如下步驟完成:從工作站退出,用SQLDebug 帳戶重新登入,然後啟動 Visual Studio 。但一個更簡單的方法是用我們自己的認證登入工作站,然後使用runas.exe 作為 SQLDebug 使用者啟動Visual Studio 。利用runas.exe ,可以借其他使用者帳戶的身份執行特定的應用程式。要作為SQLDebug 使用者來啟動Visual Studio ,可以命令列輸入以下命令:
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, Seventh Edition ,以及怎樣為調試設定 SQL Server 許可權 。
注意: 如果您的開發機器啟動並執行是 Windows XP Service Pack 2 ,您將需要配置Internet Connection Firewall 以允許遠端偵錯。文章怎樣啟用 SQL Server 2005 調試 中提到這一過程包含兩個步驟:“(a) 在Visual Studio 宿主機器上,必須向 Exceptions 列表添加 Devenv.exe ,並開啟 TCP 135 連接埠;(b) 在遠程 (SQL ) 機器上,必須開啟TCP 135 連接埠並向 Exceptions 列表添加 sqlservr.exe 。如果您的域策略要求通過IPSec 進行網路通訊,則必須開啟 UDP 4500 和 UDP 500 連接埠。
小結
除了支援 .NET 應用程式代碼的調試,Visual Studio 還為 SQL Server 2005 提供了多種可選的調試方法。本教程中我們學習了其中兩種方法:直接資料庫調試和應用程式調試。要直接調試一個T-SQL 資料庫對象,先通過Server Explorer 找到該對象,按右鍵該對象,然後選擇"Step Into…" 。此時,調試器會啟動,並在該資料庫物件的第一條語句處暫停。這時您可以逐步調試該對象的各條語句,查看並更改參數值。在步驟1 中我們使用了這種方法來進入 Products_SelectByCategoryID 預存程序進行調試。
應用程式調試允許直接在資料庫物件中設定斷點。當從用戶端應用程式(如一個ASP.NET web 應用程式)調用含有斷點的資料庫物件時,程式會暫停,調試器會接管程式的控制權。應用程式調試方法非常有用,原因是,它可以更清楚地展示對特定資料庫物件的調用是由哪個應用程式操作引起的。但是,比起直接資料庫調試方法,它需要進行較多的配置和設定。
我們還可通過 SQL Server Project 來對資料庫物件進行調試。我們將在下一篇教程中看到對SQL Server Project 的使用,該教程將會講述怎樣使用SQL Server Project 來建立並調試管理的資料庫對象。