Convalida di un componente del flusso di datiValidating a Data Flow Component

Il metodo Validate della classe di base PipelineComponent viene fornito per impedire l'esecuzione di un componente che non è configurato correttamente.The Validate method of the PipelineComponent base class is provided to prevent execution of a component that is not configured correctly. Utilizzare questo metodo per verificare che un componente includa il numero previsto di oggetti di input e output, che i valori delle proprietà personalizzate del componente siano accettabili e che siano state specificate le eventuali connessioni richieste.Use this method to verify that a component has the expected number of input and output objects, that the custom properties of the component have acceptable values, and that any connections, if required, are specified. Utilizzare questo metodo anche per verificare che le colonne nelle raccolte di input e output includano i tipi di dati corretti e che l'oggetto DTSUsageType di ogni colonna sia impostato correttamente per il componente.Use this method also to verify that the columns in the input and output collections have the correct data types and that the DTSUsageType of each column is set appropriately for the component. L'implementazione della classe di base assiste nel processo di convalida controllando la raccolta di colonne di input del componente e verificando che ogni colonna della raccolta faccia riferimento a una colonna presente in IDTSOutputCollection100 del componente a monte.The base class implementation assists in the validation process by checking the input column collection of the component and ensuring that each column in the collection refers to a column in the IDTSOutputCollection100 of the upstream component.

Metodo ValidateValidate Method

Il metodo Validate viene chiamato ripetutamente quando un componente viene modificato in Progettazione SSISSSIS.The Validate method is called repeatedly when a component is edited in SSISSSIS Designer. È possibile fornire feedback alla finestra di progettazione e agli utenti del componente tramite il valore restituito dell'enumerazione DTSValidationStatus e inviando avvisi ed errori.You can provide feedback to the designer and to users of the component through the DTSValidationStatus enumeration return value, and by posting warnings and errors. L'enumerazione DTSValidationStatus contiene tre valori che indicano varie fasi di errore e un quarto valore, VS_ISVALID, che indica se il componente è configurato correttamente e pronto per l'esecuzione.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 execute.

Il valore VS_NEEDSNEWMETADATA indica che esiste un errore in ComponentMetaData e che il componente può correggere gli errori.The VS_NEEDSNEWMETADATA value indicates that an error exists in the ComponentMetaData, and that the component can repair the errors. Se un componente rileva un errore di metadati che può correggere, l'errore non deve essere corretto nel metodo Validate e ComponentMetaData non deve essere modificato durante la convalida.If a component encounters a metadata error that it can repair, it should not fix the error in the Validate method, and ComponentMetaData should not be modified during validation. Al contrario, il metodo Validate deve restituire solo VS_NEEDSNEWMETADATA e il componente deve correggere l'errore in una chiamata al metodo ReinitializeMetaData, come descritto più avanti in questa sezione.Instead, the Validate method should return only VS_NEEDSNEWMETADATA, and the component should repair the error in a call to the ReinitializeMetaData method, as described later in this section.

Il valore VS_ISBROKEN indica che il componente contiene un errore che può essere corretto modificando il componente nella finestra di progettazione.The VS_ISBROKEN value indicates that the component has an error that can be rectified by editing the component in the designer. L'errore è in genere causato da una proprietà personalizzata o una connessione richiesta che non è specificata o non è impostata correttamente.The error is typically caused by a custom property or a required connection that is not specified or is set incorrectly.

Il valore finale dell'errore è VS_ISCORRUPT, che indica che il componente ha individuato errori che dovrebbero verificarsi solo se la proprietà ComponentMetaData è stata modificata direttamente, modificando il codice XML del pacchetto o utilizzando il modello a oggetti.The final error value is VS_ISCORRUPT, which indicates that the component has discovered errors that should only occur if the ComponentMetaData property has been modified directly, either by editing the package XML or by using the object model. Ad esempio, questo tipo di errore si verifica quando un componente ha aggiunto solo un input ma durante la convalida vengono individuati più input in ComponentMetaData.For example, this kind of error occurs when a component has added only a single input, but validation discovers that more than one input exists in the ComponentMetaData. Gli errori che generano questo restituiscono valore può essere corretti solo reimpostando il componente utilizzando il reimpostare pulsante il Editor avanzato la finestra di dialogo.Errors that generate this return value can only be repaired by resetting the component by using the Reset button in the Advanced Editor dialog box.

Oltre a restituire valori di errori, i componenti forniscono feedback inviando avvisi o errori durante la convalida.Besides returning error values, components provide feedback by posting warnings or errors during validation. I metodi FireWarning e FireError forniscono questo meccanismo.The FireWarning and FireError methods provide this mechanism. Quando questi metodi vengono chiamati, questi eventi vengono registrati nel elenco errori finestra SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT).When these methods are called, these events are posted in the Error List window of SQL Server Data Tools (SSDT)SQL Server Data Tools (SSDT). Gli sviluppatori di componenti possono quindi fornire feedback diretto agli utenti sugli errori che si sono verificati e, se necessario, su come correggerli.Component developers can then provide direct feedback to users on the errors that have occurred, and if appropriate, how to correct them.

Nell'esempio di codice seguente viene illustrata un'implementazione sottoposta a override di Validate.The following code example shows an overridden implementation of 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  

Metodo ReinitializeMetaDataReinitializeMetaData Method

Il metodo ReinitializeMetaData viene chiamato da Progettazione SSISSSIS quando si modifica un componente che restituisce VS_NEEDSNEWMETADATA dal metodo Validate.The ReinitializeMetaData method is called by SSISSSIS Designer whenever you edit a component that returns VS_NEEDSNEWMETADATA from its Validate method. I componenti devono contenere codice che rileva e corregge i problemi identificati dal componente durante la convalida.Components should contain code that detects and corrects the problems identified by the component during validation.

Nell'esempio seguente viene illustrato un componente che rileva problemi durante la convalida e li corregge nel metodo ReinitializeMetaData.The following example shows a component that detects problems during validation and fixes these errors in the ReinitializeMetaData method.

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