次の方法で共有


チュートリアル : SQL CLR のユーザー定義型のデバッグ

更新 : 2007 年 11 月

このトピックの内容は、次の製品に該当します。

Edition

Visual Basic

C#

C++

Web Developer

Express

トピック該当なし トピック該当なし トピック該当なし トピック該当なし

Standard

トピック該当なし トピック該当なし トピック該当なし トピック該当なし

Pro/Team

トピック該当 トピック該当 トピック該当 トピック該当

表の凡例 :

トピック該当

対象

トピック該当なし

該当なし

トピックは該当しますが、コマンドは既定では非表示です

既定で非表示のコマンド

この例では、SQL CLR のユーザー定義型のデバッグ方法を示します。ここでは、Adventureworks サンプル データベースに新しい SQL CLR 型を作成します。この型は、テーブル定義、INSERT ステートメント、さらに SELECT ステートメントで使用されます。

ms165056.alert_note(ja-jp,VS.90).gifメモ :

使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

SQL CLR のユーザー定義型をデバッグするには

  1. 新しい SQL Server プロジェクトで、AdventureWorks サンプル データベースとの接続を確立します。詳細については、「方法 : データベースに接続する」を参照してください。

  2. 後述の最初のサンプルにあるコードを使用して、新しい型を作成し、Point.cs と名前を付けます。詳細については、「方法 : SQL Server のプロジェクトの種類を使用して開発する」を参照してください。

  3. 型をテストするスクリプトを追加します。ソリューション エクスプローラの TestScripts ディレクトリを右クリックし、[テスト スクリプトの追加] をクリックして、後述する 2 つ目のサンプルにあるコードを挿入します。ファイルに Point.sql と名前を付けて、保存します。ファイル名を右クリックし、[既定のデバッグ スクリプトの設定] をクリックします。

  4. ブレークポイントを追加します。

    1. サーバー エクスプローラの [Types] フォルダで、Point を開きます。

    2. 型の内部的な制御フローを確認できるように、各メソッド内にブレークポイントを設定します。

  5. [デバッグ] メニューの [開始] をクリックして、プロジェクトのコンパイル、配置、および単体テストを実行します。黄色の矢印で表される命令ポインタがブレークポイントに表示されて、関数のデバッグが行われます。

  6. いろいろなデバッグ機能を試してください。

    1. Point.sql のスクリプトで、INSERT ステートメントごとに Parse メソッドが 1 回実行されます。[デバッグ] メニューの [ステップ イン] を繰り返しクリックすると、メソッドがコロンで区切られた数字の組み合わせを Point オブジェクトに変換する過程を観察できます。

    2. [ローカル] ウィンドウで、変数 pt を開きます。この変数には、現在構築中の Point が含まれます。

    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

参照

処理手順

方法 : CLR の SQL Server ユーザー定義型を作成および実行する

その他の技術情報

SQL CLR データベースのデバッグ