次の方法で共有


チュートリアル: カスタム データ ジェネレーターの作成

データベース スキーマを開発するとき、できる限り本番データに近いデータを使用してテスト データベースを作成することで、提示された変更を、より効果的にテストできます。 カスタム データ ジェネレーターは、組み込みのデータ ジェネレーターよりも厳密に仕様を満たすテスト データを提供します。 たとえば、指定したリストからランダムな文字列を使用したり、指定した範囲内の数字を使用したりして、テーブルの列にデータを読み込むジェネレーターを作成できます。 詳細については、「データ ジェネレーター機能拡張の概要」を参照してください。

このトピックでは、ランダムな住所文字列を生成するカスタム データ ジェネレーターを作成する方法を手順に沿って説明します。 このチュートリアルでは、次のタスクを行います。

  1. Generator を継承する、カスタム住所データ ジェネレーターのクラス ライブラリを作成します。

  2. ジェネレーター出力として使用する出力プロパティを追加します。

  3. OnGenerateNextValues メソッドをオーバーライドして、データを生成します。

  4. ジェネレーター アセンブリに署名します。

  5. アセンブリに関連付けられた登録用の XML ファイルを作成します。

  6. カスタム データ ジェネレーターをテストするためのデータベース プロジェクトとデータ生成計画を作成します。

必須コンポーネント

このチュートリアルを完了するには、Visual Studio Premium または Visual Studio Ultimate がインストールされている必要があります。

カスタム ジェネレーターのクラス ライブラリの作成

まず、カスタム住所データ ジェネレーターのクラス ライブラリを作成します。

カスタム ジェネレーターのクラス ライブラリを作成するには

  1. Visual C# クラス ライブラリ プロジェクトを作成し、SampleGenerator という名前を付けます。

  2. ソリューション エクスプローラーで、プロジェクトを右クリックし、[参照の追加] をクリックします。

  3. [.NET] タブをクリックします。

  4. [コンポーネント名] 列で、次のコンポーネントを選択します。

    • Microsoft.Data.Schema

    • Microsoft.Data.Schema.Sql

    • Microsoft.Data.Schema.Tools

    ヒント

    複数のコンポーネントを選択するには、Ctrl キーを押しながらコンポーネントをクリックします。

  5. 必要なすべてのコンポーネントを選択したら、[OK] をクリックします。

    ソリューション エクスプローラーで、選択された参照がプロジェクトの [参照設定] ノードに表示されます。

  6. [コード] ウィンドウの一番上のクラス宣言の前に、次のコード行を追加します。

    using Microsoft.Data.Schema.Tools.DataGenerator;
    using Microsoft.Data.Schema.Extensibility;
    using Microsoft.Data.Schema;
    using Microsoft.Data.Schema.Sql;
    
  7. クラス名を Class1 から AddressGenerator に変更します。

    ヒント

    既定では、クラス名として指定した名前は、[列の詳細] ウィンドウの [ジェネレーター] 列の一覧に表示されます。 組み込みのジェネレーターや他のカスタム ジェネレーターの名前と競合しない名前を指定してください。

    public class AddressGenerator
    {
    }
    
  8. 次の例に示すように、Generator からのクラスの継承を指定します。

    public class AddressGenerator : Generator
    {
    }
    
  9. 次の例に示すように、DatabaseSchemaProviderCompatibilityAttribute を追加します。

    [DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))]
    public class AddressGenerator : Generator
    {
    }
    

    拡張機能の互換性属性の詳細については、「Visual Studio のデータベース機能の拡張」を参照してください。

  10. [ファイル] メニューの [すべてを保存] をクリックします。

ジェネレーターへの出力プロパティの追加

前のセクションでは、Generator クラスを継承するクラス ライブラリを作成しました。 このセクションでは、クラスに出力プロパティを追加します。 出力プロパティには、生成されたデータの値を指定します。 出力プロパティは、このジェネレーターで生成できるデータの種類も指定します。

出力プロパティを追加するには

  1. 次の例に示すように、住所の生成に使用するメンバー変数を作成します。

    _address 変数は、後の手順の出力プロパティで使用されます。

    private Random _random;
    private string _street;
    private string _city;
    private string _state;
    private int _zipCode;
    private string _address;
    
    private static readonly List<String> _states =
                new List<string>() { "AK", "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY" };
    
  2. 次の例に示すように、_random メンバー変数のプライベート プロパティを作成します。

    private Random Random
            {
                get
                {
                    if (_random == null)
                        _random = new Random(base.Seed);
    
                    return _random;
                }
            }
    
  3. 次の例に示すように、_address メンバー変数のパブリック プロパティを作成し、それに OutputAttribute を追加します。

    [Output(Description = "Generates street and city values of \"2150 Newton Street, San Francisco\", with random state and zip code.", Name = "Address")]
            public string Address
            {
                get
                {
                    return this._address;
                }
            }
    
  4. [ファイル] メニューの [すべてを保存] をクリックします。

OnGenerateNextValues メソッドのオーバーライド

Visual Studio は、必要とする値のセットごとに各ジェネレーターの OnGenerateNextValues メソッドを呼び出します。 データ ジェネレーターを作成する場合、このメソッドをオーバーライドして、出力プロパティのそれぞれに対して値を生成するロジックを指定する必要があります。

OnGenerateNextValues メソッドをオーバーライドするには

  1. 次の例に示すように、OnGenerateNextValues メソッドをオーバーライドします。

    protected override void OnGenerateNextValues()
    {
        this._street = "2150 Newton Street";
                this._city = "San Francisco";
                this._state = _states[Random.Next(0, _states.Count)];
                this._zipCode = Int32.Parse(String.Format("{0}{1}{2}{3}{4}", GetRandomDigit(1), GetRandomDigit(), GetRandomDigit(), GetRandomDigit(), GetRandomDigit()));
                this._address = String.Format("{0}, {1}, {2} {3}", _street, _city, _state, _zipCode);
    }
    
  2. _zipcode 変数の値の作成に使用する次のメソッドを追加します。

    private int GetRandomDigit()
            {
                return GetRandomDigit(0);
            }
    
            private int GetRandomDigit(int lowNumber)
            {
                return Random.Next(lowNumber, 10);
            }
    
  3. [ファイル] メニューの [すべてを保存] をクリックします。

ジェネレーターへの署名

次に、厳密な名前でカスタム データ ジェネレーターに署名する必要があります。

ジェネレーターに厳密な名前で署名するには

  1. [プロジェクト] メニューの [SampleGenerator のプロパティ] をクリックします。

  2. [署名] タブの [アセンブリの署名] チェック ボックスをオンにします。

  3. [厳密な名前のキー ファイルを選択してください] ボックスの一覧の [<新規作成...>] をクリックします。

    [厳密な名前キーの作成] ダイアログ ボックスが表示されます。

  4. [キー ファイル] ボックスに「SampleGeneratorKey」と入力します。

  5. パスワードとパスワードの確認を入力し、[OK] をクリックします。

    ソリューションをビルドすると、このキー ファイルを使ってアセンブリが署名されます。

  6. [ファイル] メニューの [すべてを保存] をクリックします。

  7. [ビルド] メニューの [ソリューションのビルド] をクリックします。

    これで、カスタム データ ジェネレーターが作成されました。

ジェネレーター アセンブリの登録

アセンブリが署名され、コンパイルされたら、ジェネレーター アセンブリの登録を効率化するために、プロジェクトで生成された、バージョン、カルチャ、PublicKeyToken などのアセンブリ情報を収集します。

アセンブリ情報を収集するには

  1. [表示] メニューの [その他のウィンドウ] をポイントし、[コマンド ウィンドウ] をクリックして、[コマンド] ウィンドウを開きます。

  2. [コマンド] ウィンドウに、次のコードを入力します。 FilePath をコンパイル済みの .dll ファイルのパスとファイル名に置き換えます。 パスとファイル名は引用符で囲みます。

    注意

    既定では、コンパイル済みの .dll ファイルのパスは SampleGenerator\bin\Debug です。

    ? System.Reflection.Assembly.LoadFrom(@"<FilePath>").FullName
    
  3. Enter キーを押します。 行は次のようになり、PublicKeyToken に固有の値が表示されます。

    " SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
    

    このアセンブリ情報を記録またはコピーして、次の手順で使用します。

次に、前の手順で収集したアセンブリ情報を使用して XML ファイルを作成します。

XML ファイルを作成するには

  1. ソリューション エクスプローラーで、SampleGenerator プロジェクトを選択します。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  3. [テンプレート] ペインで、[XML ファイル] という項目を見つけて選択します。

  4. [名前] ボックスに「SampleGenerator.Extensions.xml」と入力し、[追加] をクリックします。

    SampleGenerator.Extensions.xml ファイルがソリューション エクスプローラーのプロジェクトに追加されます。

    注意

    アセンブリを正しく登録するためには、dll の名前を使用する必要があります (この場合は、"SampleGenerator" の後に ".Extensions.xml" を付けます)。

  5. SampleGenerator.Extensions.xml ファイルを開き、次の XML に一致するように更新します。 前の手順で取得したアセンブリのバージョン、カルチャ、および PublicKeyToken を置換します。

    注意

    拡張機能の型には、クラスの完全修飾名を使用する必要があります。 この例では、extension type="SampleGenerator.AddressGenerator" と指定します。

    <?xml version="1.0" encoding="utf-8"?>
    <extensions assembly="" version="1" xmlns="urn:Microsoft.Data.Schema.Extensions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd">
     
    <extension type="SampleGenerator.AddressGenerator" assembly="SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/>
     
    </extensions>
     
    
  6. [ファイル] メニューの [すべてを保存] をクリックします。

次に、アセンブリと XML ファイルを Extensions ディレクトリにコピーします。 Visual Studio Premium の起動時に、%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions ディレクトリとそのサブディレクトリ内の拡張機能が識別され、セッションで使用できるように登録されます。

アセンブリと XML ファイルを Extensions ディレクトリにコピーして登録するには

  1. %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ ディレクトリに、CustomGenerators という名前のフォルダーを作成します。

  2. 作成した %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ CustomGenerators フォルダーに、ProjectFolder\SampleGenerator\SampleGenerator\bin\Debug\ ディレクトリの SampleGenerator.dll アセンブリ ファイルをコピーします。

  3. 作成した %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ CustomGenerators ディレクトリに、ProjectFolder\SampleGenerator\SampleGenerator\ ディレクトリの SampleGenerator.Extensions.xml ファイルをコピーします。

    注意

    拡張機能のアセンブリは、%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions ディレクトリ内のフォルダーに配置することをお勧めします。 これにより、製品に付属していた拡張機能と、カスタマイズして作成した拡張機能を区別しやすくなります。 また、拡張機能をカテゴリごとに分類し、それぞれ別のフォルダーに保存することも検討してください。

住所ジェネレーターのテスト

住所データ ジェネレーターを作成したので、Visual Studio の新しいインスタンスを起動する必要があります。 Visual Studio が起動すると、%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators ディレクトリに追加した SampleGenerator アセンブリが登録されます。 次に、住所データ ジェネレーターが正しく動作することを確認できるデータベース プロジェクトを作成します。

データベース プロジェクトを作成するには

  1. Visual Studio の新しいインスタンスを起動します。このインスタンスが SampleGenerator.dll アセンブリを認識し、登録します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  3. [インストールされたテンプレート] で、[データベース] ノードを展開し、[SQL Server] ノードをクリックします。

  4. テンプレートの一覧の [SQL Server 2008 データベース プロジェクト] をクリックします。

  5. [名前] ボックスに「SampleGeneratorDB」と入力します。

    注意

    チュートリアル : CHECK 制約のカスタム データ ジェネレーターの作成」の手順がすべて完了している場合は、SampleGeneratorDB プロジェクトが既に作成されているため、手順 9. に進むことができます。

  6. [ソリューションのディレクトリを作成] チェック ボックスをオンにします。

  7. [場所] ボックス、[ソリューション名] ボックス、および [ソース管理に追加] ボックスの既定値をそのまま使用し、[OK] をクリックします。

  8. [OK] をクリックします。

    ソリューション エクスプローラーに、新しいデータベース プロジェクト SampleGeneratorDB が表示されます。

  9. [表示] メニューの [データベース スキーマ ビュー] をクリックします。

    スキーマ ビューがまだ表示されていない場合は、表示されます。

次に、列が 1 つだけの varchar SQL 型の単純なテーブルをプロジェクトに追加します。

データベース プロジェクトにテーブルを追加するには

  1. スキーマ ビューで、[SampleGeneratorDB] ノード、[スキーマ] ノード、[dbo] ノードを順に展開し、[テーブル] ノードをクリックします。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

    注意

    スキーマ ビューで [SampleGeneratorDB] プロジェクトを右クリックし、[追加] をポイントして、[テーブル] をクリックするという方法もあります。

  3. [テンプレート][テーブル] をクリックします。

    注意

    [カテゴリ] ボックスの一覧で、[テーブルとビュー] をクリックすると、テーブルのテンプレートをより簡単に検索できます。

  4. [名前] ボックスに、新しいテーブルの名前として「Addresses」と入力します。

  5. [追加] をクリックして、テーブルをデータベース プロジェクトに追加します。

    ソリューション エクスプローラーに、データベース プロジェクトの新しいテーブルのファイルが表示されます。 スキーマ ビューに新しいテーブル オブジェクトが表示されます。 Transact-SQL エディターが表示され、新しいテーブルの定義が表示されます。

  6. Transact-SQL エディターで、次の例に示すようにテーブルの定義を変更します。

    CREATE TABLE [dbo].[Addresses]
    (
    address varchar(100)
    )
    
  7. [ファイル] メニューの [Addresses.table.sql の保存] をクリックします。

テーブルを追加したので、データベースを配置用に設定できます。

プロジェクト配置設定を構成するには

  1. ソリューション エクスプローラーで、[SampleGeneratorDB] (ソリューションではなくプロジェクト) をクリックします。

  2. [プロジェクト] メニューの [SampleGeneratorDB のプロパティ] をクリックします。

    プロジェクトの [プロパティ] ウィンドウが表示されます。

    注意

    ソリューション エクスプローラーで [SampleGeneratorDB] を右クリックし、[プロパティ] をクリックするという方法もあります。

  3. [配置] タブをクリックします。

  4. [配置動作] ボックスの一覧の、[配置スクリプト (.sql) を作成してデータベースに配置します] をクリックします。

  5. [編集] をクリックし、ターゲット接続を指定します。

  6. SampleGeneratorDB データベースを配置するデータベース サーバーへの接続情報を指定します。

  7. [データベースの選択または入力] に「SampleGeneratorDB」と入力します。

  8. [OK] をクリックします。

    [ターゲット接続] ボックスに接続文字列が入力されます。 [ターゲット データベース名] は SampleGeneratorDB に設定されます。

  9. その他のオプションについては既定値を使用します。

  10. [ファイル] メニューの [選択されたファイルを上書き保存] をクリックします。

    プロジェクト ビルドの設定が保存されます。

次に、データベース プロジェクトをビルドします。

データベース プロジェクトをビルドするには

  • [ビルド] メニューの [ソリューションのビルド] をクリックします。

    データベース プロジェクトがビルドされます。 成功した場合は、ステータス バーに "ビルド正常終了" というメッセージが表示され、出力ウィンドウにビルド結果が表示されます。

次に、データベース プロジェクトを配置します。

データベース プロジェクトをデータベース サーバーに配置するには

  1. ソリューション エクスプローラーで、[SampleGeneratorDB] (ソリューションではなくプロジェクト) をクリックします。

  2. [ビルド] メニューの [SampleGeneratorDB の配置] をクリックします。

    ビルド構成に指定した接続を使用して、データベース プロジェクトが配置されます。 "配置に成功しました。" というメッセージがステータス バーと出力ウィンドウに表示されます。

データ生成計画の作成と設定

次に、データ生成計画を作成します。 データ生成計画には、データ入力先のテーブルと列に関する情報が含まれています。 詳細については、「方法 : データ生成計画を作成する」を参照してください。

データ生成計画を作成および設定するには

  1. ソリューション エクスプローラーで、[Data Generation Plans] ノードを選択します。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  3. カテゴリ ペインで、[データ生成計画] をクリックします。

  4. テンプレート ペインで、[データ生成計画] をクリックします。

  5. [プロジェクト名] ボックスに「SampleGenerator.dgen」と入力します。

  6. [追加] をクリックします。

    データ生成計画が作成されます。 データ生成計画が表示されます。

    データ生成計画ウィンドウは、上下 2 つのペインに分割されています。 上のペインには、データベース プロジェクト スキーマ内に定義されているテーブル (ここでは dbo.Addresses テーブル) が一覧表示されます。 下のペインには、上のペインで強調表示されているテーブルの列 (ここでは address 列) の詳細が表示されます。

    注意

    [データ生成プレビュー] ウィンドウが開いていない場合は、[データ] メニューの [データ生成] をポイントし、[データ生成のプレビュー] をクリックして開くことができます。 既定では、[データ生成プレビュー] ウィンドウは、データ生成計画ウィンドウの下部にドッキングされ、タブが付けられています。 ビューを展開するには、ウィンドウをクリックし、[ウィンドウ] メニューの [タブ付きドキュメント] をクリックします。 タイトル バーを右クリックし、[タブ付きドキュメントとしてドッキング] をクリックするという方法もあります。

  7. SampleGenerator.dgen デザイナーで、dbo.Addresses テーブルと address 列の両方のチェック ボックスがオンになっていることを確認します。

  8. SampleGenerator.dgen デザイナーで、address 列を選択し、[ジェネレーター] ボックスの一覧をクリックして [AddressGenerator] をクリックします。

    これで、カスタム住所ジェネレーターが正しく設定されました。

  9. [ファイル] メニューの [すべてを保存] をクリックします。

データ生成計画の実行による住所データの生成

最後に、データ生成計画を実行し、カスタム住所データ ジェネレーターの動作を確認します。

データ生成計画を実行するには

  1. ソリューション エクスプローラーで、[SampleGenerator.dgen] をクリックします。

    注意

    また、データ生成計画も開いている必要があります。 計画が開いていない場合は、最初に開いてください。

  2. [データ] メニューの [データ ジェネレーター] をポイントし、[データの生成] をクリックします。

    [データベースへの接続] ダイアログ ボックスが表示されます。

  3. [データ生成接続情報] ボックスの一覧の [SampleGeneratorDB] データベースをクリックし、[OK] をクリックします。

  4. 新しい行を挿入する前にテーブルの内容を消去するかどうか確認するメッセージが表示された場合、[はい] をクリックします。

    データが生成されます。 [母集団] ウィンドウで、状態列がデータ生成の状態に更新されます。 ステータス バーには、全テーブルのデータ生成の概要が表示されます。

  5. (省略可能) 別のツールを使用して、データベースにログオンします。 この手順で、Visual Studio Premium に組み込まれた Transact-SQL エディターを使用できます。 詳細については、Microsoft Web サイトの「データベース スクリプトと、Transact SQL エディターでのオブジェクトの編集」を参照してください。

  6. 次のクエリを実行して、新しいデータを表示します。

    use SampleGeneratorDB
    
    select * from dbo.Addresses
    

    [結果] タブに、ランダムに生成された州と郵便番号で構成される住所が表示されます。

次の手順

Visual Studio Premium および Visual Studio Ultimate には DateTime ジェネレーターがあり、ジェネレーターの Min および Max プロパティを使用して日付が特定の範囲内にあることを要求する CHECK 制約が定義された列で使用できます。 「チュートリアル : CHECK 制約のカスタム データ ジェネレーターの作成」では、日付が 2 つの異なる範囲のいずれかに含まれていることを要求する CHECK 制約が定義された列に使用するカスタム データ ジェネレーターを作成します。

参照

処理手順

方法: 拡張機能を登録および管理する

方法 : 入力プロパティをデータ ジェネレーターに追加する

方法 : 出力プロパティをデータ ジェネレーターに追加する

方法 : カスタム データ ジェネレーターを作成する

チュートリアル : データ生成計画の作成と実行

参照

Microsoft.Data.Schema.Tools.DataGenerator

概念

Visual Studio のデータベース機能の拡張

データ ジェネレーター機能拡張の概要

その他の技術情報

Transact-SQL エディターを使用したデータベース スクリプトおよびオブジェクトの編集

アセンブリおよびマニフェストへの署名の管理