Aracılığıyla paylaş


Bir zaman uyumsuz çıkışlarına ile özel dönüşümü Bileşen geliştirme

Bir bileşeni ile zaman uyumsuz çıkışlarına dönüştürme bileşeni tüm giriş satırları aldı kadar satır çıkışı yapamazsınız veya dönüştürme giriş olarak alınan her satır için bir çıkış satır üretir zaman kullanın.Tüm satırları okuyuncaya toplama dönüştürme, örneğin, satırlarda toplam hesaplayamıyor.Buna karşılık, bir bileşeni ile saat uyumlu çıkışlarına ne saat üzerinden geçerken her satırı veri değiştirmek istediğiniz saat kullanabilirsiniz.Her satırdaki verilerin yerinde değiştirebilir veya her birinin giriş satırların her biri için bir değer olan bir veya daha fazla yeni sütunlar 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 anlama.

Zaman uyumsuz çıkışlarına dönüşümü bileşenlerle bunlar hedef ve kaynak bileşenleri gibi davrandığı için benzersizdir.Bu tür bir bileşen ters yönde bileşenlerinden satırları alır ve aşağı akım bileşenleri tarafından tüketilen bir satır ekler.Başka bir veri akışı bileşeni her ikisi de bu işlemleri gerçekleştirir.

Ters yönde bileşenlerinden bir bileşeni ile zaman uyumlu çıkışlarına kullanılabilir sütunları bileşenden aşağı akım bileşenleri otomatik olarak kullanılabilir.Bu nedenle, sütunların ve satırların sonraki bileşene sağlamak için herhangi bir çıktı sütunu tanımlamak zaman uyumlu çıkışlarına ile bir bileşen yok.Zaman uyumsuz çıkışlarına bileşenlerle diğer taraftan gerekir çıktı sütunlarını tanımlayın ve satır aşağı akım bileşenleri sağlar.Bu nedenle bir bileşeni ile saat uyumsuz çıkışlarına hem tasarım hem de çalışma zamanı sırasında gerçekleştirmek için daha fazla görevi, ve bileşen geliştirici uygulamak için daha fazla kodu vardır.

SQL Server Integration Services contains several transformations with asynchronous outputs.Örneğin, sıralama dönüştürme onları sıralayabilirsiniz önce tüm satırlar gerektirir ve bu zaman uyumsuz çıkışlarına kullanarak erişir.Tüm satırları aldıktan sonra bunları sıralar ve çıktısı için bunları ekler.

Bu bölümde ayrıntılı olarak dönüşümleri ile zaman uyumsuz çıkışlarına geliştirme yöntemleri açıklanmaktadır.Bakın bir örnek dönüştürme bileşeni ile zaman uyumsuz çıkışlarına, Integration Services örnekleri üzerinde Codeplex.Kaynak Bileşen geliştirme hakkında daha fazla bilgi için bkz: Özel kaynak Bileşen geliştirme.

Tasarım zamanı

Bileşeni oluşturma

The SynchronousInputID property on the IDTSOutput100 object identifies whether an output is synchronous or asynchronous.Zaman uyumsuz bir çýktý yaratmak için çıktı bileşen ve küme eklemek SynchronousInputID sıfır.Bu ayarı özellik de veri akışı görevi ayırdığı olup olmadığını belirler PipelineBuffer giriş ve çıkış bileşeninin nesneleri veya tek bir arabelleğe ve ayrılan iki nesneleri. arasında paylaşılan

Aşağıdaki örnek kod bir zaman uyumsuz çıkış oluşturur 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

Çıktı sütunları yapılandırma ve oluşturma

Daha önce belirtildiði gibi zaman uyumsuz bir bileşeni ekler sütunçıktısı s sütun sağlamak için toplama sütuns aşağı akım bileşenleri.Vardır birkaç tasarım -saat yöntemleri, bileşen gereksinimlerine bağlı olarak seçilecek.Örneğin, tüm sütunlar için aşağı akım bileşenleri ters yönde bileşenlerini geçirmek istiyorsanız, size geçersiz OnInputPathAttached yöntemi eklemek sütunları, çünkü bu ilk yöntem, giriş sütun kullanılabilir bileşen.

Bileşen çıkış oluşturur sütunları için kendi giriş Seçili sütunlar göre geçersiz kılma SetUsageType çıktı sütunları seçmek ve bunların nasıl kullanılacağını belirtmek için yöntem.

Bir bileşeni ile zaman uyumsuz çıkışlarına çıktı oluşturursa sütuns esas sütunters yönde bileşenleri ve kullanılabilir upstream s sütuns değiştirme, bileşen çıktısı güncelleştirmeniz gerekir sütun koleksiyonu.Bu değişiklikler sırasında bileşen tarafından algılanması gerekir Validateve sırasında sabit ReinitializeMetaData.

Not

Bir çıkış yaparken sütun çıktısı kaldırılır sütun koleksiyonu, başvuru aşağı akım Bileşenleri'nde, veri akışı sütun olumsuz etkilenir.Çıktı sütun kaldırma ve yeniden onarılması sütun aşağı akım bileşenleri parçalamak önlemek için.Örneğin, veri türü, sütun olan değiştirildiğinde veri türü güncelleştirmeniz gerekir.

Aşağıdaki kod örneği, çıktı sütunu için bir çıkış sütunu ekler bir bileşeni gösterir koleksiyon ters yönde 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

Çalışma zamanı

saat uyumsuz olan bileşenleri çıkarır da yürütmek yöntemleri zamanında bileşenlerin diğer türlerinden farklı bir dizi.İlk olarak, bunların her ikisi de bir çağrı aldığınız tek bileşenleridir PrimeOutput ve ProcessInput yöntemleri.İşleme başlamadan önce zaman uyumsuz çıkışlarına bileşenlerle aynı zamanda gelen tüm satırlar erişmesi; tüm satırları okumak kadar bu nedenle, bunlar giriş satırları dahili olarak önbelleğe gerekir.Son olarak, diğer bileşenleri farklı olarak bir giriş arabellek hem çıkış arabelleği zaman uyumsuz çıkışlarına bileşenlerle alırsınız.

Arabellekler anlama

Giriş arabelleği sırasında bileşen tarafından alınan ProcessInput.Bu arabellek arabellek için ters yönde bileşenleri tarafından eklenen satırlar içerir.Arabellek da ters yönde bir bileşen çıkışında sağlanan, ancak zaman uyumsuz bileşenin giriş için eklenen sütunlar için ek bileşenin giriş sütunları içeren koleksiyon.

Bileşen için sağlanan çıkış arabelleği PrimeOutput, başlangıçta değil içeren satırlar.Bileşen bu arabelleği için satır ekler ve aşağı akım bileşenleri için arabellek dolduğunda, sağlar.Çıkış arabelleği içeren sütunçýktýsýný bileşeninde tanımlandığı s sütun yanında herhangi bir koleksiyon sütundiğer aşağı akım bileşenleri kendi çıkışları için eklediğiniz s.

Bu paylaşılan tek bir arabelleğe alma zaman uyumlu çıkışlarına bileşenlerle farklı davranış budur.Her iki giriş ve çıkış sütunları sütunlar çıkışlarına akış yukarı ve aşağı akım bileşenleri için eklenen ek olarak bileşenin paylaşılan arabellek ile zaman uyumlu çıkışlarına bir bileşen içerir.

Satır işleniyor

Giriş satırları önbelleğe alma

Bir bileşeni ile zaman uyumsuz çıkışlarına yazarken çıkış arabelleği için satır eklemek için üç seçeneğiniz vardır.Giriş satırları alındı olarak bunları ekleyebilirsiniz, siz bunları bileşen ters yönde bileşenden gelen tüm satırlar aldı ya da bileşen için bunu yapmak uygun olduğunda, bunları ekleyebilirsiniz kadar önbelleğe alabilir.Seçtiğiniz yöntem, bileşen gereksinimlerine bağlıdır.Örneğin, sıralama bileşen ters yönde tüm satırlar bunlar sıralanabilir önce alınması gerektirir.Bu nedenle, tüm satırlar için çıkış arabelleği satırları eklemeden önce okumak kadar onu bekler.

Bunları işlemek hazır hale gelene kadar girdi arabelleğinde alınan satır bileşeni tarafından dahili olarak önbelleğe gerekir.Gelen arabellek satırları bir veri önbelleğe alınmış tablo, çok boyutlu bir dizi ya da herhangi bir iç yapısı.Tüm satırları okumak kadar dahili olarak gelen arabellek satırları önbelleğe bir bileşen örneği için bkz: Readme_Remove Duplicates Component Sample.

Çıkış satır ekleme

Alındıkları veya tüm satırları aldıktan sonra çağırarak bunu gibi satırlar çıkış arabelleği mı eklemek AddRow yöntem çıktı arabelleği.Satırı ekledikten sonra küme her bir yeni satır sütun değerleri.

Olduğundan bazen daha fazla sütun'den çıktı arabelleği bileşen çıkış Sütun koleksiyonunda, önce size uygun sütun dizini arabellekte bulmak gerekir küme değeri.The FindColumnByLineageID method of the BufferManager property returns the index of the column in the buffer row with the specified lineage ID, which is then used to assign the value to the buffer column.

The PreExecute method, which is called before the PrimeOutput method or the ProcessInput method, is the first method where the BufferManager property is available, and the first opportunity to locate the indexes of the columns in the input and output buffers.

Örnek

Aşağıdaki örnek aldığı şekilde çıktı arabelleği için satır ekler bir basit dönüştürme bileşeni ile zaman uyumsuz çıkışlarına göstermektedir.Bu örnek, tüm yöntemleri ve bu konuda tartışılan işlevselliğini göstermektedir.Onu her saat uyumsuz çı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.Ayrıca, kod, ProcessInput varsayar çıktı sütunu koleksiyon her sütun için bir sütun giriş sütun vardır koleksiyon.Zaman uyumsuz çıkışlarına ile bir tam örnek dönüştürme bileşeni için bkz: Readme_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 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.