共用方式為


逐步解說:偵錯 SQL CLR 使用者定義的型別

這個主題適用於:

版本

Visual Basic

C#

C++

Web Developer

Express

標題不適用於 標題不適用於 標題不適用於 標題不適用於

Standard 版

標題不適用於 標題不適用於 標題不適用於 標題不適用於

Pro/Team 版

標題適用於 標題適用於 標題適用於 標題適用於

這個範例將示範如何偵錯 SQL Server Common Language Runtime (SQL CLR) 使用者定義型別。 這個範例會在 AdventureWorks 範例資料庫中建立新的 SQL CLR 型別。 然後這個型別會用在資料表定義、INSERT 陳述式,以及 SELECT 陳述式。

當您嘗試偵錯 SQL CLR 物件時,如果出現「已由使用者取消」訊息,就必須手動設定用來執行 Visual Studio 的電腦以及正在執行 SQL Server 的電腦。 如需詳細資訊,請參閱HOW TO:設定您的電腦以啟用 Transact-SQL 和 SQL CLR 偵錯

注意事項注意事項

根據您目前使用的設定或版本,您所看到的對話方塊與功能表指令可能會與 [說明] 中描述的不同。 若要變更設定,請從 [工具] 功能表中選取 [匯入和匯出設定]。 如需詳細資訊,請參閱使用設定

若要偵錯 CLR SQL 使用者定義型別:

  1. 在新的 SQL CLR 專案中,建立與 AdventureWorks 範例資料庫的連接。 如需詳細資訊,請參閱How to: Connect to a Database

  2. 使用下列第一個範例區段中的程式碼建立新型別,並將其命名為 Point.cs。 如需詳細資訊,請參閱How to: Develop with the SQL Server Project Type

  3. 加入測試型別的指令碼。 在 [方案總管] 中,以滑鼠右鍵按一下 [TestScripts] 目錄,再按 [加入測試指令碼],然後插入底下第二個範例區段中的程式碼。 使用名稱 Point.sql 來儲存檔案。 以滑鼠右鍵按一下這個檔案名稱,再按 [設定為預設偵錯指令碼]。

  4. 加入中斷點。

    1. 在 [伺服器總管] 的 [型別] 資料夾中,開啟 Point。

    2. 在每個方法中放置中斷點,以便能觀察型別內的控制流程。

  5. 從 [偵錯] 功能表,選擇 [啟動],對專案進行編譯、部署和單元測試。 當中斷點上出現以黃色箭頭表示的指令指標時,即表示您正在偵錯函式。

  6. 嘗試不同的偵錯功能。

    1. 在 Point.sql 中,指令碼的每個 INSERT 陳述式都會執行一次 Parse 方法。 重複按 [偵錯] 功能表中的 [逐步執行],您便可監看方法如何將冒號分隔的數字對轉換成 Point 物件。

    2. 在 [區域變數] 視窗中,開啟包含目前正在建置中之 Point 的變數 pt。

    3. 在 [文字編輯器] 內,按兩下 pt 變數來選取它。 將 pt 拖曳至 [監看式] 視窗中的任何位置。 pt 現在已加入至監看變數清單中,並且可以在建置 Point 時進行觀察。

    4. 逐步執行類別數次,並且觀察 INSERT 和 SELECT 取得路徑之間的差異。

    5. 再次按 [繼續],以完成此函式的偵錯動作。

範例

以下是定義本範例中所使用型別的程式碼。 這個程式碼會建立名為 Points 的資料表、插入資料列至此表中,並且列印出資料表內容。 請注意,您不需要在建立資料表和存取資料表之間包含批次命令 GO。 事實上,Visual Studio 2005 會將 GO 解譯為無效的 SQL 命令。

using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Runtime.Serialization;

[Serializable, SqlUserDefinedTypeAttribute(Format.Native)]
public struct Point: INullable
{
    private bool m_isNull;
    private double m_x;
    private double m_y;

    public bool IsNull {
        get { return (m_isNull); }
    }

    public override string ToString()
    {
        if (this.IsNull) { return "NULL"; }
        else { return this.m_x + ":" + this.m_y; }
    }

    public static Point Parse(SqlString s)
    {
        if (s.IsNull) { return Null; }
        else
        {
            // Parse input string here to separate out points:
            Point pt = new Point();
            string str = Convert.ToString(s);
            string[] xy = str.Split(':');

            pt.X = Convert.ToDouble(xy[0]);
            pt.Y = Convert.ToDouble(xy[1]);
            return (pt);
        }
    }

    public static Point Null
    {
        get
        {
            Point pt = new Point();
            pt. m_isNull = true;
            return (pt);
        }
    }

    public double X
    {
        get { return (this.m_x); }
        set { m_x = value; }
    }

    public double Y
    {
        get { return (this.m_y); }
        set { m_y = value; }
    }
}

此為呼叫函式的測試指令碼。

CREATE TABLE dbo.Points ( 
            ID int IDENTITY(1,1) PRIMARY KEY, 
            Pnt Point) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '3:4')) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '-1:5')) 
INSERT INTO dbo.Points (Pnt) VALUES (CAST ('1:99' AS Point)) 
SELECT ID, 
        Pnt.ToString() as StringPoint, 
        Pnt.X as X, 
        Pnt.Y as Y      
FROM dbo.Points

請參閱

工作

HOW TO:使用 Common Language Run-time 整合建立和執行 SQL Server 使用者定義型別