2009-01-12 8 views
1

H les gars. Je développe un composant personnalisé pour SSIS. J'ai un problème lors du traitement des entrées. Le problème est que la méthode "ProcessInput" est exécutée plus d'une fois. Deux fois dans ce cas.SSIS - ProcessInput dans PipelineComponent est appelé plusieurs fois

C'est l'extrait de code d'entrée de processus:

public override void ProcessInput(int inputID, PipelineBuffer buffer) 
{ 
    IDTSInput90 input = ComponentMetaData.InputCollection.GetObjectByID(inputID); 
    if (input.InputColumnCollection.Count > 0) 
    { 
     while (buffer.NextRow()) 
     { 
      try 
      { 
       for (int columnIndex = 0; columnIndex < input.InputColumnCollection.Count; columnIndex++) 
       { 

        ColumnInfo columnInfo = _columnInfos[input.InputColumnCollection[columnIndex].ID]; 
        IDTSInputColumn90 inputColumn = input.InputColumnCollection[columnIndex]; 
        try 
        { 
         //write to destination 
        } 
        catch (Exception writeEx) 
        { 
         throw new Exception("Couldn't write to destination"); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 
    } 
    else 
    { 
     throw new Exception("There is no columns in the input collection"); 
    } 

} 

Je ne sais pas pourquoi son être appelé deux fois. Ce est le flux de données:

Dataflow http://img371.imageshack.us/img371/3001/dataflowprocessinputrb6.png

Et voici la fenêtre de mapping: Mapping window http://img78.imageshack.us/img78/3772/mappingprocessinputzs2.png

Répondre

3

C'est par la conception. SSIS envoie des données en morceaux (tampons dans la terminologie SSIS), pour optimiser l'utilisation de la mémoire. La taille de la mémoire tampon est limitée, de sorte que SSIS n'a pas besoin de lire toutes les données en mémoire (sinon SSIS ne serait pas capable de traiter des téraoctets de données). Ainsi, vous pouvez obtenir plusieurs appels ProcessInput - un appel ProcessInput par tampon. En outre, vous obtiendrez un tampon vide avec l'indicateur EndOfRowset défini sur true à la toute fin. Mais ne comptez pas sur ceci - ceci est plus d'un détail d'exécution (le dernier tampon est documenté pour avoir EndOfRowset = vrai, mais il n'est pas documenté pour être vide).

Questions connexes