共用方式為


針對預存程序進行偵錯 (C#)

作者:Scott Mitchell

下載 PDF

Visual Studio Professional 和 Team System 版本可讓您設定中斷點,並逐步執行 SQL Server 內的預存程序,使偵錯預存程序就像偵錯應用程式程式碼一樣簡單。 本教學課程示範預存程序的直接資料庫偵錯和應用程式偵錯。

簡介

Visual Studio 提供豐富的偵錯體驗。 透過幾個按鍵或點按滑鼠,就可以使用中斷點停止執行程式,並檢查其狀態和控制流程。 除了偵錯應用程式程式碼之外,Visual Studio 也支援從 SQL Server 內偵錯預存程序。 就像中斷點可以在 ASP.NET 程式碼後置類別或商業規則層的類別程式碼內設定一樣,它們也可以放入預存程序中。

在本教學課程中,我們將探討從 Visual Studio 內的伺服器總管逐步執行預存程序,以及如何設定中斷點,在從執行中的 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 支援受控資料庫物件。 也就是說,您可以建立預存程序和使用者定義的函式 (UDF) 等資料庫物件,做為 C# 類別中的方法。 這可讓這些預存程序和 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 可讓您輕鬆地直接偵錯資料庫物件。 讓我們看看如何使用直接資料庫偵錯 (DDD) 功能逐步執行 Northwind 資料庫中的 Products_SelectByCategoryID 預存程序。 正如其名,Products_SelectByCategoryID 會傳回特定類別的產品資訊;它是在針對具類型的 DataSet 的 TableAdapter 使用現有預存程序教學課程中建立的。 開始先移至伺服器總管並展開 Northwind 資料庫節點。 接下來,向下切入至 [預存程序] 資料夾,以滑鼠右鍵按一下 Products_SelectByCategoryID 預存程序,然後從操作功能表選擇 [逐步執行預存程序] 選項。 這會啟動偵錯工具。

由於 Products_SelectByCategoryID 預存程序需要 @CategoryID 輸入參數,因此系統要求我們提供此值。 輸入 1,這會傳回飲料的相關資訊。

將值 1 用於 <span class=@CategoryID Parameter" />

圖 1:針對 @CategoryID 參數使用值 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_CS)。 從操作功能表中選擇 [屬性頁] 選項,選取左側的 [開始選項] 項目,然後核取 [偵錯工具] 區段中的 [SQL Server] 核取方塊 (見 [圖 3])。

核取應用程式的屬性頁中的 [SQL Server] 核取方塊

圖 3:核取應用程式的屬性頁中的 [SQL Server] 核取方塊 (按一下以檢視完整大小的影像)

此外,我們需要更新應用程式所使用的資料庫連接字串,以便停用連接共用。 當資料庫的連接關閉時,相對應的 SqlConnection 物件會放在可用的連接集區中。 建立資料庫的連接時,可以從這個集區擷取可用的連接物件,而不必建立和確立新的連接。 這個連接物件共用可增強效能,且預設會啟用。 不過,在偵錯時,我們想要關閉連接共用,因為在處理取自集區的連接時偵錯基礎結構並沒有正確地重新建立。

若要停用連接共用,請更新 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) 來恢復連接共用。

此時,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 的 TableAdapter 使用現有預存程序教學課程中建立的。 其相對應的網頁 (~/AdvancedDAL/ExistingSprocs.aspx) 包含 GridView,會顯示這個預存程序所傳回的結果。 透過瀏覽器瀏覽此頁面。 到達頁面時,會叫用 Products_SelectByCategoryID 預存程序中的中斷點,且控制項會傳回 Visual Studio。 就像在步驟 1 中一樣,您可以逐步執行預存程序的陳述式,並檢視和修改參數值。

ExistingSprocs.aspx 頁面最初會顯示飲料

圖 6ExistingSprocs.aspx 頁面最初會顯示飲料 (按一下以檢視全尺寸影像)

已到達預存程序中斷點

圖 7:已到達預存程序中斷點 (按一下以檢視完整大小的影像)

如 [圖 7] 中的 [監看式] 視窗所示,@CategoryID 參數的值是 1。 這是因為 ExistingSprocs.aspx 頁面最初會顯示飲料類別中的產品,其 CategoryID 值為 1。 從下拉式清單中選擇不同類別。 此舉會導致回傳並重新執行 Products_SelectByCategoryID 預存程序。 再次叫用中斷點,但這次 @CategoryID 參數的值會反映選取的下拉式清單項目的 CategoryID

從下拉式清單中選擇不同類別。

圖 8:從下拉式清單中選擇不同類別 (按一下以檢視完整大小的影像)

<span class=@CategoryID 參數反映從網頁選取的類別" />

圖 9@CategoryID 參數反映從網頁選取的類別 (按一下以檢視完整大小的影像)

注意

如果在瀏覽 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 使用者帳戶是屬於 sysadmin 角色的有效 SQL Server 登入帳戶。

第一個步驟相當直接明瞭。 首先,識別用來從 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.exeSQLDebug 使用者身分啟動 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, Seventh Edition》

注意

如果您的開發電腦執行 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 專案,以及如何使用它們來建立和偵錯受控資料庫物件。

祝您程式設計愉快!

關於作者

Scott Mitchell,七本 ASP/ASP.NET 書籍的作者和 4GuysFromRolla.com 創始人,自 1998 年以來便開始使用 Microsoft Web 技術。 Scott 擔任獨立顧問、講師和作家。 他的新書是 Sams Teach Yourself ASP.NET 2.0 in 24 Hours。 您可以透過 mitchell@4GuysFromRolla.com 或他的部落格 (可以在 http://ScottOnWriting.NET 找到) 與他聯繫。