共用方式為


針對預存程序進行偵錯 (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 支援 Managed 資料庫物件。 也就是說,您可以在 C# 類別中建立資料庫物件,例如預存程式和 User-Defined Functions (UDF) 作為方法。 這可讓這些預存程式和 UDF 利用自有自訂類別中的 .NET Framework 和功能。 當然,SQL Server 2005 也支援 T-SQL 資料庫物件。

SQL Server 2005 提供 T-SQL 和 Managed 資料庫物件的偵錯支援。 不過,這些物件只能透過Visual Studio 2005 Professional和Team Systems版本進行偵錯。 在本教學課程中,我們將檢查 T-SQL 資料庫對象的偵錯。 後續的教學課程會探討對Managed資料庫對象進行偵錯。

SQL Server 2005 CLR 整合小組SQL Server 2005 部落格文章中的 T-SQL 和 CLR 偵錯概觀,強調從 Visual Studio 對 SQL Server 2005 物件進行偵錯的三種方式:

  • 直接資料庫偵錯 (DDD) - 從伺服器總管,我們可以逐步執行任何 T-SQL 資料庫物件,例如預存程式和 UDF。 我們將在步驟 1 中檢查 DDD。
  • 應用程式偵 錯 - 我們可以在資料庫物件內設定斷點,然後執行我們的 ASP.NET 應用程式。 執行資料庫物件時,將會叫用斷點,並控制故障轉移至調試程式。 請注意,透過應用程式偵錯,我們無法從應用程式程式代碼逐步執行資料庫物件。 我們必須在希望調試程式停止的預存程式或 UDF 中明確設定斷點。 從步驟 2 開始,會檢查應用程式偵錯。
  • 從 SQL Server Project 進行偵錯 - Visual Studio Professional 和 Team Systems 版本包含通常用來建立 Managed 資料庫物件的 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 Database 物件一節。

最後,瞭解 T-SQL 資料庫物件的偵錯支援不像 .NET 應用程式的偵錯支援一樣豐富。 例如,不支援斷點條件和篩選條件,只有偵錯視窗的子集可用、您無法使用 [編輯後繼續]、[實時運算] 視窗會轉譯為無用狀態等等。 如需詳細資訊 ,請參閱調試程式命令和功能的限制

步驟 1:直接逐步執行預存程式

Visual Studio 可讓您輕鬆地直接對資料庫對象進行偵錯。 讓我們看看如何使用直接資料庫偵錯 (DDD) 功能,逐步執行 Products_SelectByCategoryID Northwind 資料庫中的預存程式。 如其名稱所示, Products_SelectByCategoryID 會傳回特定類別的產品資訊;它是在 針對具型別數據集的 TableAdapters 教學課程使用現有預存程式中 建立的。 從移至 [伺服器總管] 開始,然後展開 Northwind 資料庫節點。 接下來,向下切入 [預存程式] 資料夾,以滑鼠右鍵按下 Products_SelectByCategoryID 預存程式,然後從操作功能表選擇 [逐步執行預存程式] 選項。 這會啟動調試程式。

由於預 Products_SelectByCategoryID 存程式需要 @CategoryID 輸入參數,因此我們會要求您提供此值。 輸入 1,這會傳回有關咖啡的資訊。

針對 <span class=@CategoryID Parameter“ /> 使用 Value 1

圖 1:使用參數的值 1 @CategoryID

提供 參數的值 @CategoryID 之後,會執行預存程式。 不過,調試程式會停止在第一個語句上執行,而不是執行至完成。 請注意邊界中的黃色箭號,指出預存程式中的目前位置。 您可以透過 [監看式] 視窗檢視和編輯參數值,或將滑鼠停留在預存程式中的參數名稱上。

調試程式已在預存程式的 First 語句上停止

圖 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 物件會放在可用連線的集區中。 建立資料庫的連線時,可以從這個集區擷取可用的連接物件,而不需要建立和建立新的連接。 連接物件的這個共用是效能增強功能,預設會啟用。 不過,在偵錯時,我們想要關閉連線共用,因為偵錯基礎結構在處理取自集區的連線時未正確重新建立。

若要停用連線共用,請更新 中的 NORTHWNDConnectionStringWeb.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>

注意

完成 SQL Server 透過 ASP.NET 應用程式偵錯之後,請務必從 連接字串 (移除Pooling設定,或將它設定為 Pooling=true ) ,以恢復連線共用。

此時,ASP.NET 應用程式已設定為允許 Visual Studio 在透過 Web 應用程式叫用時偵錯 SQL Server 資料庫物件。 現在,剩下的就是將斷點新增至預存程式並開始偵錯!

步驟 3:新增斷點和偵錯

開啟預Products_SelectByCategoryID存程式,然後在語句開頭單擊邊界,或將游標SELECT放在語句開頭並按下 F9,以在語句開頭SELECT設定斷點。 如圖 4 所示,斷點會顯示為邊界中的紅色圓圈。

在 Products_SelectByCategoryID 預存程式中設定斷點

圖 4:在預存程式中設定斷點 Products_SelectByCategoryID (按兩下即可檢視大小完整的影像)

為了讓 SQL 資料庫物件透過用戶端應用程式進行偵錯,必須設定資料庫以支援應用程式偵錯。 當您第一次設定斷點時,應該會自動開啟此設定,但建議您仔細檢查。 以滑鼠右鍵按兩下 NORTHWND.MDF [伺服器總管] 中的節點。 操作功能表應該包含名為 [應用程式偵錯] 的核取功能表項。

確定 [應用程式偵錯] 選項已啟用

圖 5:確定已啟用應用程式偵錯選項

設定斷點並啟用 [應用程式偵錯] 選項后,我們即可在從 ASP.NET 應用程式呼叫時偵錯預存程式。 移至 [偵錯] 功能表並選擇 [開始偵錯]、按 F5 或按單擊工具列中的綠色播放圖示,以啟動調試程式。 這會啟動調試程式並啟動網站。

Products_SelectByCategoryID 存程式是在 針對具型別數據集的 TableAdapters 教學課程使用現有的預存程式中 建立的。 其對應的網頁 () ~/AdvancedDAL/ExistingSprocs.aspx 包含顯示此預存程式所傳回結果的 GridView。 透過瀏覽器瀏覽此頁面。 到達頁面時,將會叫用預存程式中的 Products_SelectByCategoryID 斷點,並控制傳回至 Visual Studio。 就像在步驟 1 中一樣,您可以逐步執行預存程式的 語句,並檢視和修改參數值。

[ExistingSprocs.aspx] 頁面一開始會顯示[擷取]

圖 6:頁面 ExistingSprocs.aspx 一開始會顯示 [ (按兩下即可檢視全大小影像)

已達到預存程式斷點

圖 7:已達到預存程式斷點, (按兩下即可檢視完整大小的影像)

如圖 7 所示的 [監看式] 視窗,參數的值 @CategoryID 是 1。 這是因為 ExistingSprocs.aspx 頁面一開始會在咖啡類別中顯示產品,其 CategoryID 值為 1。 從下拉式清單中選擇不同的類別。 這樣做會導致回傳並重新執行 Products_SelectByCategoryID 預存程式。 再次叫用斷點,但這次 @CategoryID 參數值會反映選取的下拉式清單專案 s CategoryID

從 Drop-Down 清單中選擇不同的類別

圖 8:從 [Drop-Down 列表] 中選擇不同的類別, (按兩下即可檢視完整大小的影像)

<span class=@CategoryID Parameter 反映從網頁選取的類別]/>

圖 9:參數 @CategoryID 會反映從網頁選取的類別, (按兩下即可檢視完整大小的影像)

注意

如果在瀏覽ExistingSprocs.aspx頁面時未叫用預存程式中的Products_SelectByCategoryID斷點,請確定 ASP.NET 應用程式 [屬性] 頁面的 [調試程式] 區段中已核取 [SQL Server] 複選框,該聯機共用已停用,而且已啟用資料庫的 [應用程式偵錯] 選項。 如果您仍然遇到問題,請重新啟動 Visual Studio,然後再試一次。

對遠端實例上的 T-SQL Database 對象進行偵錯

當 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 以使用者身分啟動Visual Studio SQLDebugrunas.exe 允許以不同用戶帳戶的身分執行特定應用程式。 若要將 Visual Studio 啟動為 SQLDebug,您可以在命令行中輸入下列語句:

runas.exe /user:SQLDebug "%PROGRAMFILES%\Microsoft Visual Studio 8\Common7\IDE\devenv.exe"

如需此程式的詳細說明,請參閱 William R. VaughnHitchhiker 指南 Visual Studio 和第七版 SQL Server

注意

如果您的開發電腦執行 Windows XP Service Pack 2,您必須設定因特網連線防火牆以允許遠端偵錯。 操作說明:啟用 SQL Server 2005 偵錯一文指出這包含兩個步驟: (Visual Studio 主計算機上) ,您必須新增Devenv.exe至例外狀況清單並開啟 TCP 135 埠; (b) 在遠端 (SQL) 計算機上,您必須開啟 TCP 135 連接埠並新增sqlservr.exe至例外狀況列表。 如果您的網域原則需要透過IPSec完成網路通訊,您必須開啟UDP 4500和UDP 500埠。

摘要

除了提供 .NET 應用程式程式代碼的偵錯支援之外,Visual Studio 也提供各種適用於 2005 SQL Server 偵錯選項。 在本教學課程中,我們已探討其中兩個選項:直接資料庫偵錯和應用程式偵錯。 若要直接偵錯 T-SQL 資料庫物件,請透過 [伺服器總管] 找出對象,然後以滑鼠右鍵單擊它,然後選擇 [逐步執行]。 這會啟動調試程式,並在資料庫物件的第一個語句上停止,此時您可以逐步執行對象的語句,並檢視和修改參數值。 在步驟 1 中,我們使用此方法逐步執行 Products_SelectByCategoryID 預存程式。

應用程式偵錯允許直接在資料庫物件內設定斷點。 從用戶端應用程式叫用具有斷點的資料庫物件時, (例如 ASP.NET Web 應用程式) ,程式會在調試程式接管時停止。 應用程式偵錯很有用,因為它更清楚地顯示哪些應用程式動作會導致叫用特定的資料庫物件。 不過,它需要比直接資料庫偵錯更多的組態和設定。

資料庫物件也可以透過 SQL Server Projects 進行偵錯。 我們將在下一個教學課程中探討如何使用 SQL Server Projects,以及如何使用這些專案來建立及偵錯 Managed 資料庫物件。

快樂的程序設計!

關於作者

Scott Mitchell 是 1998 年以來,1998 年與 Microsoft Web 技術合作的 篇 ASP/ASP.NET 書籍和 4GuysFromRolla.com 作者。 Scott 是獨立的顧問、訓練者和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以透過mitchell@4GuysFromRolla.com部落格連到,也可以透過其部落格來存取,網址為 http://ScottOnWriting.NET