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
|