Aracılığıyla paylaş


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
Integration Services simgesi (küçük)Integration Services ile güncel kalın

En son karşıdan yüklemeler, makaleler, örnekler ve seçilen topluluk çözümleri yanı sıra Microsoft videolar için ziyaret Integration Services sayfa msdn veya TechNet:

Bu güncelleştirmelerle ilgili otomatik bildirim almak için, sayfadaki RSS akışlarına abone olun.