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

標準データ ジェネレータを使用すると、列に Visual Studio Team System Database Edition のデータを読み込むことができます。 読み込む列に CHECK 制約が定義されている場合、列に読み込まれるデータは、その CHECK 制約を満たしている必要があります。 標準データ ジェネレータは、さまざまな CHECK 制約を満たすデータを生成できます。 たとえば、日付が特定の範囲に存在しなければならない CHECK 制約がある場合は、標準の DateTime ジェネレータを使用して、その CHECK 制約を満たすように [最小値] および [最大値] プロパティを設定できます。

ただし、標準データ ジェネレータはすべての CHECK 制約を満たすことができるわけではありません。 たとえば、2 つの異なる範囲のどちらかに日付が存在しなければならない CHECK 制約がある場合は、標準の DateTime ジェネレータは使用できません。 このチュートリアルでは、こうした制約を満たすことができるカスタム データ ジェネレータを作成します。 ジェネレータは、入力として 2 つの範囲を受け取り、2 つの範囲のいずれかでランダムな日付を生成します。

このチュートリアルでは、次のタスクを行います。

  • Generator を継承するクラスを作成します。

  • ユーザーが 2 つの日付の範囲を指定できる入力プロパティを作成します。

  • ジェネレータ出力として使用する出力プロパティを作成します。

  • OnInitialize メソッドをオーバーライドして Random オブジェクトをシードし、ジェネレータを確定します。

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

  • ジェネレータに厳密な名前で署名します。

前提条件

このチュートリアルを実行するには、Database Edition をインストールしておく必要があります。

カスタム データ ジェネレータ クラスの作成

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

カスタム データ ジェネレータ クラスを作成するには

  1. Visual Studio で、選択した言語でクラス ライブラリ プロジェクトを作成し、GeneratorDateRanges という名前を付けます。

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

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

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

    Aa833175.alert_note(ja-jp,VS.90).gifヒント :

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

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

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

  6. (省略可能、Visual Basic のみ) ソリューション エクスプローラで、[すべてのファイルを表示] をクリックし、[参照設定] ノードを展開して、新しい参照を確認します。

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

    Imports System.Data.SqlTypes
    Imports Microsoft.Data.Schema.DataGenerator
    Imports Microsoft.Data.Schema.Extensibility;
    Imports Microsoft.Data.Schema.Sql.SqlDsp;
    
    Using System.Data.SqlTypes;
    using Microsoft.Data.Schema.DataGenerator;
    using Microsoft.Data.Schema.Extensibility;
    using Microsoft.Data.Schema.Sql.SqlDsp;
    
  8. クラスの名前を Class1 から GeneratorDateRanges に変更し、Generator からのクラスの継承を指定します。

    Aa833175.alert_caution(ja-jp,VS.90).gif注意 :

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

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

    <DatabaseSchemaProviderCompatibility(GetType(SqlDatabaseSchemaProvider))> _
    Public Class GeneratorDateRanges
        Inherits Generator
    
    End Class
    
    [DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))]
    public class AddressGenerator : Generator
    {
    }
    

    拡張機能互換性属性の詳細については、「Database Edition の機能の拡張」を参照してください。

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

入力プロパティの追加

このカスタム データ ジェネレータは、入力として 2 つの日付の範囲を受け取ります。 それぞれの範囲を指定するには、それぞれの日付の最小値と最大値を指定します。 したがって、日付の最小値 2 つと最大値 2 つの合わせて 4 つの入力プロパティを作成する必要があります。

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

  1. 次の例に示すように、2 つの日付の範囲の最小値と最大値を保持する 4 つのメンバ変数を作成します。

    Dim range1MinValue As SqlDateTime
    Dim range1MaxValue As SqlDateTime
    
    Dim range2MinValue As SqlDateTime
    Dim range2MaxValue As SqlDateTime
    
    SqlDateTime range1MinValue;
    SqlDateTime range1MaxValue;
    
    SqlDateTime range2MinValue;
    SqlDateTime range2MaxValue;
    
  2. 2 つの日付の範囲の最小値と最大値を設定する 4 つのプロパティを作成します。 このプロパティには、入力プロパティとしての識別のための InputAttribute が必要です。

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

    [プロパティ] ウィンドウでこのジェネレータの入力プロパティを指定するには、入力値を SqlDateTime 型に変換する (またはその逆方向に変換する) ための型コンバータを提供する必要があります。 これを行うために、このチュートリアルの後の手順で、この操作を実行するための SqlDateTimeConverter クラスを追加します。

    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range1Min() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range1MinValue = value
        End Set
        Get
            Return range1MinValue
        End Get
    End Property
    
    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range1Max() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range1MaxValue = value
        End Set
        Get
            Return range1MaxValue
        End Get
    End Property
    
    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range2Min() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range2MinValue = value
        End Set
        Get
            Return range2MinValue
        End Get
    End Property
    
    <Input(TypeConverter:= GetType(SqlDateTimeConverter))> _
    Public Property Range2Max() As SqlDateTime
        Set(ByVal value As SqlDateTime)
            range2MaxValue = value
        End Set
        Get
            Return range2MaxValue
        End Get
    End Property
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range1Min
    {
        set {range1MinValue = value;}
        get {return range1MinValue;}
    }
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range1Max
    {
        set {range1MaxValue = value;}
        get {return range1MaxValue;}
    }
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range2Min
    {
        set {range2MinValue = value;}
        get {return range2MinValue;}
    }
    
    [Input(TypeConverter = typeof(SqlDateTimeConverter))]
    public SqlDateTime Range2Max
    {
        set {range2MaxValue = value;}
        get {return range2MaxValue;}
    }
    
  3. [ファイル] メニューの [すべてを保存] をクリックします。

出力プロパティの追加

このカスタム データ ジェネレータは、出力として 1 つのランダムな日付を返します。 したがって、出力プロパティを 1 つ作成する必要があります。

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

  1. 次の例に示すように、出力用のランダムな日付を保持するメンバ変数を作成します。

    Dim randomDateValue As SqlDateTime
    
    SqlDateTime randomDateValue;
    
  2. 出力としてランダムな日付を返すプロパティを作成します。 このプロパティには、出力プロパティとして識別するための OutputAttribute が必要です。

    <Output()> _
    Public ReadOnly Property RandomDate() As SqlDateTime
        Get
            Return randomDateValue
        End Get
    End Property
    
    [Output]
    public SqlDateTime RandomDate
    {
        get {return randomDateValue;}
    }
    
  3. [ファイル] メニューの [すべてを保存] をクリックします。

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

ランダム データを生成する場合、確定的なデータにすることも、非確定的なデータにすることもできます。 確定的なデータの場合は、同じシードからデータを生成するたびに、同じデータが繰り返し生成されます。 すべてのデータ ジェネレータには、ユーザーが設定できる Seed プロパティがあります。 OnInitialize メソッドをオーバーライドして Random オブジェクトをシードし、ジェネレータを確定することができます。

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

  1. 次の例に示すように、乱数を生成する 2 つのメンバ変数を作成します。 一方の変数はランダムな日付を生成します。 もう一方の変数は、可能性のある 2 つの日付の範囲からランダムに選択します。

    Dim random As Random
    Dim randomRange As Random
    
    Random random;
    Random randomRange;
    
  2. 次の例に示すように、OnInitialize メソッドをオーバーライドします。

    Protected Overrides Sub OnInitialize(ByVal initInfo As GeneratorInit)
    
        random = New Random(Me.Seed)       'deterministic
        randomRange = New Random(Me.Seed)  'deterministic
    
        'random = New Random()              'non-deterministic
        'randomRange = New Random()         'non-deterministic
    
        MyBase.OnInitialize(initInfo)
    End Sub
    
    protected override void OnInitialize(GeneratorInit initInfo)
    {
        random = new Random(this.Seed);       //deterministic
        randomRange = new Random(this.Seed);  //deterministic
    
        //random = new Random();                //non-deterministic
        //randomRange = new Random();           //non-deterministic
    
        base.OnInitialize(initInfo);
    }
    
  3. [ファイル] メニューの [すべてを保存] をクリックします。

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

Database Edition は、ジェネレータの OnGenerateNextValues メソッドを呼び出すことにより、必要なデータを作成します。出力プロパティ用にランダムな日付を生成するロジックを実装するには、このメソッドをオーバーライドする必要があります。

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

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

    Protected Overrides Sub OnGenerateNextValues()
    
        Dim min As SqlDateTime
        Dim max As SqlDateTime
    
        'Generate a random date from either range 1 or range 2.
        'Randomly select either range 1 or range 2 by randomly 
        'generating an odd or an even random number.
        '------------------------------------------------------------
        If randomRange.Next() Mod 2 = 0 Then  'check for odd or even
            min = range1MinValue
            max = range1MaxValue
        Else
            min = range2MinValue
            max = range2MaxValue
        End If
    
        'The formula for creating a random number in a specific range is:
        'start of range + (size of range * random number between 0 and 1)
    
        'size of range
        Dim range As TimeSpan = max.Value - min.Value
    
        '(size of range * random number between 0 and 1)
        Dim randomNumber As TimeSpan = New TimeSpan(CLng(range.Ticks * random.NextDouble()))
    
        'start of range + (size of range * random number between 0 and 1)
        randomDateValue = min + randomNumber
    
    End Sub
    
    protected override void OnGenerateNextValues()
    {
        SqlDateTime min;
        SqlDateTime max;
    
        //Generate a random date from either range 1 or range 2.
        //Randomly select either range 1 or range 2 by randomly 
        //generating an odd or an even random number.
        //------------------------------------------------------------
        if (randomRange.Next() % 2 == 0)  //check for odd or even
        {
            min = range1MinValue;
            max = range1MaxValue;
        }
        else
        {
            min = range2MinValue;
            max = range2MaxValue;
        }
    
        //The formula for creating a random number in a specific range is:
        //start of range + (size of range * random number between 0 and 1)
    
        //size of range
        TimeSpan range = max.Value - min.Value;
    
        //(size of range * random number between 0 and 1)
        TimeSpan randomNumber = new TimeSpan((long)(range.Ticks * random.NextDouble()));
    
        //start of range + (size of range * random number between 0 and 1)
        randomDateValue = min + randomNumber;
    }
    
  2. [ファイル] メニューの [すべてを保存] をクリックします。

型コンバータの定義

[プロパティ] ウィンドウでこのジェネレータの入力プロパティを指定するには、入力値を SqlDateTime 型に変換する (またはその逆方向に変換する) ための型コンバータを提供する必要があります。

SqlDateTime 型コンバータのクラスを作成するには

  1. [プロジェクト] メニューの [クラスの追加] を選択します。

    [新しい項目の追加] ダイアログ ボックスが表示されます。

  2. [名前] に「SqlDateTimeConverter」と入力します。

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

    Imports System.ComponentModel
    Imports System.Data.SqlTypes
    Imports System.Globalization
    
    using System.ComponentModel;
    using System.Data.SqlTypes;
    using System.Globalization;
    
  4. TypeConverter を継承するクラスを指定します。

    Public Class SqlDateTimeConverter
        Inherits TypeConverter
    
    End Class
    
    public class SqlDateTimeConverter: TypeConverter
    {
    }
    
  5. クラス宣言にクラス コンストラクタを追加します。 Visual Basic で型コンバータのクラスを記述している場合は、手順 6. に進んでください。

    public SqlDateTimeConverter()
    {
    }
    
  6. クラス コンストラクタを追加したら、次の例に示すように、この型コンバータを使用して特定の変換が可能であるかどうかを確認するためのメソッドを追加します。

    Public Overrides Function CanConvertFrom(ByVal context As ITypeDescriptorContext, ByVal sourceType As Type) As Boolean
        Dim result As Boolean
        result = False
        If (sourceType Is GetType(System.String)) Then
            result = True
        Else
            result = MyBase.CanConvertFrom(context, sourceType)
        End If
        Return result
    End Function 
    
    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
        If (destinationType Is GetType(System.String)) Then
            Return True
        End If
        Return MyBase.CanConvertTo(context, destinationType)
    End Function
    
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        bool result = false;
        if (sourceType == typeof(string))
        {
            result = true;
        }
        else
        {
            result = base.CanConvertFrom(context, sourceType);
        }
        return result;
    }
    
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(string))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }
    
  7. 最後に、次の例に示すように、コンバータのメソッドを追加します。

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        Dim dateTimeString As String
        dateTimeString = value.ToString
        If (dateTimeString.Length > 0) Then
            Dim dateTime As Date
            dateTime = Date.Parse(dateTimeString, culture)
            Return New SqlDateTime(dateTime)
        End If
        Return MyBase.ConvertFrom(context, culture, value)
    End Function
    
    Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
        If (destinationType Is GetType(System.String)) Then
            Dim dateTime As Date
            dateTime = CType(value, SqlDateTime).Value
            Return dateTime.ToString(culture)
        End If
        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function 
    
            public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
            {
                string dateTimeString = value as string;
                if (dateTimeString != null)
                {
                    DateTime dateTime = DateTime.Parse(dateTimeString, culture);
                    return new SqlDateTime(dateTime);
                }
                return base.ConvertFrom(context, culture, value);
            }
    
            public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
            {
                if (destinationType == typeof(string))
                {
                    DateTime dateTime = ((SqlDateTime)value).Value;
                    return dateTime.ToString(culture);
                }
                return base.ConvertTo(context, culture, value, destinationType);
            }
    
  8. [ファイル] メニューの [すべてを保存] をクリックします。

ジェネレータへの署名

すべてのカスタム データ ジェネレータは、厳密な名前で署名してから登録する必要があります。

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

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

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

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

  4. [キー ファイル名] ボックスに「GeneratorDateRangesKey」と入力し、パスワードとパスワードの確認を入力し、[OK] をクリックします。

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

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

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

    これで、データ ジェネレータがビルドされました。 次に、このデータ ジェネレータをコンピュータに登録して、データ生成計画で使用できるようにする必要があります。

ジェネレータの登録

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

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

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

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

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

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

    ? System.Reflection.Assembly.LoadFrom(@"<FilePath>").FullName
    
  3. Enter キーを押します。 具体的な PublicKeyToken の値を含む次のような行が表示されます。

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

    このアセンブリ情報をメモするか、コピーします。この情報は次の手順で使用します。

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

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

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

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

  3. [テンプレート] ペインで、[XML ファイル] という項目を探してクリックします。

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

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

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

    アセンブリを正しく登録するには、使用する dll の名前 (この例では "GeneratorDateRanges" の後に ".Extensions.xml" を付けます) を入力する必要があります。

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

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

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

    <?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="GeneratorDateRanges.GeneratorDateRanges" assembly=" GeneratorDateRanges, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/>
    
    </extensions>
    
  6. [ファイル] メニューの [すべてを保存] をクリックします。

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

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

  1. <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\ ディレクトリに CustomGenerators という名前の新しいフォルダを作成します。

  2. GeneratorDateRanges.dll アセンブリ ファイルを、My Documents\Visual Studio 2008\Projects\GeneratorDateRanges\GeneratorDateRanges\bin\Debug\ ディレクトリから、前の手順で作成した <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\CustomGenerators ディレクトリにコピーします。

  3. GeneratorDateRanges.Extensions.xml ファイルを、My Documents\Visual Studio 2008\Projects\GeneratorDateRanges\GeneratorDateRanges\ ディレクトリから、前の手順で作成した <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\CustomGenerators ディレクトリにコピーします。

    Aa833175.alert_note(ja-jp,VS.90).gifヒント :

    拡張機能アセンブリは、<Microsoft Visual Studio 9.0>\VSTSDB\Extensions ディレクトリにフォルダを作成して格納することをお勧めします。 これにより、もともと製品に用意されていた拡張機能と、自分の作成した拡張機能を識別できます。 また、フォルダを使用すると、拡張機能を詳細なカテゴリに分類することもできます。

Date Ranges ジェネレータのテスト

これで DateRanges データ ジェネレータが作成されました。次に Database Edition の新しいインスタンスを起動する必要があります。 Database Edition が起動すると、<Microsoft Visual Studio 9.0>\VSTSDB\Extensions\CustomGenerators ディレクトリに追加した GeneratorDateRanges アセンブリが登録されます。

次に、DateRanges データ ジェネレータが正しく機能するかどうかを確認するためのデータベース プロジェクトを作成します。

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

  1. Database Edition の新しいインスタンスを起動します。これにより、GeneratorDateRanges.dll アセンブリが認識および登録されます。

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

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

  3. [プロジェクトの種類] の [データベース プロジェクト] を展開し、[Microsoft SQL Server 2005] をクリックします。

  4. [テンプレート] の [SQL Server 2005 ウィザード] をクリックします。

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

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

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

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

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

  8. [完了] をクリックします。 ウィザードが完了したら、もう一度 [完了] をクリックします。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

これでテーブルが作成されました。次は、CHECK 制約を追加して、使用されている日付の範囲が有効かどうかを確認します。

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

別の手順で、カスタムの DateRanges データ ジェネレータのプロパティ値に、対応する日付の範囲を入力します。 詳細については、「データ生成計画の作成と構成」を参照してください。

テーブルに CHECK 制約を追加するには

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

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

  3. [テンプレート] の [CHECK 制約] をクリックします。

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

    スキーマ ビューで Dates テーブルを右クリックし、[追加] をポイントして、[CHECK 制約] をクリックする方法もあります。

  4. [名前] ボックスに、新しい CHECK 制約の名前として「CheckConstraintDateRanges」と入力します。

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

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

  6. T-SQL エディタで、次の例に示すように CHECK 制約の定義を変更します。

    ALTER TABLE [dbo].[TableDates]
    ADD CONSTRAINT [CheckConstraintDateRanges] 
    CHECK ((dates BETWEEN '1/1/1800' AND '1/1/1900')OR(dates BETWEEN '1/1/1979' AND '12/31/2008'))
    
  7. [ファイル] メニューの [Dates.CheckConstraintDateRanges.chkconst.sql の保存] をクリックします。

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

    チュートリアル: カスタム データ ジェネレータの作成」の手順をすべて完了している場合は、「データ生成計画の作成と構成」に進んでください。

テーブルと CHECK 制約が作成されました。これでデータベースを配置用に構成できます。

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

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

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

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

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

    ソリューション エクスプローラで 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.TableDates テーブル) が示されます。 下部のペインには、上部のペインで強調表示されているテーブルの列 (この例では address 列) の詳細が表示されます。

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

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

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

  8. テーブルで、[挿入行] の下の値を 500 に変更します。

  9. SampleGenerator.dgen デザイナで、[dates] 列を選択して [ジェネレータ] ドロップダウン ボタンをクリックし、[GeneratorDateRanges] をクリックします。

  10. [dates] 列を選択した状態で、[プロパティ] ウィンドウで 2 つの日付の範囲の入力値を次のように入力します。

    • Range1Max12/31/2008 12:00:00 AM

    • Range1Min1/1/1979 12:00:00 AM

    • Range2Max1/1/1900 12:00:00 AM

    • Range2Min1/1/1800 12:00 AM

    これでカスタムの DateRanges ジェネレータが正しく構成されました。

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

データ生成計画の実行による日付の範囲データの生成

最後に、データ生成計画を実行して、カスタムの DateRanges データ ジェネレータが機能するかどうかを確認します。

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

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

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

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

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

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

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

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

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

  5. (省略可能) 別のツールを使用して、データベースにログオンします。 この手順では、Database Edition に用意されている Transact-SQL (T-SQL) エディタを使用することもできます。 詳細については、「Transact-SQL エディタを使用したデータベース スクリプトおよびオブジェクトの編集」を参照してください。次のクエリを実行して、新しいデータを表示します。

    use SampleGeneratorDB
    
    select * from dbo.TableDates
    

    [結果] タブに、結果の日付が 500 個表示されます。

  6. (省略可能) [プロパティ] ウィンドウで、[Range1Max] の値を「12/31/3000 12:00:00 AM」に変更し、手順 2. ~ 5. を繰り返してデータ ジェネレータをもう一度実行します。

    [エラー一覧] ウィンドウに、CHECK 制約に違反した (日付の範囲が許可されている範囲を超えて変更された) ために生成されたエラーが表示されます。

参照

処理手順

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

概念

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

参照

Microsoft.VisualStudio.TeamSystem.Data.DataGenerator

その他の技術情報

カスタム データ ジェネレータの作成

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

標準データ ジェネレータの使用

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