演练:为 CHECK 约束创建自定义数据生成器

更新:2010 年 12 月

在 Visual Studio 高级专业版或 Visual Studio 旗舰版中,可以使用标准数据生成器在列中填充数据。 如果要填充的列已定义了一个 CHECK 约束,则填充该列的数据必须满足该 CHECK 约束。 标准数据生成器可以生成满足许多 CHECK 约束的数据。 例如,如果您有一个要求日期位于某个范围内的 CHECK 约束,则您可以使用标准 DateTime 生成器并设置 Min 和 Max 属性来满足该 CHECK 约束。

但是,标准数据生成器并不能满足所有的 CHECK 约束。 例如,如果 CHECK 约束要求日期位于两个不同范围中的任一范围内,则不能使用标准 DateTime 生成器。 在本演练中,您将创建一个能够满足这种约束的自定义数据生成器。 该生成器接受两个范围作为其输入,并生成一个位于其中一个范围内的随机日期。

在本演练中,您将执行以下任务:

  • 创建从 Generator 继承的类。

  • 创建输入属性,以便用户可以指定两个日期范围。

  • 创建要用作生成器输出的输出属性。

  • 重写 OnInitialize 方法,以便为 Random 对象提供种子并使生成器具有确定性。

  • 重写 OnGenerateNextValues 方法以生成数据。

  • 用强名称对生成器进行签名。

系统必备

需要安装 Visual Studio 高级专业版或 Visual Studio 旗舰版才能完成本演练。

创建自定义数据生成器类

通过创建类库来开始创建自定义数据生成器。

创建自定义数据生成器类

  1. 在 Visual Studio 中,用所选语言创建一个类库项目并将它命名为 GeneratorDateRanges。

  2. 在**“项目”菜单上,单击“添加引用”**。

  3. 选择**“.NET”**选项卡。

  4. 在**“组件名称”**列中,找到以下组件:

    • [Microsoft.Data.Schema]

    • [Microsoft.Data.Schema.Sql]

    • [Microsoft.Data.Schema.Tools]

    提示

    按住 Ctrl 键同时单击,以选择多个组件。

  5. 选择了所有所需的组件后,单击**“确定”**。

    此时将在**“解决方案资源管理器”中该项目的“引用”**节点下显示所选的引用。

  6. (可选,仅限 Visual Basic)在**“解决方案资源管理器”中,单击“显示所有文件”,再展开“引用”**节点以验证新引用。

  7. 打开 Class1 文件,然后在**“代码”**窗口顶部的类声明之前,添加下面的代码行:

    Imports System.Data.SqlTypes
    Imports Microsoft.Data.Schema.Tools.DataGenerator
    Imports Microsoft.Data.Schema.Extensibility
    Imports Microsoft.Data.Schema
    Imports Microsoft.Data.Schema.Sql
    
    using System.Data.SqlTypes;
    using Microsoft.Data.Schema.Tools.DataGenerator;
    using Microsoft.Data.Schema.Extensibility;
    using Microsoft.Data.Schema;
    using Microsoft.Data.Schema.Sql;
    
  8. 将该类从 Class1 重命名为 GeneratorDateRanges,并指定该类从 Generator 继承。

    警告

    默认情况下,为该类指定的名称将显示在“列详细信息”窗口上的“生成器”列中。 所指定的名称不应当与标准生成器或其他自定义生成器的名称冲突。

    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 GeneratorDateRanges  : Generator
    {
    }
    

    有关扩展兼容性特性的更多信息,请参见扩展 Visual Studio 的数据库功能

  10. 在**“文件”菜单上,单击“全部保存”**。

添加输入属性

这个自定义数据生成器接受两个日期范围作为其输入。 若要指定每个范围,用户需要分别为每个范围指定最小日期和最大日期。 因此,共需创建四个输入属性:两个最小日期和两个最大日期。

添加输入属性

  1. 创建四个成员变量来存放这两个日期范围的最小日期和最大日期:

    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. 创建四个属性来设置这两个日期范围的最小日期和最大日期。 这些属性必须具有 InputAttribute 才能被识别为输入属性。

    提示

    为了在“属性”窗口中为此数据生成器指定输入属性,必须提供一个用来在输入值和 SqlDateTime 类型之间来回转换的类型转换器。 为此,在本演练的后面,您将添加 SqlDateTimeConverter 支持类。

    <Input(TypeConverter:=GetType(SqlDateTimeConverter))> _
    Public Property Range1Min() as SqlDateTime
    
    <Input(TypeConverter:=GetType(SqlDateTimeConverter))> _
    Public Property Range1Max() as SqlDateTime 
    
    <Input(TypeConverter:=GetType(SqlDateTimeConverter))> _
    Public Property Range2Min() as SqlDateTime 
    
    <Input(TypeConverter:=GetType(SqlDateTimeConverter))> _
    Public Property Range2Max() as SqlDateTime 
    
    [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. 创建一个成员变量来存放作为输出的随机日期:

    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. 创建两个成员变量来生成随机数,如下面的示例所示。 一个变量用来生成随机日期。 另一个变量用来在两个可能的日期范围之间随机选择。

    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 方法

Visual Studio 高级专业版调用生成器的 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,再键入并确认密码,然后单击“确定”**。

    在生成解决方案时,将使用密钥文件对程序集进行签名。

  5. 在**“文件”菜单上,单击“全部保存”**。

  6. 在**“生成”菜单上,单击“生成解决方案”**。

    现在已经生成了数据生成器。 接下来,您必须在自己的计算机上注册它,以便可以在数据生成计划中使用它。

注册生成器

在对程序集进行签名和编译后,下一步是收集项目中生成的程序集信息(包括版本、区域性和 PublicKeyToken),以便于注册生成器程序集。

收集程序集信息

  1. 在**“视图”菜单上,单击“其他窗口”,然后单击“命令窗口”打开“命令”**窗口。

  2. 在**“命令”**窗口中,键入以下代码。 将 FilePath 替换为已编译的 .dll 文件的路径和文件名。 在路径和文件名的两侧加双引号。

    提示

    默认情况下,已编译的 .dll 文件的路径为 SampleGenerator\bin\Debug。

    ? System.Reflection.Assembly.LoadFrom("FilePath").FullName
    
    ? 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 文件添加到**“解决方案资源管理器”**的项目中。

    提示

    必须使用 dll 的名称(在此例中为“GeneratorDateRanges”后跟“.Extensions.xml”),程序集才能正确注册。

  5. 打开 GeneratorDateRanges.Extensions.xml 文件,将其更新以匹配以下 XML。 替换上一过程中检索的程序集的版本、区域性和 PublicKeyToken。

    提示

    扩展类型必须使用类的完全限定名。 在此例中,扩展类型为“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 目录。 Visual Studio 高级专业版启动时将会标识 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 目录和子目录中的任何扩展,并注册这些扩展以便在会话中使用。

将程序集和 XML 文件复制到 Extensions 目录并将其注册

  1. 在 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ 目录中,创建一个名为 CustomGenerators 的文件夹。

  2. 将 GeneratorDateRanges.dll 程序集文件从 项目文件夹\GeneratorDateRanges\GeneratorDateRanges\bin\Debug\ 目录复制到已创建的 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 目录。

  3. 将 GeneratorDateRanges.Extensions.xml 文件从 项目文件夹\GeneratorDateRanges\GeneratorDateRanges\ 目录复制到已创建的 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 目录。

    提示

    最佳做法是将扩展程序集放在 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 目录下的文件夹中。 此策略将帮助您标识随产品包括了哪些扩展,以及哪些扩展是您自定义创建的。 您还应考虑将扩展组织到特定于类别的文件夹中。

测试数据范围生成器

现在您已创建 DateRanges 数据生成器,接下来您必须启动 Visual Studio 的新实例。 Visual Studio 在启动时将注册已添加到 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 目录中的 GeneratorDateRanges 程序集。

接下来,您将创建可在其中验证 DateRanges 数据生成器是否正常工作的数据库项目。

创建数据库项目

  1. 启动 Visual Studio 的新实例,这将识别 GeneratorDateRanges.dll 程序集并对其进行注册。

  2. 在**“文件”菜单上指向“新建”,再单击“项目”**。

    此时将出现**“新建项目”**对话框。

  3. 在**“已安装的模板”的列表中,展开“数据库”,然后单击“SQL Server”**。

  4. 在**“模板”中,单击“SQL Server 2008 向导”**。

  5. 在**“名称”**中,键入 SampleGeneratorDB。

    提示

    如果您已完成演练:创建自定义数据生成器中的所有步骤,则意味着您已创建 SampleGeneratorDB 项目,这样您便可以转至下一个过程,即向数据库项目中添加表。

  6. 选中**“创建解决方案的目录”**复选框。

  7. 接受**“位置”“解决方案名称”“添加到源代码管理”的默认值,然后单击“确定”**。

  8. 单击**“完成”。 在完成向导后,请再次单击“完成”**。

    新数据库项目“SampleGeneratorDB”将出现在**“解决方案资源管理器”**中。

  9. 在**“视图”菜单上,单击“数据库架构视图”**。

    如果**“架构视图”**尚未显示,此时将显示该视图。

    接下来,您将向项目添加一个简单的表,其中包含一个 DateRange SQL 类型的列。

向数据库项目中添加表

  1. 在**“架构视图”中,依次展开“SampleGeneratorDB”“架构”“dbo”节点,然后单击“表”**节点。

  2. 在**“项目”菜单上,单击“添加新项”**。

    提示

    也可以在“架构视图”中右击“SampleGeneratorDB”项目,指向“添加”,然后单击“表”

  3. 在**“模板”中,单击“表”**。

    提示

    “类别”列表中,可以单击“表和视图”以更容易地找到表的模板。

  4. 在**“名称”**中,键入 TableDates 作为要指定给新表的名称。

  5. 单击**“添加”**将该表添加到数据库项目中。

    **“解决方案资源管理器”**会在数据库项目中显示新表的文件。 **“架构视图”**会显示新表对象。 此时将出现 Transact-SQL 编辑器,其中显示新表的定义。

  6. 在 Transact-SQL 编辑器中,修改表定义以匹配以下示例:

    CREATE TABLE [dbo].[TableDates]
    (
    dates DateTime
    )
    
  7. 在**“文件”菜单上,单击“保存 TableDates.table.sql”**。

在准备好表后,您将添加 CHECK 约束以验证使用的日期范围是否有效。

提示

您将在另一个过程中为自定义 DateRanges 数据生成器的属性值输入相应的日期范围。 有关更多信息,请参见创建和配置数据生成计划。

向表添加 CHECK 约束

  1. 在**“架构视图”中,展开“表”节点并单击“TableDates”**表。

  2. 在**“项目”菜单上,单击“添加新项”**。

  3. 在**“模板”中,单击“CHECK 约束”**。

    提示

    也可以在“架构视图”中右击 Dates 表,指向“添加”,然后单击“CHECK 约束”

  4. 在**“名称”**中,键入 CheckConstraintDateRanges 作为要指定给新 CHECK 约束的名称。

  5. 单击**“添加”**将 CHECK 约束添加到数据库项目中。

    **“解决方案资源管理器”**会在数据库项目中显示 CHECK 约束的新文件。 **“架构视图”**会显示新的 CHECK 约束对象。 此时将出现 Transact-SQL 编辑器,其中显示新 CHECK 约束的定义。

  6. 在 Transact-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”**。

    提示

    如果您已完成演练:创建自定义数据生成器中的所有步骤,则您可以转至创建和配置数据生成计划部分。

在准备好表和 CHECK 约束后,您可以配置数据库以供部署。

配置项目部署设置

  1. 在**“解决方案资源管理器”中,单击“SampleGeneratorDB”**项目(而非同名的解决方案)。

  2. 在**“项目”菜单上,单击“SampleGeneratorDB 属性”**。

    将显示项目的“属性”窗口。

    提示

    还可以在“解决方案资源管理器”中右击“SampleGeneratorDB”,然后单击“属性”

  3. 单击**“部署”**选项卡。

  4. 在**“部署操作”中,单击“创建部署脚本(.sql)并部署到数据库”**。

  5. 单击**“编辑”**按钮指定目标连接。

  6. 指定相应信息,以连接到要向其部署 SampleGeneratorDB 数据库的数据库服务器。

  7. 在**“选择或输入一个数据库名”**中,键入 SampleGeneratorDB。

  8. 单击**“确定”**。

    将用连接字符串填充**“目标连接”。 注意,“目标数据库名称”设置为“SampleGeneratorDB”**。

  9. 接受其他选项的默认值。

  10. 在**“文件”菜单上,单击“保存选定项”**。

    将保存该项目的生成设置。

    接下来将生成数据库项目。

生成数据库项目

  • 在**“生成”菜单上,单击“生成解决方案”**。

    即会生成数据库项目。 如果成功,则会在状态栏中显示“生成成功”消息,并会在**“输出”**窗口中显示生成结果。

    接下来将部署数据库项目。

将数据库项目部署到数据库服务器

  1. 在**“解决方案资源管理器”**中,单击“SampleGeneratorDB”项目(而非同名的解决方案)。

  2. 在**“生成”菜单上,单击“部署 SampleGeneratorDB”**。

    将使用在生成配置中指定的连接部署数据库项目。 如果成功,则会在状态栏和**“输出”**窗口中显示“部署已成功”消息。

创建和配置数据生成计划

接下来将创建数据生成计划。 数据生成计划包含有关要用数据填充哪些表和列的信息。 有关更多信息,请参见如何:创建数据生成计划

创建和配置数据生成计划

  1. 在**“解决方案资源管理器”中,选择“数据生成计划”**节点。

  2. 在**“项目”菜单上,单击“添加新项”**。

  3. 在**“类别”窗格中单击“数据生成计划”**。

  4. 在**“模板”窗格中,单击“数据生成计划”**。

  5. 在**“名称”**文本框中键入 SampleGenerator.dgen。

  6. 单击**“添加”**。

    即会创建数据生成计划。 将出现数据生成计划和**“数据生成预览”**窗口。 数据生成计划窗口按横向分为两个窗格。 上面的窗格将会列出在数据库项目架构中定义的表,在此例中为 dbo.TableDates 表。 下面的窗格将会显示上面的窗格中突出显示的表的列详细信息,在此例中为地址列。

    提示

    如果“数据生成预览”窗口尚未打开,则可以通过以下操作将其打开:打开“数据”菜单,指向“数据生成器”,然后单击“预览数据生成”。 默认情况下,“数据生成预览”窗口将作为一个选项卡停靠在数据生成计划窗口的底部。 若要展开视图,请单击窗口,然后单击“窗口”菜单上的“选项卡式文档”。 也可以右击标题栏,然后单击“以选项卡式文档停靠”

  7. 在 SampleGenerator.dgen 设计器中,确认已选择**“dbo.TableDates”表和“dates”**(日期)列。

  8. 在该表中,将**“要插入的行”**下方的值更改为 500。

  9. 在 SampleGenerator.dgen 设计器中,选择**“dates”(日期)列,然后单击“生成器”下拉列表以选择“GeneratorDateRanges”**。

  10. 在选择“dates”(日期)列后,在“属性”窗口中为两个日期输入范围键入值:

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

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

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

    • Range2Min 1/1/1800 12:00 AM

    此时已正确配置自定义地址生成器。

  11. 在**“文件”菜单上,单击“全部保存”**。

运行数据生成计划以生成日期范围数据

最后,您将运行数据生成计划,并查看使用中的自定义日期范围数据生成器。

运行生成数据的计划

  1. 在**“解决方案资源管理器”中,单击“SampleGenerator.dgen”**。

    提示

    必须打开数据生成计划。 如果计划未打开,请先将其打开。

  2. 在**“数据”菜单上,指向“数据生成器”,然后单击“生成数据”**。

    将出现**“连接到数据库”**对话框。

  3. 在**“数据生成连接信息”列表中,单击“SampleGeneratorDB”数据库,然后单击“确定”**。

  4. 提示在插入新行之前清除表内容时,单击**“是”**。

    将生成数据。 在“填充”窗口中,将用数据生成的状态更新状态列。 状态栏汇总了所有表的数据生成。

  5. (可选)使用其他工具登录数据库。 可以将 Visual Studio 高级专业版中提供的 Transact-SQL 编辑器用于此步骤。 有关更多信息,请参见 Microsoft 网站上的 Editing Database Scripts and Objects with the Transact-SQL Editor(使用 Transact-SQL 编辑器编辑数据库脚本和对象)。 通过运行以下查询查看新数据:

    use SampleGeneratorDB
    
    select * from dbo.TableDates
    

    **“结果”**选项卡将显示生成的 500 个日期。

  6. (可选)在“属性”窗口中,将**“Range1Max”**的值更改为 12/31/3000 12:00:00 AM,并通过重复步骤 2 到步骤 5 再次运行数据生成器。

    在**“错误列表”**窗口中,您将看到因违反 CHECK 约束而导致生成的错误,这是因为将日期范围更改为允许的范围之外。

请参见

任务

演练:创建自定义数据生成器

如何:注册和管理功能扩展

参考

Microsoft.Data.Schema.Tools.DataGenerator

概念

用自定义数据生成器生成专用的测试数据

数据生成器扩展性概述

指定为列生成数据的详细信息

其他资源

功能扩展疑难解答

修订记录

日期

修订记录

原因

2010 年 12 月

已纠正代码错误以解决客户反馈。

客户反馈