次の方法で共有


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

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

エディション

Visual Basic

C#

C++

Web Developer

Express

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

[標準]

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

Pro/Team

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

この例では、SQL Server 共通言語ランタイム (SQL CLR) のユーザー定義型をデバッグする方法について説明します。 ここでは、Adventureworks サンプル データベースに新しい SQL CLR 型を作成します。 この型は、テーブル定義、INSERT ステートメント、さらに SELECT ステートメントで使用されます。

SQL CLR オブジェクトをデバッグしようとしたときに "ユーザーによってキャンセルされました" というメッセージが表示された場合は、Visual Studio を実行しているコンピューターと SQL Server を実行しているコンピューターの両方を手動で構成する必要があります。 詳細については、「方法: Transact-SQL デバッグと SQL CLR デバッグを実行するためのコンピューターを構成する」を参照してください。

注意

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。 設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。 詳細については、「設定の操作」を参照してください。

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

  1. 新しい SQL CLR プロジェクトで、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

参照

処理手順

方法: 共通言語ランタイム統合機能を使用して SQL Server のユーザー定義型を作成および実行する