Freigeben über


Ü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
Integration Services (kleines Symbol) Bleiben Sie mit Integration Services auf dem neuesten Stand

Die neuesten Downloads, Artikel, Beispiele und Videos von Microsoft sowie ausgewählte Lösungen aus der Community finden Sie auf der Integration Services-Seite von MSDN oder TechNet:

Abonnieren Sie die auf der Seite verfügbaren RSS-Newsfeeds, um automatische Benachrichtigungen zu diesen Aktualisierungen zu erhalten.