Udostępnij za pośrednictwem


Rozwijanie składnika przekształcenie niestandardowe wyjść synchroniczne

Składniki transformacji z synchronicznej wyjść odbierać wiersze z nadrzędny składników i czytać lub modyfikować wartości w kolumnach tych wierszy, jak przechodzą one wiersze do składników niższego rzędu.Mogą również określić kolumny dodatkowej produkcji, które pochodzą z kolumn nadrzędny składników, ale nie należy dodawać wiersze do przepływ danych.Aby uzyskać więcej informacji o różnicach między składnikami synchroniczne i asynchroniczne, zobacz Opis przekształcenia synchroniczne i asynchroniczne.

Tego rodzaju składnika nadaje się do zadań, gdzie dane są wbudowane zmodyfikowanego przewidzianych do składnika i gdzie składnika nie trzeba wyświetlić wszystkie wiersze przed ich przetworzeniem.Jest najprostszym składnika do rozwijania, ponieważ przekształceń synchroniczne 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 z synchronicznej wyjść obejmuje dodanie IDTSInput100 , będzie zawierać kolumny nadrzędny wybranego składnika, a IDTSOutput100 obiekt, który może zawierać pochodnych kolumn utworzonych przez składnik.Zawiera także realizacji projektu -czas metody i zapewniając odczytuje lub modyfikuje kolumn w wierszach przychodzących buforu podczas wykonywania kodu.

Ta sekcja zawiera informacje wymagane do wykonania składnika niestandardowego transformacja, a zawiera przykłady kodu, aby ułatwić zrozumienie pojęć.Dla składnika transformacja próbki z synchronicznej wyjść, zobacz Integration Services próbki na witrynie Codeplex.

Czas projektowania

Projekt —czas kod dla tego składnika obejmuje tworzenie wejść i wyjść, dodawanie kolumn wyjściowych dodatkowe składnik generuje i sprawdzanie poprawności konfiguracja składnika.

Tworzenie składnika

Nakładów, wyników oraz właściwości niestandardowe składnika są zwykle tworzone podczas ProvideComponentProperties metoda.Można dodawać dane wejściowe i wyjściowe składnika transformacja z synchronicznej wyjść na dwa sposoby.Można użyć metoda wykonania klasy podstawowej, a następnie zmodyfikować domyślne wejściowe i wyjściowe, która tworzy lub można jawnie dodać dane wejściowe i wyjściowe samodzielnie.

Poniższy przykład kodu pokazuje implementację ProvideComponentProperties , wyraźnie dodaje dane wejściowe i wyjściowe obiektów.Wywołanie klasy podstawowej, która będzie wykonywać 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 kolumn wyjściowych

Chociaż składniki transformacja z wyjść synchroniczne nie należy dodawać wiersze do buforów, może dodać dodatkowe dane wyjściowe kolumny do ich produkcji.Zazwyczaj, gdy składnik dodaje kolumna wyprowadzenia, wartości dla nowej kolumna Wyjście są uzyskiwane przy uruchomieniu czas z danych zawartych w jednym lub więcej kolumn do składnika przez składnik nadrzędny.

Po utworzeniu kolumna wyjociowej jego właściwości typu danych musi być zestaw.Dane ustawienie właściwości typu kolumna wyprowadzenia wymaga specjalnych i wykonywane jest przez wywołanie SetDataTypeProperties metoda.Metoda ta jest potrzebna, ponieważ DataType, Length, Precision, i CodePage Właściwości są indywidualnie tylko do odczytu, ponieważ każdy zależy od ustawień innych.Ta metoda gwarantuje, że wartości właściwości są zestaw , i zadania przepływ danych sprawdza się zestaw poprawnie.

DataType kolumna określa wartości, które są zestaw innych właściwości.W poniższej tabela przedstawiono wymagania zależne od właściwości dla każdego DataType.Typy danych niewymienionych mają ich właściwości zależne od zestaw do zera.

DataType

Długość

Skala

Precision

Strona kodowa

DT_DECIMAL

0

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

0

0

DT_CY

0

0

0

0

DT_NUMERIC

0

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

Większa lub równa 1 i mniejsza 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 i prawidłowego strona kodowa.

DT_WSTR

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

0

0

0

Ponieważ ograniczenia właściwości typu danych oparte są na typ danych kolumna danych wyjściowych, należy wybrać poprawny Integration Services Typ danych podczas pracy z typów zarządzanych.Klasa podstawowa oferuje trzy metody pomocnika, ConvertBufferDataTypeToFitManaged, BufferTypeToDataRecordType, i DataRecordTypeToBufferType , wspomaganie w wyborze Deweloperzy składników zarządzanych SSIS Typ danych typu zarządzanego.Te metody konwersji typów danych zarządzanych do SSIS typów danych i vice versa.

Czas jednostkowy

Na ogół wykonania Uruchom -czas część składnika jest podzielone na dwa zadania — lokalizowanie kolumn wejściowe i wyjściowe składnika w buforze i Odczyt lub zapis wartości tych kolumn w wierszach przychodzących buforu.

Lokalizowanie kolumn w buforze

Liczba kolumn w buforach dostarczanych do składnika podczas wykonywania prawdopodobnie przekroczy liczbę kolumn w kolekcjach wejściowe i wyjściowe składnika.To dlatego każdy bufor zawiera kolumn wyjściowych określonych składników w przepływ 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 metoda BufferManager.Ta metoda lokalizuje kolumna w buforze określonego przez jego identyfikatora rodowodu.Zazwyczaj kolumn znajdują się podczas PreExecute , ponieważ jest pierwszym uruchomieniu -czas metody gdzie BufferManager Właściwość staje się dostępna.

Poniższy przykład kodu pokazuje składnik, który lokalizuje indeksy kolumnas w jego dane wejściowe i wyjściowe kolumna kolekcja podczas PreExecute.Indeksy kolumna są przechowywane w tablicy całkowitą i jest możliwy przez składnik podczas ProcessInput.

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 obiektów zawierających wiersze i kolumny w ProcessInput metoda.Podczas tej metoda są powtórzyć wierszy w buforze, a kolumny stwierdzonych podczas PreExecute są odczytywać i modyfikować.Metoda nosi wielokrotnie przez zadanie przepływ danych , dopóki nie ma więcej wierszy są dostarczane od składnika nadrzędnego.

Poszczególne kolumna w buforze jest odczytu lub zapisu przy użyciu metoda dostępu indeksowania tablicy lub za pomocą jednego z Get lub Set metoda.Get i Set metody są bardziej wydajne i powinny być używane, gdy typ danych kolumna w buforze jest znana.

Poniższy przykład kodu pokazuje implementację ProcessInput metoda, która przetwarza przychodzące 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

Poniżej pokazano składnik prostych transformacja z synchronicznej wyjść, który konwertuje wartości wszystkich kolumn ciąg na wielkie litery.W tym przykładzie nie wykazują metod i funkcje omówione w tym temacie.W ten sposób pokazujesz ważnych metod musi zastępować każdy składnik transformacja niestandardowe z synchronicznej wyjść, ale nie zawiera kodu dla projektu -czas sprawdzania poprawności.Dla składnika transformacja pełną próbki z synchronicznej wyjść, zobacz Readme_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
Ikona usług Integration Services (mała)Bieżąco z usług integracji

Najnowsze pliki do pobrania, artykuły, próbki i wideo firmy Microsoft, jak również wybranych rozwiązań ze Wspólnoty, odwiedź witrynę Integration Services strona na MSDN i TechNet:

Aby otrzymywać automatyczne powiadomienia dotyczące tych aktualizacji, zasubskrybuj źródła danych RSS dostępne na tej stronie.