共用方式為


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

更新:2007 年 11 月

這個主題適用於:

版本

Visual Basic

C#

C++

Web Developer

Express 版

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

Standard 版

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

Pro/Team 版

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

表格圖例:

標題適用於

套用

標題不適用於

不套用

預設會套用主題但隱藏命令

預設隱藏的命令。

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

注意事項:

您所看見的對話方塊與功能表命令可能會與 [說明] 中所描述的有所不同,視您所使用的設定或版本而定。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定

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

  1. 在新的 SQL Server 專案中,建立與 [AdventureWorks] 範例資料庫的連接。如需詳細資訊,請參閱 HOW TO:連接資料庫

  2. 使用下列第一個範例區段中的程式碼建立新型別,並將其命名為 Point.cs。如需詳細資訊,請參閱 HOW TO:使用 SQL Server 專案類型開發

  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:建立及執行 CLR SQL Server 使用者定義型別

其他資源

SQL CLR 資料庫偵錯