Condividi tramite


Procedura dettagliata: creazione di un generatore dati personalizzato per un vincolo CHECK

Aggiornamento: novembre 2007

È possibile utilizzare generatori di dati standard per riempire colonne con dati in Visual Studio Team System Database Edition. Se sulla colonna che si desidera riempire è stato definito un vincolo CHECK, i dati da utilizzare per riempire la colonna devono soddisfare tale vincolo. I generatori di dati standard consentono di generare dati che soddisfano molti vincoli CHECK. In presenza, ad esempio, di un vincolo CHECK che richiede l'utilizzo di una data compresa in un intervallo specifico, sarà possibile utilizzare il generatore DateTime standard e impostare le proprietà Min e Max per soddisfare il vincolo.

I generatori di dati standard non sono tuttavia in grado di soddisfare tutti i vincoli CHECK. Se ad esempio un vincolo CHECK richiede che una data sia compresa in uno di due intervalli distinti, non sarà possibile utilizzare il generatore DateTime standard. In questa procedura dettagliata viene creato un generatore di dati personalizzato in grado di soddisfare un tale vincolo. Il generatore accetta due intervalli come input e genera una data casuale compresa in uno di tali intervalli.

Nota:

È possibile adottare un altro approccio per la creazione di un generatore di dati personalizzato e ottenere lo stesso risultato tramite l'extensibility dell'aggregazione. Per ulteriori informazioni, vedere Procedura dettagliata: creazione di un generatore di dati personalizzato che aggrega i generatori standard.

In questa procedura dettagliata verranno eseguite le attività seguenti:

  • Creare una classe che eredita da Generator.

  • Creare le proprietà di input in modo che l'utente possa specificare i due intervalli di date.

  • Creare una proprietà di output da utilizzare come output del generatore.

  • Eseguire l'override del metodo OnInitialize per inizializzare gli oggetti Random e rendere deterministico il generatore.

  • Eseguire l'override del metodo OnGenerateNextValues per generare i dati.

  • Firmare il generatore con un nome sicuro.

Prerequisiti

Per completare questa procedura dettagliata, è necessario disporre dei seguenti elementi:

  • Database Edition

Creazione della classe del generatore di dati personalizzato

Per creare la classe del generatore di dati personalizzato

  1. In Visual Studio creare un progetto Libreria di classi nel linguaggio desiderato e denominarlo GeneratorDateRanges.

  2. Scegliere Aggiungi riferimento dal menu Progetto.

    Verrà visualizzata la finestra di dialogo Aggiungi riferimento.

  3. Fare clic sulla scheda .NET. Nell'elenco Nome componente fare clic su Microsoft.VisualStudio.TeamSystem.Data, quindi scegliere OK.

  4. (Facoltativo, solo Visual Basic) In Esplora soluzioni fare clic su Mostra tutti i file ed espandere il nodo Riferimenti per verificare il nuovo riferimento.

  5. Nella parte superiore della finestra Codice aggiungere la seguente riga di codice prima della dichiarazione di classe:

    Imports Microsoft.VisualStudio.TeamSystem.Data.DataGenerator
    Imports System.Data.SqlTypes
    
    using Microsoft.VisualStudio.TeamSystem.Data.DataGenerator;
    using System.Data.SqlTypes;
    
  6. Rinominare la classe da Class1 a GeneratorDateRanges, quindi specificare che la classe eredita da Generator.

    Attenzione:

    Per impostazione predefinita, il nome assegnato alla classe è quello che viene visualizzato nell'elenco della colonna Generatore nella finestra Dettagli colonna. Specificare un nome che non sia in conflitto con il nome di un generatore standard o di un altro generatore personalizzato.

    Public Class GeneratorDateRanges
        Inherits Generator
    
    End Class
    
    public class GeneratorDateRanges: Generator
    {
    }
    
  7. Scegliere Salva tutto dal menu File.

Aggiunta delle proprietà di input

Questo generatore di dati personalizzato accetta due intervalli di date come input. Per specificare ogni intervallo, l'utente imposta la data minima e la data massima per ciascuno di essi. Pertanto, è necessario creare quattro proprietà di input in totale: due date minime e due date massime.

Per aggiungere le proprietà di input

  1. Creare quattro variabili membro per contenere le date minime e massime per i due intervalli di date.

    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. Creare quattro proprietà per impostare le date minime e massime per i due intervalli di date. Le proprietà devono avere l'attributo InputAttribute affinché siano identificate come proprietà di input.

    <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. Scegliere Salva tutto dal menu File.

Aggiunta della proprietà di output

Questo generatore di dati personalizzato restituisce un'unica data casuale come output. Pertanto, è necessario creare un'unica proprietà di output.

Per aggiungere la proprietà di output

  1. Creare una variabile membro per contenere la data casuale che costituisce l'output.

    Dim randomDateValue As SqlDateTime
    
    SqlDateTime randomDateValue;
    
  2. Creare una proprietà per restituire la data casuale come output. La proprietà deve avere l'attributo OutputAttribute affinché sia identificata come proprietà di output.

    <Output()> _
    Public ReadOnly Property RandomDate() As SqlDateTime
        Get
            Return randomDateValue
        End Get
    End Property
    
    [Output]
    public SqlDateTime RandomDate
    {
        get {return randomDateValue;}
    }
    
  3. Scegliere Salva tutto dal menu File.

Override del metodo OnInitialize

I dati casuali generati possono essere deterministici o non deterministici. Nei dati deterministici gli stessi dati vengono ripetuti ogni volta che vengono generati dallo stesso valore di inizializzazione. Per tutti i generatori di dati è disponibile una proprietà Seed impostabile dall'utente. È possibile eseguire l'override del metodo OnInitialize per inizializzare gli oggetti Random e rendere deterministico il generatore.

Per eseguire l'override del metodo OnInitialize

  1. Creare due variabili membro per generare numeri casuali, come illustrato nell'esempio seguente. Una variabile consente di generare una data casuale, mentre l'altra consente di scegliere in modo casuale tra i due possibili intervalli di date.

    Dim random As Random
    Dim randomRange As Random
    
    Random random;
    Random randomRange;
    
  2. Eseguire l'override del metodo 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. Scegliere Salva tutto dal menu File.

Override del metodo OnGenerateNextValues

In Database Edition viene eseguita una chiamata al metodo OnGenerateNextValues del generatore per creare i dati necessari. È necessario sottoporre questo metodo a override per fornire la logica che genera la data casuale per la proprietà di output.

Per eseguire l'override del metodo OnGenerateNextValues

  1. Eseguire l'override del metodo OnGenerateNextValues, come illustrato nell'esempio seguente.

    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. Scegliere Salva tutto dal menu File.

Definizione del convertitore di tipi

Per specificare le proprietà di input per il generatore di dati nel Visualizzatore proprietà è necessario fornire un convertitore di tipi che converta i valori di input nel tipo e dal tipo SqlDateTime.

Per creare la classe del convertitore di tipi SqlDateTime

  1. Scegliere Aggiungi classe dal menu Progetto.

    Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento.

  2. In Nome, digitare SqlDateTimeConverter.

  3. Nella parte superiore della finestra Codice, aggiungere le seguenti righe di codice prima della dichiarazione di classe:

    Imports System.ComponentModel
    Imports System.Data.SqlTypes
    Imports System.Globalization
    
    using System.ComponentModel;
    using System.Data.SqlTypes;
    using System.Globalization;
    
  4. Rinominare la classe da Class1 a GeneratorDateRanges, quindi specificare che la classe eredita da TypeConverter.

     [Visual Basic]
    Public Class SqlDateTimeConverter
        Inherits TypeConverter
    
    End Class
    
    public class SqlDateTimeConverter: TypeConverter
    {
    }
    
  5. All'interno della dichiarazione di classe, aggiungere il costruttore della classe. Se si sta scrivendo la classe del convertitore di tipi in Visual Basic, procedere al passaggio 6.

    public SqlDateTimeConverter()
    {
    }
    
  6. Dopo il costruttore della classe, aggiungere un metodo in grado di verificare se una particolare conversione sia possibile con questo convertitore di tipi.

    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. Infine, aggiungere i metodi del convertitore.

    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
            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;
                    dateTime.ToString(culture);
                }
                return base.ConvertTo(context, culture, value, destinationType);
            }
    
  8. Scegliere Salva tutto dal menu File.

Firma del generatore

Prima della registrazione è necessario firmare tutti i generatori di dati personalizzati con un nome sicuro.

Per firmare il generatore con un nome sicuro

  1. Scegliere Proprietà GeneratorDateRanges dal menu Progetto per aprire le proprietà del progetto.

  2. Nella scheda Firma selezionare la casella di controllo Firma assembly.

  3. Nella casella Scegli un file chiave con nome sicuro fare clic su <Nuovo...>.

  4. Nella casella Nome file di chiave digitare GeneratorDateRangesKey, immettere e confermare una password, quindi scegliere OK.

    Quando viene generata la soluzione, il file di chiave verrà utilizzato per firmare l'assembly.

  5. Scegliere Salva tutto dal menu File.

  6. Scegliere Genera soluzione dal menu Genera.

    Il generatore di dati è stato generato. A questo punto è necessario registrarlo sul computer in modo da poterlo utilizzare nei piani di generazione dati.

Sicurezza

Per ulteriori informazioni, vedere Protezione dei generatori di dati.

Passaggi successivi

Dopo aver creato il generatore di dati, è necessario registrarlo nel computer. Per ulteriori informazioni, vedere uno degli argomenti seguenti:

Vedere anche

Attività

Procedura dettagliata: distribuzione di un generatore dati personalizzato

Concetti

Cenni preliminari sulla extensibility dei generatori di dati

Riferimenti

Microsoft.VisualStudio.TeamSystem.Data.DataGenerator

Altre risorse

Creazione di generatori di dati personalizzati

Utilizzo di generatori di dati standard

Procedure dettagliate per i generatori di dati