Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Datengenerators für eine CHECK-Einschränkung
Aktualisiert: November 2007
Sie können in Visual Studio Team System Database Edition Standarddatengeneratoren verwenden, um Spalten mit Daten zu füllen. Wenn für die zu füllende Spalte eine CHECK-Einschränkung festgelegt ist, müssen die Daten, mit denen Sie die Spalte füllen, der CHECK-Einschränkung entsprechen. Die Standarddatengeneratoren können Daten generieren, die zahlreichen CHECK-Einschränkungen entsprechen. Wenn z. B. eine CHECK-Einschränkung erfordert, dass ein Datum in einem bestimmten Bereich liegt, können Sie den DateTime-Standardgenerator verwenden und die Min-Eigenschaft sowie die Max-Eigenschaft entsprechend dieser CHECK-Einschränkung festlegen.
Die Standarddatengeneratoren können jedoch nicht allen CHECK-Einschränkungen entsprechen. Wenn z. B. eine CHECK-Einschränkung erfordert, dass ein Datum in einem von zwei verschiedenen Bereichen liegt, können Sie nicht den DateTime-Standardgenerator verwenden. In dieser exemplarischen Vorgehensweise erstellen Sie einen benutzerdefinierten Datengenerator, der einer solchen Einschränkung entspricht. Der Generator akzeptiert zwei Bereiche als Eingabe und generiert ein zufälliges Datum, das in einem dieser Bereiche liegt.
![]() |
---|
Sie können einen benutzerdefinierten Datengenerator mit einer anderen Vorgehensweise erstellen und dasselbe Ziel mit Aggregationserweiterbarkeit erreichen. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Datengenerators, der Standardgeneratoren aggregiert. |
Im Verlauf dieser exemplarischen Vorgehensweise führen Sie folgende Aufgaben aus:
Erstellen Sie eine Klasse, die von Generator erbt.
Erstellen von Eingabeeigenschaften, sodass der Benutzer die beiden Datumsbereiche angeben kann
Erstellen einer Ausgabeeigenschaft für die Verwendung als Generatorausgabe
Überschreiben der OnInitialize-Methode, um einen Startwert für die Random-Objekte anzugeben und den Generator als deterministisch festzulegen
Überschreiben der OnGenerateNextValues-Methode, um die Daten zu generieren
Signieren des Generators mit einem starken Namen
Vorbereitungsmaßnahmen
Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:
- Database Edition
Erstellen der benutzerdefinierten Datengeneratorklasse
So erstellen Sie die benutzerdefinierte Datengeneratorklasse
Erstellen Sie in Visual Studio ein Klassenbibliotheksprojekt in der gewünschten Sprache, und nennen Sie es GeneratorDateRanges.
Klicken Sie im Menü Projekt auf Verweis hinzufügen.
Das Dialogfeld Verweis hinzufügen wird angezeigt.
Klicken Sie auf die Registerkarte .NET. Klicken Sie in der Liste Komponentenname auf Microsoft.VisualStudio.TeamSystem.Data und anschließend auf OK.
(Optional, nur Visual Basic) Klicken Sie im Projektmappen-Explorer auf Alle Dateien anzeigen, und erweitern Sie den Knoten Verweise, um den neuen Verweis zu überprüfen.
Fügen Sie oben im Codefenster vor der Klassendeklaration die folgende Codezeile hinzu:
Imports Microsoft.VisualStudio.TeamSystem.Data.DataGenerator Imports System.Data.SqlTypes
using Microsoft.VisualStudio.TeamSystem.Data.DataGenerator; using System.Data.SqlTypes;
Benennen Sie die Klasse von Class1 in GeneratorDateRanges um, und geben Sie an, dass die Klasse von Generator erbt.
Vorsicht:
Der Name, den Sie für die Klasse festlegen, wird standardmäßig im Fenster Spaltendetails in der Liste der Spalte Generator angezeigt. Geben Sie einen Namen an, der zu keinem Konflikt mit dem Namen eines Standardgenerators oder eines anderen benutzerdefinierten Generators führt.
Public Class GeneratorDateRanges Inherits Generator End Class
public class GeneratorDateRanges: Generator { }
Klicken Sie im Menü Datei auf Alle speichern.
Hinzufügen der Eingabeeigenschaften
Dieser benutzerdefinierte Datengenerator akzeptiert zwei Datumsbereiche als Eingabe. Um die einzelnen Bereiche festzulegen, gibt der Benutzer das minimale und maximale Datum für jeden Bereich an. Darum müssen Sie insgesamt vier Eingabeeigenschaften erstellen: zwei minimale Datumsangaben und zwei maximale Datumsangaben.
So fügen Sie die Eingabeeigenschaften hinzu
Erstellen Sie vier Membervariablen für das minimale und maximale Datum der beiden Datumsbereiche.
Dim range1MinValue As SqlDateTime Dim range1MaxValue As SqlDateTime Dim range2MinValue As SqlDateTime Dim range2MaxValue As SqlDateTime
SqlDateTime range1MinValue; SqlDateTime range1MaxValue; SqlDateTime range2MinValue; SqlDateTime range2MaxValue;
Erstellen Sie vier Eigenschaften, um das minimale und maximale Datum der beiden Datumsbereiche festzulegen. Die Eigenschaften müssen über das InputAttribute verfügen, um sie als Eingabeeigenschaften zu kennzeichnen.
<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;} }
Klicken Sie im Menü Datei auf Alle speichern.
Hinzufügen der Ausgabeeigenschaft
Dieser benutzerdefinierte Datengenerator gibt ein zufälliges Datum als Ausgabe zurück. Daher müssen Sie eine Ausgabeeigenschaft erstellen.
So fügen Sie die Ausgabeeigenschaft hinzu
Erstellen Sie eine Membervariable für das zufällige Datum, das als Ausgabe verwendet wird.
Dim randomDateValue As SqlDateTime
SqlDateTime randomDateValue;
Erstellen Sie eine Eigenschaft, die das zufällige Datum als Ausgabe zurückgibt. Die Eigenschaft muss über das OutputAttribute verfügen, um sie als Ausgabeeigenschaft zu kennzeichnen.
<Output()> _ Public ReadOnly Property RandomDate() As SqlDateTime Get Return randomDateValue End Get End Property
[Output] public SqlDateTime RandomDate { get {return randomDateValue;} }
Klicken Sie im Menü Datei auf Alle speichern.
Überschreiben der OnInitialize-Methode
Beim Generieren von zufälligen Daten können diese deterministisch oder nicht deterministisch sein. Wenn die Daten deterministisch sind, werden bei Verwendung desselben Startwerts immer die gleichen Daten erzeugt. Alle Datengeneratoren verfügen über eine Seed-Eigenschaft, die der Benutzer festlegen kann. Sie können die OnInitialize-Methode überschreiben, um einen Startwert für die Random-Objekte anzugeben und den Generator als deterministisch festzulegen.
So überschreiben Sie die OnInitialize-Methode
Erstellen Sie zwei Membervariablen zum Generieren von zufälligen Zahlen, wie im folgenden Beispiel gezeigt. Eine Variable generiert ein zufälliges Datum. Für die andere Variable wird einer der beiden möglichen Datumsbereiche nach dem Zufallsprinzip ausgewählt.
Dim random As Random Dim randomRange As Random
Random random; Random randomRange;
Überschreiben der OnInitialize-Methode.
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); }
Klicken Sie im Menü Datei auf Alle speichern.
Überschreiben der OnGenerateNextValues-Methode
Database Edition ruft die OnGenerateNextValues-Methode des Generators auf, um die erforderlichen Daten zu generieren. Sie müssen diese Methode überschreiben, um die Logik bereitzustellen, mit der das zufällige Datum für die Ausgabeeigenschaft generiert wird.
So überschreiben Sie die OnGenerateNextValues-Methode
Überschreiben Sie die OnGenerateNextValues-Methode, wie im folgenden Beispiel gezeigt.
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; }
Klicken Sie im Menü Datei auf Alle speichern.
Definieren des Typkonverters
Um die Eingabeeigenschaften für diesen Datengenerator im Eigenschaftenbrowser anzugeben, müssen Sie einen Typkonverter angeben, der die Eingabewerte aus dem und in den SqlDateTime-Typ konvertiert.
So erstellen Sie die Konverterklasse des SqlDateTime-Typs
Klicken Sie im Menü Projekt auf Klasse hinzufügen.
Das Dialogfeld Neues Element hinzufügen wird angezeigt.
Geben Sie in Name den Namen SqlDateTimeConverter ein.
Fügen Sie oben im Fenster Code vor der Klassendeklaration die folgenden Codezeilen hinzu:
Imports System.ComponentModel Imports System.Data.SqlTypes Imports System.Globalization
using System.ComponentModel; using System.Data.SqlTypes; using System.Globalization;
Benennen Sie die Klasse von Class1 in GeneratorDateRanges um, und geben Sie an, dass die Klasse von TypeConverter erbt.
[Visual Basic] Public Class SqlDateTimeConverter Inherits TypeConverter End Class
public class SqlDateTimeConverter: TypeConverter { }
Fügen Sie innerhalb der Klassendeklaration den Klassenkonstruktor hinzu. Wenn Sie die Typkonverterklasse in Visual Basic schreiben, fahren Sie mit Schritt 6 fort.
public SqlDateTimeConverter() { }
Fügen Sie nach dem Klassenkonstruktor eine Methode hinzu, die überprüft, ob eine bestimmte Konvertierung über diesen Typkonverter möglich ist.
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); }
Fügen Sie abschließend die Konvertermethoden hinzu.
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); }
Klicken Sie im Menü Datei auf Alle speichern.
Signieren des Generators
Alle benutzerdefinierten Datengeneratoren müssen mit einem starken Namen signiert werden, bevor sie registriert werden.
So signieren Sie den Generator mit einem starken Namen
Klicken Sie im Menü Projekt auf Eigenschaften von GeneratorDateRanges, um die Projekteigenschaften zu öffnen.
Aktivieren Sie auf der Registerkarte Signierung das Kontrollkästchen Assembly signieren.
Klicken Sie im Feld Schlüsseldatei mit starkem Namen auswählen auf Neu.
Geben Sie im Feld Schlüsseldateiname die Zeichenfolge GeneratorDateRangesKey ein, geben Sie ein Kennwort ein, bestätigen Sie das Kennwort, und klicken Sie dann auf OK.
Wenn Sie die Projektmappe erstellen, wird die Assembly mit der Schlüsseldatei signiert.
Klicken Sie im Menü Datei auf Alle speichern.
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Der Datengenerator wurde jetzt erstellt. Anschließend müssen Sie ihn auf dem Computer registrieren, damit Sie ihn in Datengenerierungsplänen verwenden können.
Sicherheit
Weitere Informationen finden Sie unter Sicherheit von Datengeneratoren.
Nächste Schritte
Nachdem der Datengenerator erstellt wurde, müssen Sie ihn auf dem Computer registrieren. Weitere Informationen finden Sie in den folgenden Themen:
Gewusst wie: Registrieren von benutzerdefinierten Datengeneratoren
Exemplarische Vorgehensweise: Registrieren eines benutzerdefinierten Datengenerators
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Datengenerators
Konzepte
Übersicht über die Erweiterbarkeit von Datengeneratoren
Referenz
Microsoft.VisualStudio.TeamSystem.Data.DataGenerator
Weitere Ressourcen
Erstellen von benutzerdefinierten Datengeneratoren