Bir zaman uyumlu çıkışlarına ile özel dönüşümü Bileşen geliştirme
Zaman uyumlu çıkışlarına dönüşümü bileşenlerle satır ters yönde bileşenlerini alırsınız ve okuma veya satır aşağı akım bileşenleri için geçerken bu satırların sütunlardaki değerleri değiştirin.Ters yönde bileşenleri tarafından sağlanan sütunlardan türetilen ek çıktı sütunları da tanımlayabilirsiniz, ancak veri akışı satır eklemeyin.Zaman uyumlu ve zaman uyumsuz bileşenleri arasındaki farklar hakkında daha fazla bilgi için bkz: Zaman uyumlu ve zaman uyumsuz dönüşümleri anlama.
Bu tür bir bileşeni bileşen koşuluyla veri değiştirilen satır içi nerede ve nerede bileşen işlemeden önce tüm satırları görmek yok görevler için uygundur.Zaman uyumlu çıkışlarına ile dönüştürmeleri genellikle dış veri kaynaklarına bağlanma çünkü geliştirmek için en kolay dış meta veriler sütunları yönetmek veya çıktı arabelleği için satır ekleme kadar.
İle zaman uyumlu çıkışlarına dönüştürme bileşeni oluşturmayı gerektirir ekleme bir IDTSInput100 Seçili bileşen için ters yönde sütun içerecek ve bir IDTSOutput100 nesne içeriyor olabilir Türetilmiş sütunlar oluşturduğu bileşeni.Ayrıca tasarım - uygulama içerirsaat yöntemleri ve okur veya yürütme sırasında gelen arabellek satırları sütunlara değiştirir sağlayan kod.
Bu bölümde özel dönüştürme bileşeni uygulamak için gereken ve daha iyi yardımcı olmak için kod örnekleri kavramlarını anlamanız sağlayan bilgileri sağlar.Zaman uyumlu çıkışlarına ile bir örnek dönüştürme bileşeni için bkz: Integration Services örnekleri üzerinde Codeplex.
Tasarım zamanı
Tasarım -saat kod oluşturma girişleri ve çıkışları bileşeni oluşturur herhangi ek çıktı sütunları ekleme ve bileşenin yapılandırmasını doğrulama bu bileşen içerir.
Bileşeni oluşturma
Girdileri, çıktıları ve bileşenin özel özellikleri genellikle sırasında oluşturulan ProvideComponentProperties yöntem.Giriş ve çıkışını dönüştürme bileşeni ile zaman uyumlu çıkışlarına ekleyebilirsiniz iki yolu vardır.Temel sınıf uygulaması kullanabilirsiniz yöntem ve sonra varsayılan giriş ve çıkış oluşturur, veya açıkça giriş eklemek ve kendinizi çıktı.
Aşağıdaki kod örneği uygulaması gösterir ProvideComponentProperties açıkça ekler giriş ve çıkış nesneler.Aynı şeyi başarmak temel sınıf çağrısına açıklamada bulunur.
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
Çıktı sütunları yapılandırma ve oluşturma
Zaman uyumlu çıkışlarına dönüştürme bileşenlerle arabellekleri için satır ekleyebilir, ancak bunlar ekstra ekleme, çıktı sütunları çıktı.Genellikle, yeni çıktı sütununun değerlerini bir bileşeni bir çıkış sütunu eklediğinde, çalışma zamanında elde edilen saat verilerden bir veya daha fazla bileşen ters yönde bir bileşen tarafından sağlanan bir sütun bulunur.
Çıktı sütunu oluşturduktan sonra veri türü özelliklerini olmalıdır küme.Verileri ayarlama özellikleri bir çıkışın yazın sütun özel işlem gerektirir ve arama yoluyla gerçekleştirilen SetDataTypeProperties yöntem.Bu yöntem gereklidir çünkü DataType, Length, Precision, ve CodePage özellikleri, ayrı ayrı salt okunur, çünkü her diğer ayarlarına bağlıdır.Bu yöntem, özelliklerin değerlerini sürekli olarak küme ve veri akışı görevi doğru şekilde ayarlandıklarından doğrular garanti eder.
The DataType of the column determines the values that are set for the other properties.Aşağıdaki tablo gereksinimleri üzerinde bağımlı özellikler için gösterilir DataType.Listede veri türleri bağımlı özelliklerine sahip küme sıfır.
DataType |
Uzunluk |
Ölçek |
Precision |
Kod sayfası |
---|---|---|---|---|
DT_DECIMAL |
0 |
0'dan büyük ve 28 eşit veya daha küçük. |
0 |
0 |
DT_CY |
0 |
0 |
0 |
0 |
DT_NUMERIC |
0 |
0'dan büyük ve daha az'den veya 28 eşit küçük ve duyarlılık. |
' Den büyük veya 1'e eşit ve bir değerden küçük veya bu değere eşit 38. |
0 |
DT_BYTES |
0'dan büyük. |
0 |
0 |
0 |
DT_STR |
0 Ve 8000'dan büyüktür. |
0 |
0 |
Değil 0 ve geçerli kod sayfa. |
DT_WSTR |
0 Ve 4000'dan büyüktür. |
0 |
0 |
0 |
Çünkü kısıtlamalar veri yazın özellikleri çıkış veri türünü temel alan sütun, doğru seçmeniz gerekir Integration Services veri türü çalışırken yönetilen türler.Temel sınıf üç yardımcı yöntemler sağlar ConvertBufferDataTypeToFitManaged, BufferTypeToDataRecordType, ve DataRecordTypeToBufferType yardımcı olan yönetilen bileşen geliştiriciler seçerek bir SSIS veri türü belirtilen yönetilen bir türü.Bu yöntemleri yönetilen veri türleri için dönüştürme SSIS veri türleri ve Başkan versa.
Çalışma zamanı
Genellikle, uygulanmasında run -saat bileşen parçası iki görev kategorize — bileşenin giriş ve çıkış sütunları arabellekte bulma ve okuma veya bu sütunların değerleri gelen arabellek satırları yazma.
Sütunları arabellekte bulma
Yürütme sırasında bir bileşen için sağlanan arabellek sütun sayısı büyük bir olasılıkla girdi veya çıktı Koleksiyonlar bileşenin sütun sayısını aşıyor.Veri akışı bileşenlerinde tanımlanmış çıktı sütunları her arabellek içeriyor olmasıdır.Arabellek sütun doğru girdi veya çıktı sütunları eşleştirilir emin olmak için bileşen geliştiricileri kullanmanız gerekir FindColumnByLineageID yöntem, BufferManager.Bu yöntem bir sütun lineage kimliği verilen belirtilen arabellekte bulur.Genellikle sütun sırasında bulunan PreExecute ilk çalıştırma - çünkü busaat yöntem burada BufferManager özellik kullanılabilir hale gelir.
Aşağıdaki kod örneği, giriş ve çıkış sütun sütun dizinleri bulur bir bileşeni gösterir koleksiyon sırasında PreExecute.Sütun dizinleri bir tamsayı dizisi içinde saklanır ve sırasında bileşen tarafından erişilen 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
Satır işleniyor
Bileşenleri almak PipelineBuffer satır ve sütunları içeren nesneleri ProcessInput yöntem.Bu yöntem sırasında arabellek satırları iterated ve sütunları sırasında tanımlanan PreExecute okumak ve değiştirilebilen.Daha fazla satır ters yönde bileşenden sağlanan kadar yöntem sürekli veri akışı görevi tarafından çağrılır.
Arabellekte tek bir sütun okumak veya dizi Dizin Oluşturucu erişim yöntem kullanarak ya da birini kullanarak yazılmış Get veya Set yöntemleri.The Get and Set methods are more efficient and should be used when the data type of the column in the buffer is known.
Aşağıdaki kod örneği uygulaması gösterir ProcessInput yöntem, işler gelen satırları.
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
Örnek
Aşağıdaki örnek, tüm dize sütun değerleri büyük harfe dönüştürür basit dönüştürme bileşeni ile zaman uyumlu çıkışlarına göstermektedir.Bu örnek, tüm yöntemleri ve bu konuda tartışılan işlevselliğini göstermektedir.Onu her saat uyumlu çıkışlarına ile özel dönüştürme bileşen geçersiz kılmak gerekir, ancak Tasarım doğrulama kodunu içeren önemli yöntemleri gösterilmektedir.Zaman uyumlu çıkışlarına ile bir tam örnek dönüştürme bileşeni için bkz: 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
|