Überprüfen einer Datenflusskomponente
Die Validate-Methode der PipelineComponent-Basisklasse wird bereitgestellt, um die Ausführung einer Komponente zu verhindern, die nicht korrekt konfiguriert wurde. Verwenden Sie diese Methode, wenn Sie überprüfen wollen, ob eine Komponente die erwartete Anzahl an Eingabe- und Ausgabeobjekten aufweist, die Werte der benutzerdefinierten Eigenschaften der Komponente zulässig sind, und Verbindungen, falls erforderlich, angegeben sind. Sie können diese Methode auch verwenden, um zu überprüfen, ob die Spalten in der Eingabe- und Ausgabeauflistung die korrekten Datentypen enthalten und der DTSUsageType jeder Spalte ordnungsgemäß für die Komponente festgelegt wurde. Durch die Basisklassenimplementierung wird der Überprüfungsprozess unterstützt, indem die Eingabespaltenauflistung der Komponente überprüft und sichergestellt wird, dass jede Spalte in der Auflistung auf eine Spalte in IDTSOutputCollection100 der Upstreamkomponente verweist.
Validate-Methode
Die Validate-Methode wird wiederholt aufgerufen, wenn eine Komponente im SSIS-Designer bearbeitet wird. Sie können an den Designer und die Benutzer der Komponente über den DTSValidationStatus-Enumerationsrückgabewert und durch die Anzeige von Warnungen und Fehlern ein Feedback bereitstellen. Die DTSValidationStatus-Enumeration enthält drei Werte, die verschiedene Fehlerstadien anzeigen, und einen vierten VS_ISVALID-Wert, der angibt, ob die Komponente ordnungsgemäß konfiguriert und bereit zur Ausführung ist.
Der VS_NEEDSNEWMETADATA-Wert zeigt an, dass ein Fehler in ComponentMetaData besteht, und dass die Komponente die Fehler beheben kann. Wenn eine Komponente einen Metadatenfehler feststellt, den sie beheben kann, sollte sie den Fehler nicht in der Validate-Methode beheben und ComponentMetaData sollte bei der Überprüfung nicht geändert werden. Stattdessen sollte die Validate-Methode nur VS_NEEDSNEWMETADATA zurückgeben, und die Komponente sollte den Fehler in einem Aufruf der ReinitializeMetaData-Methode, wie weiter unten in diesem Abschnitt beschrieben, beheben.
Der VS_ISBROKEN-Wert zeigt an, dass die Komponente einen Fehler aufweist, der durch Bearbeitung der Komponente im Designer behoben werden kann. Der Fehler wird typischerweise durch eine benutzerdefinierte Eigenschaft oder eine erforderliche Verbindung verursacht, die nicht angegeben oder nicht ordnungsgemäß eingerichtet wurde.
Der endgültige Fehlerwert ist VS_ISCORRUPT, wodurch angezeigt wird, dass die Komponente Fehler gefunden hat, die nur auftreten dürften, wenn die ComponentMetaData-Eigenschaft entweder durch Bearbeiten des Paket-XML oder durch Verwenden des Objektmodells direkt geändert wurde. Dieser Fehlertyp tritt z. B. auf, wenn eine Komponente nur eine einzelne Eingabe hinzugefügt hat, aber bei der Überprüfung festgestellt wird, dass mehr als eine Eingabe in ComponentMetaData vorhanden ist. Fehler, die diesen Rückgabewert generieren, können nur behoben werden, indem die Komponente durch Verwenden der Schaltfläche Zurücksetzen im Dialogfeld Erweiterter Editor zurückgesetzt wird.
Neben der Rückgabe von Fehlerwerten stellen Komponenten Feedback bereit, indem sie während der Überprüfung Warnungen und Fehler anzeigen. Dieser Mechanismus wird durch die FireWarning- und FireError-Methoden bereitgestellt. Wenn diese Methoden aufgerufen werden, werden diese Ereignisse im Fenster Fehlerliste von Business Intelligence Development Studio angezeigt. Komponentenentwickler können dann für die Benutzer direktes Feedback über die aufgetretenen Fehler bereitstellen bzw. erläutern, wie diese behoben werden können.
Im folgenden Codebeispiel wird eine überschriebene Implementierung von Validate veranschaulicht.
public override DTSValidationStatus Validate()
{
bool pbCancel = false;
// Validate that there is one input.
if (ComponentMetaData.InputCollection.Count != 1)
{
ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of inputs.", "", 0, out pbCancel);
return DTSValidationStatus.VS_ISCORRUPT;
}
// Validate that the UserName custom property is set.
if (ComponentMetaData.CustomPropertyCollection["UserName"].Value == null || ((string)ComponentMetaData.CustomPropertyCollection["UserName"].Value).Length == 0)
{
ComponentMetaData.FireError(0, ComponentMetaData.Name, "The UserName property must be set.", "", 0, out pbCancel);
return DTSValidationStatus.VS_ISBROKEN;
}
// Validate that there is one output.
if (ComponentMetaData.OutputCollection.Count != 1)
{
ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of outputs.", "", 0, out pbCancel);
return DTSValidationStatus.VS_ISCORRUPT;
}
// Let the base class verify that the input column reflects the output
// of the upstream component.
return base.Validate();
}
Public Overrides Function Validate() As DTSValidationStatus
Dim pbCancel As Boolean = False
' Validate that there is one input.
If Not (ComponentMetaData.InputCollection.Count = 1) Then
ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of inputs.", "", 0, pbCancel)
Return DTSValidationStatus.VS_ISCORRUPT
End If
' Validate that the UserName custom property is set.
If ComponentMetaData.CustomPropertyCollection("UserName").Value Is Nothing OrElse CType(ComponentMetaData.CustomPropertyCollection("UserName").Value, String).Length = 0 Then
ComponentMetaData.FireError(0, ComponentMetaData.Name, "The UserName property must be set.", "", 0, pbCancel)
Return DTSValidationStatus.VS_ISBROKEN
End If
' Validate that there is one output.
If Not (ComponentMetaData.OutputCollection.Count = 1) Then
ComponentMetaData.FireError(0, ComponentMetaData.Name, "Incorrect number of outputs.", "", 0, pbCancel)
Return DTSValidationStatus.VS_ISCORRUPT
End If
' Let the base class verify that the input column reflects the output
' of the upstream component.
Return MyBase.Validate
End Function
ReinitializeMetaData-Methode
Die ReinitializeMetaData-Methode wird vom SSIS-Designer aufgerufen, wenn eine Komponente VS_NEEDSNEWMETADATA von der Validate-Methode zurückgibt. Komponenten sollten Code enthalten, der die Fehler, die während der Überprüfung von der Komponente identifiziert wurden, erkennt und behebt.
Im folgenden Beispiel wird eine Komponente gezeigt, die während der Überprüfung Fehler feststellt und diese Fehler in der ReinitializeMetaData-Methode behebt.
private bool areInputColumnsValid = true;
public override DTSValidationStatus Validate()
{
IDTSInput100 input = ComponentMetaData.InputCollection[0];
IDTSVirtualInput100 vInput = input.GetVirtualInput();
bool Cancel = false;
foreach (IDTSInputColumn100 column in input.InputColumnCollection)
{
try
{
IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID);
}
catch
{
ComponentMetaData.FireError(0, ComponentMetaData.Name, "The input column " + column.IdentificationString + " does not match a column in the upstream component.", "", 0, out Cancel);
areInputColumnsValid = false;
return DTSValidationStatus.VS_NEEDSNEWMETADATA;
}
}
return DTSValidationStatus.VS_ISVALID;
}
public override void ReinitializeMetaData()
{
if (!areInputColumnsValid)
{
IDTSInput100 input = ComponentMetaData.InputCollection[0];
IDTSVirtualInput100 vInput = input.GetVirtualInput();
foreach (IDTSInputColumn100 column in input.InputColumnCollection)
{
IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID);
if (vColumn == null)
input.InputColumnCollection.RemoveObjectByID(column.ID);
}
areInputColumnsValid = true;
}
}
Private areInputColumnsValid As Boolean = True
Public Overrides Function Validate() As DTSValidationStatus
Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)
Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput
Dim Cancel As Boolean = False
For Each column As IDTSInputColumn100 In input.InputColumnCollection
Try
Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID)
Catch
ComponentMetaData.FireError(0, ComponentMetaData.Name, "The input column " + column.IdentificationString + " does not match a column in the upstream component.", "", 0, Cancel)
areInputColumnsValid = False
Return DTSValidationStatus.VS_NEEDSNEWMETADATA
End Try
Next
Return DTSValidationStatus.VS_ISVALID
End Function
Public Overrides Sub ReinitializeMetaData()
If Not areInputColumnsValid Then
Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)
Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput
For Each column As IDTSInputColumn100 In input.InputColumnCollection
Dim vColumn As IDTSVirtualInputColumn100 = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(column.LineageID)
If vColumn Is Nothing Then
input.InputColumnCollection.RemoveObjectByID(column.ID)
End If
Next
areInputColumnsValid = True
End If
End Sub
|