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
|