Udostępnij za pośrednictwem


Validating a Data Flow Component

The Validate() metoda of the PipelineComponent base class is provided to prevent execution of a component that is not configured correctly. Aby zweryfikować, że składnik jest oczekiwana liczba obiektów wejściowe i wyjściowe, że właściwości niestandardowych składnika mieć akceptowane wartości i że wszystkie połączenia, jeżeli jest to wymagane, są określone za pomocą tej metoda.Ta metoda umożliwia również sprawdzić, czy kolumna w kolekcji wejściowe i wyjściowe mają typów poprawne dane i że DTSUsageType dla każdej z kolumn jest zestaw odpowiednio dla składnika. Implementacja klasy podstawowej pomaga w trakcie tego procesu sprawdzania kolekcja kolumny wejściowe składnika i zapewnienie, że każda kolumna w kolekcja odwołuje się do kolumny w IDTSOutputCollection100 "pod prąd" składnika.

Sprawdzanie poprawności metodą

The Validate() metoda is called repeatedly when a component is edited in SSIS Designer. Projektant i użytkownicy składnika za pomocą przekazać uwagi DTSValidationStatus Wyliczanie zwrócić wartość i ogłaszając ostrzeżeń i błędów. The DTSValidationStatus enumeration contains three values that indicate various stages of failure, and a fourth, VS_ISVALID(), that indicates whether the component is correctly configured and ready to wykonać.

The VS_NEEDSNEWMETADATA() value indicates that an error exists in the ComponentMetaData(), and that the component can repair the errors.W przypadku, gdy składnik napotka błąd metadane, które można naprawić go, nie należy naprawić błąd w Validate() Metoda, a ComponentMetaData() nie powinno być modyfikowane podczas sprawdzania poprawności. Zamiast tego Validate() Metoda powinna zwracać tylko VS_NEEDSNEWMETADATA(), a składnik należy naprawić błąd w wywołaniu ReinitializeMetaData() Metoda, jak to opisano dalej w tej sekcji.

The VS_ISBROKEN() value indicates that the component has an error that can be rectified by editing the component in the designer.Ten błąd jest zazwyczaj spowodowane właściwość niestandardowej lub wymagane połączenie, które nie został określony lub jest zestaw niepoprawnie.

Jest wartością błędu końcowe VS_ISCORRUPT(), co oznacza, że składnik zostało wykryte błędy, które powinny tylko wówczas, gdy ComponentMetaData() została zmodyfikowana właściwość bezpośrednio, edytując pakiet XML lub za pomocą modelu obiektów. Na przykład tego rodzaju błąd występuje wówczas, gdy składnik został dodany tylko jeden dane wejściowe, ale sprawdzanie poprawności wykrywa, sprawdzając, czy w więcej niż jedno wejście ComponentMetaData(). Błędy, które generują to zwraca wartość jedynie jest niemożliwa, resetując składnika za pomocą Resetowanie przycisk Zaawansowany edytor -okno dialogowe.

Oprócz zwracania wartości błędów, składniki zapewniają opinii księgując ostrzeżenia lub komunikaty o błędach podczas sprawdzania poprawności.The FireWarning(Int32, String, String, String, Int32) and FireError(Int32, String, String, String, Int32) methods provide this mechanism.Po wywołaniu metody te są te zdarzenia są księgowane w Lista błędów oknaBusiness Intelligence Development Studio. Deweloperzy składników można następnie podaj bezpośrednich opinii dla użytkowników na błędy, które miały miejsce, i jeśli to konieczne, jak je poprawić.

W poniższym przykładzie kodu pokazano implementacja zastąpiona Validate().

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

Metoda ReinitializeMetaData

The ReinitializeMetaData() metoda is called by SSIS Designer whenever a component returns VS_NEEDSNEWMETADATA() from the Validate() metoda. Składniki powinny zawierać kod, który wykrywa i naprawia błędy, identyfikowane przez składnik podczas sprawdzania poprawności.

W poniższym przykładzie przedstawiono składnik, który wykrywa błędy podczas sprawdzania poprawności i naprawia następujące błędy w ReinitializeMetaData() Metoda.

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 icon (small) Konfiguracja w aktualizacji z usług integracja Services pobytu

Najnowsze pliki do pobrania, artykuły, próbki, i pliki wideo firmy Microsoft, jak również wybranego rozwiązania od Wspólnoty, odwiedź witrynę Integration Services strona w witrynie MSDN lub TechNet:

Automatycznego powiadomienie tych aktualizacji należy subskrybować źródła danych RSS, które jest dostępne strona.