Aracılığıyla paylaş


Zaman uyumsuz çıkışlarını ile özel bir dönüştürme bileşen geliştirme

Bir bileşen kadar bu bileşen, kendi giriş satır aldığı dönüştürme satırlar çıkış edemiyor veya dönüştürme tam olarak bir çıkış satır girişi alınan her satırı için oluşturmak zaman uyumsuz çıkışlarını ile kullanın.Okuma tüm satırları kadar toplu dönüştürme, örneğin, toplamak satır hesaplanamıyor.Buna ek olarak, bir bileşeni ile saat uyumlu çıkışlarını saat üzerinden geçerken her veri satırı değiştirmek istediğiniz saat kullanabilirsiniz.Yerinde her satır için verileri değiştirebilirsiniz veya her biri için giriş satırların her biri bir değer olan bir veya daha çok yeni sütun oluşturabilirsiniz.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'ni anlama.

Zaman uyumsuz çıkışlarını dönüştürme bileşenlerle benzersiz olduklarından, hedef ve kaynak bileşenleri davranır.Bu tür bir bileşen, Geliş yönündeki bileşenlerini satırları alır ve aşağı akım bileşenleri tarafından tüketilen satır ekler.Diğer veri akışı bileşen bu işlemlerin her ikisini de gerçekleştirir.

Bileşeni ile zaman uyumlu çıkışlarını kullanılabilir Geliş yönündeki bileşenlere sütunlarından bileşenden gelen aşağı bileşenleri otomatik olarak kullanılabilir.Bu nedenle, sütunlar ve satırlar sonraki bileşenine sağlamak için herhangi bir çıktı sütunları tanımlamak üzere bir zaman uyumlu çıkışlarını bileşeni yok.Zaman uyumsuz bir çıkış bileşenlerle diğer taraftan, gerekir çıktı sütunlarını tanımlayın ve satırlar akış yönündeki bileşenlere sağlar.Bu nedenle bir saat uyumsuz çıkışlarını bileşeniyle, tasarım ve çalışma zamanı sırasında daha fazla görev varsa ve bileşen geliştirici uygulamak için daha fazla kodu.

SQL Server Integration Services zaman uyumsuz çıkışlarını ile birkaç dönüştürmeleri içerir.Örneğin, sıralama dönüştürme, bunları sıralamadan önce tüm satırları gerektirir ve zaman uyumsuz Çıkış'ı kullanarak erişir.Tüm satırlar aldığı sonra bunları sıralar ve bunları çıktısı için ekler.

Bu bölümde, zaman uyumsuz çıkışlarını ile dönüştürmeleri geliştirmek nasıl ayrıntılı olarak açıklanmaktadır.Bir örnek dönüştürme bileşeni için zaman uyumsuz çıkışlarını, bkz: Remove Duplicates Component Sample. Kaynak bileşen geliştirme hakkında daha fazla bilgi için bkz: Özel bir kaynak bileşen geliştirme.

Tasarım zamanı

Bileşeni oluşturma

The SynchronousInputID() özellik on the IDTSOutput100 object identifies whether an output is synchronous or asynchronous. Zaman uyumsuz bir çıktı oluşturmak için , çıktı için bileşen ve kümesi eklemek SynchronousInputID() sıfır olarak, . Ayrıca, bu özellik ayarlamak, veri akışı görevi ayırır olup olmadığını belirler PipelineBuffer Giriş ve çıkış bir bileşenin nesnelerinin veya tek bir arabelleğe ise ve ayrılmış iki nesne arasında paylaşılan.

Aşağıdaki örnek kod bir zaman uyumsuz çıkışı oluşturan bir bileşeni gösterir, ProvideComponentProperties() uygulaması.

using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime;


namespace Microsoft.Samples.SqlServer.Dts
{
    [DtsPipelineComponent(DisplayName = "AsyncComponent",ComponentType = ComponentType.Transform)]
    public class AsyncComponent : PipelineComponent
    {
        public override void ProvideComponentProperties()
        {
            // Call the base class, which adds a synchronous input
            // and output.
            base.ProvideComponentProperties();

            // Make the output asynchronous.
            IDTSOutput100 output = ComponentMetaData.OutputCollection[0];
            output.SynchronousInputID = 0;
        }
    }
}
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime

<DtsPipelineComponent(DisplayName:="AsyncComponent", ComponentType:=ComponentType.Transform)> _
Public Class AsyncComponent
    Inherits PipelineComponent

    Public Overrides Sub ProvideComponentProperties()

        ' Call the base class, which adds a synchronous input
        ' and output.
        Me.ProvideComponentProperties()

        ' Make the output asynchronous.
        Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0)
        output.SynchronousInputID = 0

    End Sub


End Class

Oluşturma ve çıktı sütunları yapılandırma

Önceden de belirttiğimiz gibi zaman uyumsuz bir bileşen, çıktı sütunu için sütun ekler koleksiyon sütunları akış yönündeki bileşenlere sağlamak için.Seçebileceğiniz, bileşen gereksinimlerine bağlı olarak tasarım zamanı birkaç yöntem vardır.Örneğin, tüm sütunları, Geliş yönündeki bileşenlerini akış yönündeki bileşenlere geçirmek isterseniz, geçersiz OnInputPathAttached(Int32) Bu giriş sütunları bileşene kullanılabilir ilk yöntem olduğu için sütunları eklemek için yöntem.

Bileşen çıkış oluşturur, giriş için Seçili sütunları sütunları temel alan, geçersiz SetUsageType(Int32, IDTSVirtualInput100, Int32, DTSUsageType) çıktı sütunları seçin ve bunların nasıl kullanılacağını belirtmek için yöntem.

Çıktı sütunları Geliş yönündeki bileşenlere sütunları temel alan bir bileşeni zaman uyumsuz çıkışları oluşturur ve kullanılabilir Geliş yönündeki sütunları değiştirmek, bileşen, çıktı sütun koleksiyon güncelleştirmeniz gerekir.Bu değişiklikleri sırasında bileşen tarafından algılanması Validate()ve sabit sırasında ReinitializeMetaData().

Not

Ne zaman bir çıkış sütunu, çıktı sütunu kaldırılır koleksiyon, veri akışı sütun başvurusu aşağı akım bileşenlerinde olumsuz etkilenir.Çıktı sütun kaldırma ve akış yönündeki bileşenlere kesiliyor önlemek için sütun yeniden onarılması gerekir.Örneğin, veri türü, sütun sahip değiştirildiğinde veri türü güncelleştirmelisiniz.

Aşağıdaki kod örneği, çıkış sütununa bir çıkış sütunu ekler bir bileşeni gösterir koleksiyon Geliş yönündeki bileşenden gelen her sütun için.

public override void OnInputPathAttached(int inputID)
{
   IDTSInput100 input = ComponentMetaData.InputCollection.GetObjectByID(inputID);
   IDTSOutput100 output = ComponentMetaData.OutputCollection[0];
   IDTSVirtualInput100 vInput = input.GetVirtualInput();

   foreach (IDTSVirtualInputColumn100 vCol in vInput.VirtualInputColumnCollection)
   {
      IDTSOutputColumn100 outCol = output.OutputColumnCollection.New();
      outCol.Name = vCol.Name;
      outCol.SetDataTypeProperties(vCol.DataType, vCol.Length, vCol.Precision, vCol.Scale, vCol.CodePage);
   }
}
Public Overrides Sub OnInputPathAttached(ByVal inputID As Integer)

    Dim input As IDTSInput100 = ComponentMetaData.InputCollection.GetObjectByID(inputID)
    Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0)
    Dim vInput As IDTSVirtualInput100 = input.GetVirtualInput()

    For Each vCol As IDTSVirtualInputColumn100 In vInput.VirtualInputColumnCollection

        Dim outCol As IDTSOutputColumn100 = output.OutputColumnCollection.New()
        outCol.Name = vCol.Name
        outCol.SetDataTypeProperties(vCol.DataType, vCol.Length, vCol.Precision, vCol.Scale, vCol.CodePage)

    Next
End Sub

saat çalıştırın.

saat uyumsuz çıkışlarını bileşenlerle yöntemlerinden farklı bir sıra diğer bileşenlerin türlerinden çalışma zamanında de çalıştırabilirsiniz.Önce her bir çağrı almak yalnızca bileşenleridir PrimeOutput(Int32, array<Int32[], array<PipelineBuffer[]) ve ProcessInput(Int32, PipelineBuffer) yöntemleri. Işleme başlamadan önce zaman uyumsuz çıkışlarını bileşenlerle de gelen tüm satırlar erişmek istiyorsa, tüm satır okuma kadar bu nedenle bunlar giriş satırları dahili olarak önbelleğe gerekir.Son olarak, diğer bileşenlerin bir giriş arabellek hem de bir çıkış arabelleği bileşenleri zaman uyumsuz bir çıkış alırsınız.

Arabellekleri anlama

Giriş sırasında bileşen tarafından alınan ProcessInput(Int32, PipelineBuffer). Bu arabellek, arabellek için Geliş yönündeki bileşenleri tarafından eklenen satırlar içerir.Arabellek, ayrıca, Geliş yönündeki bir bileşeni çıkışı sağlanan, ancak giriş zaman uyumsuz bir bileşenin eklenmedi sütunları için ek bileşenin giriş sütunlarından içerir koleksiyon.

Bileşen için sağlanan çıkış arabelleği PrimeOutput(Int32, array<Int32[], array<PipelineBuffer[]), ilk satır içermiyor. Bileşen bu arabelleği için satır ekler ve dolu olduğunda, akış yönündeki bileşenlere arabellek sağlar.Çıkış arabelleği bileşenin çıktı sütunu tanımlı sütunları içeren koleksiyon, ek olarak, diğer akış yönündeki bileşenlere, çıkışlar için eklediğiniz herhangi bir sütun.

Bu paylaşılan tek bir arabelleğe alma, zaman uyumlu çıkışlarını bileşenlerle görünenden farklı davranıştır.Paylaşılan bir bileşen ile zaman uyumlu çıkışlarını arabellek, iki giriş ve çıkış sütunlarını ters yönde ve akış yönündeki bileşenlere çıkışlarını ilgili olarak için eklenen sütunlar ek olarak, bileşen içerir.

Satır işleniyor

Giriş satırları önbelleğe alma

Bir zaman uyumsuz çıkışlarını bileşeni yazdığınızda, çıkış arabelleği için satır eklemek için üç seçeneğiniz vardır.Giriş satır alındığından, bunları ekleyebilirsiniz, siz onları bileşen satırları Geliş yönündeki bileşeninden alınan ya da bileşen için bunu uygun olduğunda, bunları ekleyebilirsiniz kadar önbelleğe alabilir.Seçtiğiniz yöntem, bileşen gereksinimlerine bağlıdır.Örneğin, Geliş yönündeki tüm satırları, sıralanmış önce alınabilmesi sıralama bileşeni gerektirir.Bu nedenle, tüm satırlar için çıkış arabelleği satırları eklemeden önce kadar bekler.

Bunları işlemek hazır olduğu kadar giriş arabelleğe alınan satırları dahili olarak bileşeni tarafından önbelleğe alınması gerekir.Veri tablosu, çok boyutlu bir dizi veya başka bir dahili yapıyı gelen arabellek satırları önbelleğe alınabilir.Tüm satır okuma kadar gelen arabellek satırları dahili olarak önbelleğe bir bileşen örneği için bkz: Remove Duplicates Component Sample.

Çıkış satır ekleme

Alındıkları veya tüm satırları aldıktan sonra arama yoluyla bunu satırlar için çıkış arabelleği mi eklemek AddRow() çıkış arabelleği yöntem. Satır, ekledikten sonra küme her yeni satırın sütun değerleri.

Olduğundan bazen daha fazla sütun'den Çıkış arabellekte bileşen çıktı sütunu koleksiyonunda, değerini ayarlamak için önce uygun sütun dizini arabellekte bulmalısınız.The FindColumnByLineageID(Int32, Int32) yöntem of the BufferManager() özellik returns the index of the sütun in the buffer row with the specified lineage ID, which is then used to assign the value to the buffer sütun.

The PreExecute() yöntem, which is called before the PrimeOutput(Int32, array<Int32[], array<PipelineBuffer[]) yöntem or the ProcessInput(Int32, PipelineBuffer) yöntem, is the first yöntem where the BufferManager() özellik is available, and the first opportunity to locate the indexes of the columns in the input and output buffers.

Örnek

Aşağıdaki örnek, alındıkları gibi çıkış arabelleği için satır ekleyen bir basit dönüştürme bileşeni zaman uyumsuz çıkışları gösterir.Bu örnek tüm yöntemleri ve bu konuda tartışılan işlevselliği gösteren değil.Bu, önemli yöntemler her saat uyumsuz çıkışlarını özel dönüştürme bileşeniyle kılmalıdır ancak Tasarım zamanı doğrulama kodunu içeren gösterir.Ayrıca, kod ProcessInput(Int32, PipelineBuffer) çıktı sütunu koleksiyon giriş sütun koleksiyonunda her sütun için bir sütun olduğunu varsayar. Bir tam örnek dönüştürme bileşeni için zaman uyumsuz çıkışlarını, bkz: Remove Duplicates Component Sample.

using System;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

namespace Microsoft.Samples.SqlServer.Dts
{
   [DtsPipelineComponent(DisplayName = "AsynchronousOutput")]
   public class AsynchronousOutput : PipelineComponent
   {
      PipelineBuffer outputBuffer;
      int[] inputColumnBufferIndexes;
      int[] outputColumnBufferIndexes;

      public override void ProvideComponentProperties()
      {
         // Let the base class add the input and output objects.
         base.ProvideComponentProperties();

         // Name the input and output, and make the
         // output asynchronous.
         ComponentMetaData.InputCollection[0].Name = "Input";
         ComponentMetaData.OutputCollection[0].Name = "AsyncOutput";
         ComponentMetaData.OutputCollection[0].SynchronousInputID = 0;
      }
      public override void PreExecute()
      {
         IDTSInput100 input = ComponentMetaData.InputCollection[0];
         IDTSOutput100 output = ComponentMetaData.OutputCollection[0];

         inputColumnBufferIndexes = new int[input.InputColumnCollection.Count];
         outputColumnBufferIndexes = new int[output.OutputColumnCollection.Count];

         for (int col = 0; col < input.InputColumnCollection.Count; col++)
            inputColumnBufferIndexes[col] = BufferManager.FindColumnByLineageID(input.Buffer, input.InputColumnCollection[col].LineageID);

         for (int col = 0; col < output.OutputColumnCollection.Count; col++)
            outputColumnBufferIndexes[col] = BufferManager.FindColumnByLineageID(output.Buffer, output.OutputColumnCollection[col].LineageID);

      }

      public override void PrimeOutput(int outputs, int[] outputIDs, PipelineBuffer[] buffers)
      {
         if (buffers.Length != 0)
            outputBuffer = buffers[0];
      }
      public override void ProcessInput(int inputID, PipelineBuffer buffer)
      {
            // Advance the buffer to the next row.
            while (buffer.NextRow())
            {
               // Add a row to the output buffer.
               outputBuffer.AddRow();
               for (int x = 0; x < inputColumnBufferIndexes.Length; x++)
               {
                  // Copy the data from the input buffer column to the output buffer column.
                  outputBuffer[outputColumnBufferIndexes[x]] = buffer[inputColumnBufferIndexes[x]];
               }
            }
         if (buffer.EndOfRowset)
         {
            // EndOfRowset on the input buffer is true.
            // Set EndOfRowset on the output buffer.
            outputBuffer.SetEndOfRowset();
         }
      }
   }
}
Imports System
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

Namespace Microsoft.Samples.SqlServer.Dts

    <DtsPipelineComponent(DisplayName:="AsynchronousOutput")> _
    Public Class AsynchronousOutput


        Inherits PipelineComponent

        Private outputBuffer As PipelineBuffer
        Private inputColumnBufferIndexes As Integer()
        Private outputColumnBufferIndexes As Integer()

        Public Overrides Sub ProvideComponentProperties()

            ' Let the base class add the input and output objects.
            Me.ProvideComponentProperties()

            ' Name the input and output, and make the
            ' output asynchronous.
            ComponentMetaData.InputCollection(0).Name = "Input"
            ComponentMetaData.OutputCollection(0).Name = "AsyncOutput"
            ComponentMetaData.OutputCollection(0).SynchronousInputID = 0
        End Sub

        Public Overrides Sub PreExecute()

            Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)
            Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0)

            ReDim inputColumnBufferIndexes(input.InputColumnCollection.Count)
            ReDim outputColumnBufferIndexes(output.OutputColumnCollection.Count)

            For col As Integer = 0 To input.InputColumnCollection.Count
                inputColumnBufferIndexes(col) = BufferManager.FindColumnByLineageID(input.Buffer, input.InputColumnCollection(col).LineageID)
            Next

            For col As Integer = 0 To output.OutputColumnCollection.Count
                outputColumnBufferIndexes(col) = BufferManager.FindColumnByLineageID(output.Buffer, output.OutputColumnCollection(col).LineageID)
            Next

        End Sub
        Public Overrides Sub PrimeOutput(ByVal outputs As Integer, ByVal outputIDs As Integer(), ByVal buffers As PipelineBuffer())

            If buffers.Length <> 0 Then
                outputBuffer = buffers(0)
            End If

        End Sub

        Public Overrides Sub ProcessInput(ByVal inputID As Integer, ByVal buffer As PipelineBuffer)

                ' Advance the buffer to the next row.
                While (buffer.NextRow())

                    ' Add a row to the output buffer.
                    outputBuffer.AddRow()
                    For x As Integer = 0 To inputColumnBufferIndexes.Length

                        ' Copy the data from the input buffer column to the output buffer column.
                        outputBuffer(outputColumnBufferIndexes(x)) = buffer(inputColumnBufferIndexes(x))

                    Next
                End While

            If buffer.EndOfRowset = True Then
                ' EndOfRowset on the input buffer is true.
                ' Set the end of row set on the output buffer.
                outputBuffer.SetEndOfRowset()
            End If
        End Sub
    End Class
End Namespace
Integration Services icon (small) Tümleştirme Hizmetleri ile güncel kalın

Karşıdan yüklemeler, makaleleri, örnekler ve en son Microsoft video yanı sıra, seçili topluluğun çözümleri için ziyaret Integration Services sayfa MSDN veya TechNet:

Bu güncelleştirmelerin otomatik bildirim için kullanılabilir RSS akışlarına abone olmak sayfa.