Udostępnij za pośrednictwem


Rozwijanie składnik transformacja niestandardowe z synchroniczne wyjścia

Składniki transformacja z synchronicznej wyjść odbierać wierszy z "pod prąd" składniki i odczytywać lub modyfikować wartości w kolumnach z tych wierszy, zgodnie z ich przekazywanie wiersze do niższego rzędu składników.Może to także zdefiniować kolumny dodatkowe dane wyjściowe, które są obliczane na podstawie kolumny, udostępniane przez składniki "pod prąd", ale ich nie należy dodawać wiersze do przepływ danych.Aby uzyskać więcej informacji na temat różnicy między składnikami synchronicznych i asynchronicznych zobacz Opis przekształcenia synchroniczne i asynchroniczne.

Ten rodzaj składnika nadaje się do zadań w przypadku gdy dane są zmodyfikowanej wewnętrznej przewidzianych do składnika i gdzie składnika nie ma w celu wyświetlenia wszystkich wierszy przed ich przetworzeniem.Jest najprostszym składnika do rozwijania, ponieważ transformacji z synchronicznej wyjść zazwyczaj nie łącz z zewnętrznymi źródłami danych, zarządzanie kolumny metadane zewnętrznych lub dodawać wiersze do buforów wyjściowych.

Tworzenie składnika transformacja przy użyciu synchroniczne wyjść obejmuje dodawanie IDTSInput100 który będzie zawierać kolumny "pod prąd" wybrana dla składnika oraz IDTSOutput100 obiekt, który może zawierać uzyskane kolumny utworzony przez składnik. Zawiera także wykonywania metod czas projektowania oraz dostarczanie kodu, który odczytuje lub modyfikowania kolumn w wierszach przychodzących buforu podczas wykonywania.

W tej części podano informacje, które jest wymagane do wykonania składnika transformacja niestandardowe i zawiera przykłady kodu, aby ułatwić zrozumienie pojęcia.Aby składnik transformacja próbki z synchronicznej wyjście Zobacz Change Case Component Sample. Na przykład pełną składnika tego typu zobacz Change Case Component Sample.

Czas projektowania

Kod czas projektowania dla tego składnika pociąga za sobą, tworząc wejść i wyjść, dodawanie kolumn wyjściowych dodatkowe generuje składnika i sprawdzanie poprawności konfiguracja składnika.

Tworzenie składnika

Dane wejściowe, wyjściowe i właściwości niestandardowe składnika są zwykle tworzone podczas ProvideComponentProperties() Metoda. Istnieją dwa sposoby, można dodawać dane wejściowe i wyjściowe składnika transformacja z synchronicznej wyjść.Można użyć klasy podstawowej stosowania metoda i następnie zmodyfikować domyślne dane wejściowe i wyjściowe, tworzy lub jawnie dodać dane wejściowe i wyjściowe samodzielnie.

Poniższy przykład kodu pokazuje implementację ProvideComponentProperties() które jawnie dodaje obiekty wejściowe i wyjściowe. Wywołanie klasy podstawowej, które mogłyby wykonać samo dołączono komentarz.

using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime;

namespace Microsoft.Samples.SqlServer.Dts
{
    [DtsPipelineComponent(DisplayName = "SynchronousComponent", ComponentType = ComponentType.Transform)]
    public class SyncComponent : PipelineComponent
    {

        public override void ProvideComponentProperties()
        {
            // Add the input.
            IDTSInput100 input = ComponentMetaData.InputCollection.New();
            input.Name = "Input";

            // Add the output.
            IDTSOutput100 output = ComponentMetaData.OutputCollection.New();
            output.Name = "Output";
            output.SynchronousInputID = input.ID;

            // Alternatively, you can let the base class add the input and output
            // and set the SynchronousInputID of the output to the ID of the input.
            // base.ProvideComponentProperties();
        }
    }
}
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime

<DtsPipelineComponent(DisplayName:="SynchronousComponent", ComponentType:=ComponentType.Transform)> _
Public Class SyncComponent
    Inherits PipelineComponent

    Public Overrides Sub ProvideComponentProperties()

        ' Add the input.
        Dim input As IDTSInput100 = ComponentMetaData.InputCollection.New()
        input.Name = "Input"

        ' Add the output.
        Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection.New()
        output.Name = "Output"
        output.SynchronousInputID = Input.ID

        ' Alternatively, you can let the base class add the input and output
        ' and set the SynchronousInputID of the output to the ID of the input.
        ' base.ProvideComponentProperties();

    End Sub

End Class

Tworzenie i Konfigurowanie kolumny wyjściowe

Mimo, że składniki transformacja z wyjść synchronicznego nie należy dodawać wiersze do buforów, może dodać dodatkowe wyjściowy kolumn do swoich danych wyjściowych.Zazwyczaj gdy składnik dodaje kolumna wyprowadzenia, wartości dla nowej kolumna wyjściowe są obliczane w czasie wykonywania na podstawie danych zawartych w jednej lub więcej kolumn do składnika przez składnik poprzednie.

Po utworzeniu kolumna wyprowadzenia, należy ustawić jego właściwości typów danych.Ustawianie danych właściwości typu kolumna wyprowadzenia wymaga specjalnej obsługi i wykonywane jest przez wywołanie SetDataTypeProperties(DataType, Int32, Int32, Int32, Int32) Metoda. Ta metoda jest wymagane, ponieważ DataType(), Length(), Precision(), a CodePage() właściwości są pojedynczo tylko do odczytu, ponieważ każdy zależy od ustawień z drugiej strony. Ta metoda gwarantuje, że wartości właściwości są ustawiane w sposób ciągły, a także zadanie przepływ danych sprawdza, czy są one poprawnie ustawione.

The DataType() of the kolumna determines the values that are zestaw for the other properties. W poniższej tabela przedstawiono wymagania dotyczące zależne od właściwości dla każdego DataType(). Typy danych niewymienionych są zależne od właściwości zestaw na zero.

DataType

Długość

Skala

Precyzja

CodePage

DT_DECIMAL

0

Większa niż 0 i mniejsza niż lub równa 28.

0

0

DT_CY

0

0

0

0

DT_NUMERIC

0

Większa niż 0 i mniejsza niż lub równa 28 i mniejszy niż dokładność.

Większe niż lub równa 1 i mniejszą niż lub równa 38.

0

DT_BYTES

Większa niż 0.

0

0

0

DT_STR

Większa niż 0 i mniejsza niż 8000.

0

0

Nie 0, a strona kodowa prawidłowy.

DT_WSTR

Większa niż 0 i mniejsza niż 4000.

0

0

0

Ponieważ ograniczeń na właściwości typów danych zależą od typu danych kolumna danych wyjściowych, należy wybrać odpowiedniego Integration Services Typ danych podczas pracy z typami zarządzanych. Klasa podstawowa oferuje trzy metody pomocnika, ConvertBufferDataTypeToFitManaged(DataType, Boolean%), BufferTypeToDataRecordType(DataType), a DataRecordTypeToBufferType(Type) Deweloperzy składników zarządzanych, pomóc przy wyborze SSIS biorąc pod uwagę typu zarządzanego typu danych. Te metody konwersji typów danych zarządzanych SSIS typy danych i na odwrót.

Czas uruchomienia

Ogólnie rzecz biorąc, wykonania działania-czas część składnika jest przydzielone do dwóch zadań — lokalizowanie kolumn wejściowe i wyjściowe składnika w buforze, a odczytu lub zapisu wartości z tych kolumn w wierszach przychodzących buforu.

Lokalizowanie kolumny w buforze

Liczba kolumn w bufory, dostarczane ze składnikiem podczas wykonywania prawdopodobnie przekroczy liczbę kolumn w kolekcjach wejściowego lub wyjściowego składnika.Dzieje się tak, ponieważ każdy bufor zawiera kolumny wyjściowe określonych składników w przepływie danych.W celu zapewnienia, że kolumny buforu poprawnie dopasowane do kolumny danych wejściowych lub wyjściowych, należy użyć składnika deweloperzy FindColumnByLineageID(Int32, Int32) Metoda BufferManager(). Ta metoda lokalizuje kolumna w określonym buforze według jego identyfikatora rodowodu.Zazwyczaj kolumnach znajdują się w okresie PreExecute() ponieważ jest to pierwsza metoda run-czas gdzie BufferManager() Właściwość stają się dostępne.

Poniższy przykład kodu pokazuje składnik, który lokalizuje indeksów kolumna s w jego dane wejściowe i wyjściowe kolumna kolekcja podczas PreExecute(). Indeksy kolumnie są przechowywane w tablicy liczb całkowitych i można uzyskać dostęp za pośrednictwem składnika podczas ProcessInput(Int32, PipelineBuffer).

int []inputColumns;
int []outputColumns;

public override void PreExecute()
{
    IDTSInput100 input = ComponentMetaData.InputCollection[0];
    IDTSOutput100 output = ComponentMetaData.OutputCollection[0];

    inputColumns = new int[input.InputColumnCollection.Count];
    outputColumns = new int[output.OutputColumnCollection.Count];

    for(int col=0; col < input.InputColumnCollection.Count; col++)
    {
        IDTSInputColumn100 inputColumn = input.InputColumnCollection[col];
        inputColumns[col] = BufferManager.FindColumnByLineageID(input.Buffer, inputColumn.LineageID);
    }

    for(int col=0; col < output.OutputColumnCollection.Count; col++)
    {
        IDTSOutputColumn100 outputColumn = output.OutputColumnCollection[col];
        outputColumns[col] = BufferManager.FindColumnByLineageID(input.Buffer, outputColumn.LineageID);
    }

}
Public Overrides Sub PreExecute()

    Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)
    Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0)


    ReDim inputColumns(input.InputColumnCollection.Count)
    ReDim outputColumns(output.OutputColumnCollection.Count)

    For col As Integer = 0 To input.InputColumnCollection.Count

        Dim inputColumn As IDTSInputColumn100 = input.InputColumnCollection(col)
        inputColumns(col) = BufferManager.FindColumnByLineageID(input.Buffer, inputColumn.LineageID)
    Next

    For col As Integer = 0 To output.OutputColumnCollection.Count

        Dim outputColumn As IDTSOutputColumn100 = output.OutputColumnCollection(col)
        outputColumns(col) = BufferManager.FindColumnByLineageID(input.Buffer, outputColumn.LineageID)
    Next

End Sub

Przetwarzanie wierszy

Odbieranie składników PipelineBuffer obiekty, które zawierają wiersze i kolumny w ProcessInput(Int32, PipelineBuffer) Metoda. Podczas tej metoda są iterated wierszy w buforze, a w kolumnach rozpoznane w PreExecute() odczytywać i modyfikować. W wywoływana jest metoda wielokrotnie przez zadanie przepływ danych, dopóki nie ma więcej wierszy znajdują się od składnika nadrzędnego.

Pojedynczej kolumna w buforze jest odczytu lub zapisu przy użyciu metoda dostępu indeksowania tablicy lub przy użyciu jednej z Get lub Set metoda. The Get and Set methods are more efficient and should be used when the data type of the kolumna in the buffer is known.

Poniższy przykład kodu pokazuje implementację ProcessInput(Int32, PipelineBuffer) Metoda przetwarzania przychodzących wierszy.

public override void ProcessInput( int InputID, PipelineBuffer buffer)
{
       while( buffer.NextRow())
       {
            for(int x=0; x < inputColumns.Length;x++)
            {
                if(!buffer.IsNull(inputColumns[x]))
                {
                    object columnData = buffer[inputColumns[x]];
                    // TODO: Modify the column data.
                    buffer[inputColumns[x]] = columnData;
                }
            }
        
      }
}
Public Overrides Sub ProcessInput(ByVal InputID As Integer, ByVal buffer As PipelineBuffer)

        While (buffer.NextRow())

            For x As Integer = 0 To inputColumns.Length

                if buffer.IsNull(inputColumns(x)) = false then

                    Dim columnData As Object = buffer(inputColumns(x))
                    ' TODO: Modify the column data.
                    buffer(inputColumns(x)) = columnData

                End If
            Next

        End While
End Sub

Przykład

Następujący przykład przedstawia składnik proste transformacja z synchronicznej wyjść konwertujące wartości wszystkich kolumn w ciąg na wielkie litery.W tym przykładzie nie wykazują, metody i funkcje omówione w tym temacie.Pokazuje go ważne metody każdy składnik transformacja niestandardowe z synchronicznej wyjść musi zastąpić, ale nie zawiera kodu do sprawdzania poprawności w czasie projektowania.Aby składnik transformacja całą próbkę z synchronicznej wyjście Zobacz Change Case Component Sample.

using System;
using System.Collections;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

namespace Uppercase
{
  [DtsPipelineComponent(DisplayName = "Uppercase")]
  public class Uppercase : PipelineComponent
  {
    ArrayList m_ColumnIndexList = new ArrayList();

    public override void ProvideComponentProperties()
    {
      base.ProvideComponentProperties();
      ComponentMetaData.InputCollection[0].Name = "Uppercase Input";
      ComponentMetaData.OutputCollection[0].Name = "Uppercase Output";
    }

    public override void PreExecute()
    {
      IDTSInput100 input = ComponentMetaData.InputCollection[0];
      IDTSInputColumnCollection100 inputColumns = input.InputColumnCollection;

      foreach (IDTSInputColumn100 column in inputColumns)
      {
        if (column.DataType == DataType.DT_STR || column.DataType == DataType.DT_WSTR)
        {
          m_ColumnIndexList.Add((int)BufferManager.FindColumnByLineageID(input.Buffer, column.LineageID));
        }
      }
    }

    public override void ProcessInput(int inputID, PipelineBuffer buffer)
    {
      while (buffer.NextRow())
      {
        foreach (int columnIndex in m_ColumnIndexList)
        {
          string str = buffer.GetString(columnIndex);
          buffer.SetString(columnIndex, str.ToUpper());
        }
      }
    }
  }
}
Imports System 
Imports System.Collections 
Imports Microsoft.SqlServer.Dts.Pipeline 
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper 
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper 
Namespace Uppercase 

 <DtsPipelineComponent(DisplayName="Uppercase")> _ 
 Public Class Uppercase 
 Inherits PipelineComponent 
   Private m_ColumnIndexList As ArrayList = New ArrayList 

   Public  Overrides Sub ProvideComponentProperties() 
     MyBase.ProvideComponentProperties 
     ComponentMetaData.InputCollection(0).Name = "Uppercase Input" 
     ComponentMetaData.OutputCollection(0).Name = "Uppercase Output" 
   End Sub 

   Public  Overrides Sub PreExecute() 
     Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0) 
     Dim inputColumns As IDTSInputColumnCollection100 = input.InputColumnCollection 
     For Each column As IDTSInputColumn100 In inputColumns 
       If column.DataType = DataType.DT_STR OrElse column.DataType = DataType.DT_WSTR Then 
         m_ColumnIndexList.Add(CType(BufferManager.FindColumnByLineageID(input.Buffer, column.LineageID), Integer)) 
       End If 
     Next 
   End Sub 

   Public  Overrides Sub ProcessInput(ByVal inputID As Integer, ByVal buffer As PipelineBuffer) 
     While buffer.NextRow 
       For Each columnIndex As Integer In m_ColumnIndexList 
         Dim str As String = buffer.GetString(columnIndex) 
         buffer.SetString(columnIndex, str.ToUpper) 
       Next 
     End While 
   End Sub 
 End Class 
End Namespace
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.