このトピックの内容は、次の製品に該当します。
エディション |
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 のユーザー定義型をデバッグするには
新しい SQL CLR プロジェクトで、AdventureWorks サンプル データベースへの接続を確立します。 詳細については、「方法 : データベースへの接続します。」を参照してください。
後述の最初のサンプルにあるコードを使用して、新しい型を作成し、Point.cs と名前を付けます。 詳細については、「方法 : SQL Server プロジェクトの種類と開発します。」を参照してください。
型をテストするスクリプトを追加します。 ソリューション エクスプローラーの TestScripts ディレクトリを右クリックし、[テスト スクリプトの追加] をクリックして、後述する 2 つ目のサンプルにあるコードを挿入します。 ファイルに Point.sql と名前を付けて、保存します。 ファイル名を右クリックし、[既定のデバッグ スクリプトの設定] をクリックします。
ブレークポイントを追加します。
サーバー エクスプローラーの [Types] フォルダーで Point を開きます。
型の内部的な制御フローを確認できるように、各メソッド内にブレークポイントを設定します。
[デバッグ] メニューの [開始] をクリックして、プロジェクトのコンパイル、配置、および単体テストを実行します。 黄色の矢印で表される命令ポインターがブレークポイントに表示されて、関数のデバッグが行われます。
いろいろなデバッグ機能を試してください。
Point.sql 内のスクリプトの各 INSERT ステートメントについて、Parse メソッドがそれぞれ 1 回ずつ実行されます。 [デバッグ] メニューの [ステップ イン] を繰り返しクリックすると、メソッドがコロンで区切られた数字の組み合わせを Point オブジェクトに変換する過程を観察できます。
[ローカル] ウィンドウで、変数 pt を開きます。この変数には、現在構築中の Point が含まれます。
テキスト エディターで、pt 変数をダブルクリックして選択します。 [ウォッチ] ウィンドウの任意の場所に pt をドラッグします。 この操作により、pt がウォッチ対象の変数リストに追加されます。リストに追加された変数は、Point がビルドされる際に確認できます。
クラス全体を数回ステップ実行し、INSERT と SELECT がたどるパスの違いを確認します。
関数のデバッグを終了するには、もう一度 [続行] をクリックします。
使用例
これは、この例で使用される型を定義するコードです。 このコードにより、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