Partager via


Validation d'un composant de flux de données

S’applique à : SQL Server SSIS Integration Runtime dans Azure Data Factory

La méthode Validate de la classe de base PipelineComponent est fournie pour empêcher l'exécution d'un composant qui n'est pas configuré correctement. Cette méthode vous permet de vérifier qu'un composant dispose du nombre d'objets d'entrée et de sortie attendu, que les valeurs des propriétés personnalisées du composant sont acceptables et que toutes les connexions nécessaires sont spécifiées. Elle vous permet également de vérifier que les colonnes dans les collections d'entrée et de sortie contiennent des types de données corrects et que le DTSUsageType de chaque colonne est défini de manière appropriée pour le composant. L'implémentation de la classe de base contribue au processus de validation en contrôlant la collection de colonnes d'entrée du composant et en vérifiant que chaque colonne de la collection fait référence à une colonne dans le IDTSOutputCollection100 du composant en amont.

Validate, méthode

La méthode Validate est appelée de manière répétée quand un composant est modifié dans le concepteur SSIS. Vous pouvez fournir des informations au concepteur et aux utilisateurs du composant par le biais de la valeur de retour de l'énumération DTSValidationStatus, et en publiant des avertissements et des erreurs. L'énumération DTSValidationStatus contient trois valeurs correspondant à différents stades de défaillance, et une quatrième, VS_ISVALID, qui indique si le composant est correctement configuré et prêt à être exécuté.

La valeur VS_NEEDSNEWMETADATA indique qu'il existe une erreur dans ComponentMetaData et que le composant peut réparer les erreurs. Si un composant rencontre une erreur de métadonnées qu'il peut réparer, il ne doit pas la corriger dans la méthode Validate et la propriété ComponentMetaData ne doit pas être modifiée au cours de la validation. Au lieu de cela, la méthode Validate doit retourner VS_NEEDSNEWMETADATA uniquement, et le composant doit réparer l'erreur lors d'un appel à la méthode ReinitializeMetaData, tel que décrit plus loin dans cette section.

La valeur VS_ISBROKEN indique que le composant contient une erreur qui peut être corrigée en modifiant le composant dans le concepteur. L'erreur provient généralement d'une propriété personnalisée ou d'une connexion requise non spécifiée ou définie de manière incorrecte.

La valeur d'erreur finale est VS_ISCORRUPT, ce qui indique que le composant a découvert des erreurs qui ne peuvent se produire que si la propriété ComponentMetaData a été modifiée directement, en modifiant le package XML ou en utilisant le modèle objet. Par exemple, ce type d'erreur se produit lorsqu'un composant a ajouté une seule entrée, mais que la validation découvre que plusieurs entrées existent dans ComponentMetaData. Les erreurs qui génèrent cette valeur de retour ne peuvent être réparées qu’en réinitialisant le composant à l’aide du bouton Réinitialiser de la boîte de dialogue Éditeur avancé.

En plus de retourner des valeurs d'erreur, les composants fournissent des informations en publiant des avertissements ou des erreurs lors de la validation. Les méthodes FireWarning et FireError fournissent ce mécanisme. Quand ces méthodes sont appelées, ces événements sont publiés dans la fenêtre Liste d’erreurs de SQL Server Data Tools (SSDT). Les développeurs de composants peuvent ensuite fournir des commentaires directement aux utilisateurs sur les erreurs rencontrées et, le cas échéant, la manière de les corriger.

L'exemple de code suivant montre une implémentation substituée de 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  

Méthode ReinitializeMetaData

La méthode ReinitializeMetaData est appelée par le concepteur SSIS chaque fois que vous modifiez un composant qui retourne VS_NEEDSNEWMETADATA à partir de sa méthode Validate. Les composants doivent contenir du code qui détecte et corrige les problèmes identifiés par le composant au cours de la validation.

L'exemple suivant montre un composant qui détecte des problèmes au cours de la validation et les corrige dans la méthode ReinitializeMetaData.

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