共用方式為


如何偵錯 CLR 資料庫物件

適用於:SQL Server

SQL Server 支援在資料庫中偵錯 Transact-SQL 及通用語言執行平台 (CLR) 物件。 在 SQL Server 中偵錯的關鍵在於容易設定和使用,以及 SQL Server 偵錯程式與 Microsoft Visual Studio 偵錯程式的整合。 此外,偵錯可跨語言運作。 使用者可以順暢地從 Transact-SQL 進入 CLR 物件,反之亦然。 SQL Server Management Studio 中的 Transact-SQL 偵錯工具無法用於偵錯 Managed 資料庫物件,但您可以使用 Visual Studio 中的偵錯工具來偵錯物件。 在 Visual Studio 中的 Managed 資料物件支援所有通用偵錯功能,例如伺服器上執行之常式內的「逐步執行」和「不進入函數」陳述式。 偵錯工具可在偵錯期間,設定中斷點、檢查呼叫堆疊,檢查變數,以及修改變數值。

注意

Visual Studio .NET 2003 無法用於 CLR 整合程式設計或偵錯。 SQL Server 包含預先安裝的 .NET Framework,且 Visual Studio .NET 2003 無法使用 .NET Framework 2.0 組件。

偵錯使用權限及限制

偵錯是一種高度授權的作業,因此在 SQL Server 中只有 sysadmin 固定伺服器角色的成員才能執行此作業。

偵錯時會套用下列限制:

  • 偵錯 CLR 常式一次只限於一個偵錯工具執行個體。 因為在叫用中斷點時,所有 CLR 程式碼執行都會凍結,在偵錯工具從中斷點繼續前進之前不會繼續執行,所以要套用此限制。 但是,您可以在其他連接中繼續偵錯 Transact-SQL。 雖然 Transact-SQL 偵錯不會凍結伺服器上的其他執行,但仍會因保留鎖定而讓其他連接等待。

  • 無法偵錯現有連接,只能偵錯新連接。這是因為 SQL Server 需要用戶端及偵錯工具環境的詳細資訊,才能夠建立連接。

由於上述限制,我們建議在測試伺服器上偵錯 Transact-SQL 和 CLR 程式碼,而不要在生產伺服器上進行。

概觀

SQL Server 中的偵錯遵循基於每個連接模型。 偵錯工具僅會偵測及偵錯其與用戶端之連接的活動。 因為偵錯工具的功能不受連接類型的限制,所以可以對表格式資料流 (TDS) 及 HTTP 連接進行偵錯。 不過,SQL Server 不允許偵錯現有的連接。 偵錯支援在伺服器上執行的常式內的所有通用偵錯功能。 偵錯工具與 SQL Server 透過分散式元件物件模型 (COM) 進行互動。

關於偵錯受控預存程序、函數、觸發程序、使用者定義型別和彙總,如需其詳細資訊和案例,請參閱 Visual Studio 文件集中的 SQL Server CLR 整合資料庫偵錯主題。

務必在 SQL Server 執行個體上啟用 TCP/IP 網路通訊協定,才能夠使用 Visual Studio 進行遠端開發、偵錯和開發。 如需在伺服器上啟用 TCP/IP 通訊協定的詳細資訊,請參閱設定用戶端通訊協定

偵錯步驟

請使用下列步驟,在 Microsoft Visual Studio 中偵錯 CLR 資料庫物件:

  1. 開啟 Microsoft Visual Studio 並建立新的 SQL Server 專案。 您可以使用隨附於 Visual Studio 的 SQL LocalDB 執行個體。

  2. 建立新的 SQL CLR 類型 (C#):

    1. 在 [方案總管]中,以滑鼠右鍵按一下專案並選取 [新增]、[新增項目...]。
    2. 從 [新增專案] 的視窗中,選取 [SQL CLR C# 預存程序]、[SQL CLR C# 使用者定義型別函數]、[SQL CLR C# 使用者定義型別]、[SQL CLR C# 觸發程序]、[SQL CLR C# 彙總值] 或 [類別]。
    3. 為新類型的來源檔案指定名稱,然後選取 [加入]。
  3. 將新類型的程式碼加入至文字編輯器。 如需範例預存程序的程式碼範例,請參閱本文稍後的〈範例〉一節。

  4. 加入測試類型的指令碼:

    1. 在 [方案總管]中,以滑鼠右鍵按一下專案節點並選取 [加入]、[指令碼...]。
    2. 在 [新增項目]視窗中,選取 [指令碼] (不在組建中),然後指定名稱,例如 Test.sql。 選取 [新增] 按鈕。
    3. 在 [方案總管]中,按兩下 Test.sql 節點以開啟預設的測試指令碼來源檔案。
    4. 將測試指令碼 (用來叫用要偵錯的程式碼) 加入至文字編輯器。 如需指令碼範例,請參閱下一節中的範例。
  5. 在原始程式碼中放置一或多個中斷點。 在您要偵錯的函數或常式上以滑鼠右鍵按一下文字編輯器中的程式碼。 選取 [中斷點]、[插入中斷點]。 中斷點隨即加入,程式碼行則以紅色反白顯示。

  6. 在 [偵錯]功能表中,請選取 [開始偵錯],對該專案進行編譯、部署和測試。 系統會執行 Test.sql 中的測試指令碼,並叫用受控資料庫物件。

  7. 在黃色箭號 (指定指令指標) 出現在中斷點時,程式碼執行會暫停。 您便可以偵錯您的受控資料庫物件:

    1. 您可以從 [偵錯] 功能表選擇 [不進入函數],將指令指標前進至下一行程式碼。
    2. [本機]視窗是用於觀察目前由指令指標反白顯示物件的狀態。
    3. 將變數新增至 [監看式]視窗。 在整個偵錯工作階段中,即使變數不在目前由指令指標反白顯示的那行程式碼中,您仍可觀察受監看變數的狀態。
    4. 從 [偵錯] 功能表選取 [繼續],將指令指標前進至下一個中斷點,或者如果沒有中斷點,就完成該常式的執行。

程式碼範例

下列範例將 SQL Server 版本傳回至呼叫者。

using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void GetVersion()
    {
        using (var connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            var command = new SqlCommand("select @@version", connection);
            SqlContext.Pipe.ExecuteAndSend(command);
        }
    }
}

測試指令碼範例

下列測試指令碼顯示如何叫用上個範例中定義的 GetVersion 預存程序。

EXEC GetVersion  

下一步

如需使用 Visual Studio 偵錯受控程式碼的詳細資訊,請參閱 Visual Studio 文件中的偵錯受控程式碼

如需詳細資訊,請參閱通用語言執行平台程式設計概念