Aracılığıyla paylaş


Özel bir kaynak bileşen geliştirme

SQL Server Integration Services Geliştiriciler, özel veri kaynaklarına bağlanmak ve bu kaynaklardan diğer veri akışı görevi bileşenlerinde veri sağlamak için kaynak bileşenleri yazma olanağı sağlar.Varolan birini kullanarak erişilemiyor veri kaynaklarına bağlandığınız zaman özel kaynakları oluşturma olanağı değerlidir. Integration Services kaynakları.

Kaynak bileşenlerini bir veya daha fazla çıkış ve sıfır girişleri var.Tasarım sırasında saat, kaynak bileşenlerini oluşturmak ve bağlantıları yapılandırmak için kullanılan sütun meta veriler dış veri kaynağından okuyun ve dış veri kaynağını temel alan kaynağının çıkış sütunları olarak yapılandırın.Yürütme sırasında dış verileri bağlandıklarında kaynak ve bir çıkış arabelleği için satır ekleyin.veri akışı görevi, daha sonra bu arabellekteki veri satırlarının akış yönündeki bileşenlere sağlar.

Örnek kaynak bileşen için bkz: ADO Source Component Sample. Veri akışı bileşen geliştirme genel bir bakış için bkz: Özel veri akışı bileşen geliştirme.

Tasarım zamanı

Uygulama tasarım-saat ekleme, veri kaynağı olarak yansıtan bir çıktı sütunu yapılandırma ve bileşen çalıştırmaya hazır olduğunu doğrulayarak bir dış veri kaynağına bağlantı belirten bir Kaynak bileşeninin işlevselliğini içerir.Tanım olarak, sıfır girişleri ve çıkış zaman uyumsuz, bir veya daha fazla kaynak bileşeni vardır.

Bileşeni oluşturma

Kaynak bileşenleri kullanarak dış veri kaynaklarına bağlanmak... ConnectionManager tanımlanan nesnelerin bir paket. Bunlar için bir öğe ekleyerek, bir Bağlantı Yöneticisi gereksinimini gösterir RuntimeConnectionCollection() koleksiyon, ComponentMetaData() özellik. Bu koleksiyon iki amaca hizmet eder; paketindeki bileşeni tarafından kullanılan bağlantı yöneticileri başvurular basılı tutun ve bir Bağlantı Yöneticisi için tasarımcıya gereksinimini duyurmak için.Zaman bir IDTSRuntimeConnection100 eklenen koleksiyon, Gelişmiş Düzenleyici görüntüler.Bağlantı özellikleri sekmesini seçin veya Bu pakette bağlantı oluşturma sağlar.

Aşağıdaki kod örneği uygulaması gösterir. ProvideComponentProperties() bir çıktı ekler ve ekler bir IDTSRuntimeConnection100 nesneyi RuntimeConnectionCollection().

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;

namespace Microsoft.Samples.SqlServer.Dts
{
    [DtsPipelineComponent(DisplayName = "MySourceComponent",ComponentType = ComponentType.SourceAdapter)]
    public class MyComponent : PipelineComponent
    {
        public override void ProvideComponentProperties()
        {
            // Reset the component.
            base.RemoveAllInputsOutputsAndCustomProperties();
            ComponentMetaData.RuntimeConnectionCollection.RemoveAll();

            IDTSOutput100 output = ComponentMetaData.OutputCollection.New();
            output.Name = "Output";

            IDTSRuntimeConnection100 connection = ComponentMetaData.RuntimeConnectionCollection.New();
            connection.Name = "ADO.NET";
        }
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

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

    Public Overrides Sub ProvideComponentProperties()

        ' Allow for resetting the component.
        RemoveAllInputsOutputsAndCustomProperties()
        ComponentMetaData.RuntimeConnectionCollection.RemoveAll()

        Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection.New()
        output.Name = "Output"

        Dim connection As IDTSRuntimeConnection100 = ComponentMetaData.RuntimeConnectionCollection.New()
        connection.Name = "ADO.NET"

    End Sub
End Class

Bir dış veri bağlama kaynak

Bir bağlantı için eklendikten sonra RuntimeConnectionCollection(), size geçersiz AcquireConnections(Object) dış veri bağlantısı için bir yöntem kaynak. Bu yöntem, tasarım ve yürütme sırasında çaðrýlýr saat.Bileşen çalışma-tarafından belirtilen Bağlantı Yöneticisi bağlantısı saat bağlantısı ve daha sonra dış veri kaynağına.

Bağlantı kurulduktan sonra bileşeni tarafından dahili olarak önbelleğe alınması ve ne zaman serbest ReleaseConnections() yöntem çaðrýlýr. The ReleaseConnections() yöntem is called at design and execution saat, like the AcquireConnections(Object) yöntem. Geliştiriciler bu yöntem geçersiz kılmak ve sırasında bileşen tarafından kurulan bir bağlantı bırakın AcquireConnections(Object).

Aşağıdaki kod örneği, ADO.NET bağlantınız bağlanan bir bileşeni gösterir AcquireConnections(Object) yöntem ve bağlantıyı kapatır ReleaseConnections() yöntem.

private SqlConnection sqlConnection;

public override void AcquireConnections(object transaction)
{
    if (ComponentMetaData.RuntimeConnectionCollection[0].ConnectionManager != null)
    {
        ConnectionManager cm = Microsoft.SqlServer.Dts.Runtime.DtsConvert.GetWrapper(ComponentMetaData.RuntimeConnectionCollection[0].ConnectionManager);
        ConnectionManagerAdoNet cmado = cm.InnerObject as ConnectionManagerAdoNet;

        if (cmado == null)
            throw new Exception("The ConnectionManager " + cm.Name + " is not an ADO.NET connection.");

        sqlConnection = cmado.AcquireConnection(transaction) as SqlConnection;
        sqlConnection.Open();
    }
}

public override void ReleaseConnections()
{
    if (sqlConnection != null && sqlConnection.State != ConnectionState.Closed)
        sqlConnection.Close();
}
Private sqlConnection As SqlConnection

Public Overrides Sub AcquireConnections(ByVal transaction As Object)

    If Not IsNothing(ComponentMetaData.RuntimeConnectionCollection(0).ConnectionManager) Then

        Dim cm As ConnectionManager = Microsoft.SqlServer.Dts.Runtime.DtsConvert.GetWrapper(ComponentMetaData.RuntimeConnectionCollection(0).ConnectionManager)
        Dim cmado As ConnectionManagerAdoNet = CType(cm.InnerObject, ConnectionManagerAdoNet)

        If IsNothing(cmado) Then
            Throw New Exception("The ConnectionManager " + cm.Name + " is not an ADO.NET connection.")
        End If

        sqlConnection = CType(cmado.AcquireConnection(transaction), SqlConnection)
        sqlConnection.Open()

    End If
End Sub

Public Overrides Sub ReleaseConnections()

    If Not IsNothing(sqlConnection) And sqlConnection.State <> ConnectionState.Closed Then
        sqlConnection.Close()
    End If

End Sub

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

Çıktı sütunları bir Kaynak bileşeninin yürütülürken veri akışı için bileşen ekleyen bir dış veri kaynağına sütunlarından yansıtır.Tasarım sırasında saat, bileşen, bir dış veri kaynağına bağlanmak için yapılandırıldı sonra çıktı sütunu ekleyin.Tasarım-saat sırasında eklenmedi, ancak temel alan bir bileşeni, Çıktı koleksiyonuna sütunları değişebilir eklemek için kullandığı yöntem, bileşenin gereksinimlerine göre Validate() veya AcquireConnections(Object). Örneğin, verileri denetleyen bir özel özellik bir SQL deyimni içeren bir bileşen küme çıktı sütunlarını sırasında bileşen ekleme için SetComponentProperty(String, Object) yöntem. Bileşen, önbelleğe alınmış bir bağlantısı olan ve varsa, verilere bağlanan olup olmadığını denetler kaynak ve çıktı sütunlarını oluşturur.

Bir çıkış sütun oluşturulduktan sonra küme, bir veri türü özelliklerini arayarak SetDataTypeProperties(DataType, Int32, Int32, Int32, Int32) yöntem. Bu yöntem gerekmez çünkü DataType(), Length(), Precision(), ve CodePage() özellik salt okunur ve her özelliğin bağımlı olan diğer ayarlar. Bu yöntem bu değerleri gereksinimini zorlar küme tutarlı bir şekilde, ve veri akışı görevi bunların olduğunu doğrulamak için kullandığı yöntemi küme doğru.

The DataType() of the sütun determines the values that are küme for the other properties. Aşağıdaki tabloda gereksinimleri bağımlı özelliklerin her biri için gösterir DataType(). Listelenmeyen veri türleri, sıfır olarak ayarlamak, bağımlı özellikleri vardır.

DataType

Uzunluk

Ölçek

Duyarlık

CodePage

dt_decimal

0

0'Dan büyük ve küçük veya eşit 28 için.

0

0

dt_cy

0

0

0

0

dt_numeric

0

0'Dan büyük ve küçük daha veya 28 eşit ve Precision'dan.

Büyük veya eşittir 1'den küçük veya eşittir 38 ve.

0

dt_bytes

0'Dan büyük.

0

0

0

dt_str

0 Ile 8000'den küçük büyük.

0

0

Değil 0 ve geçerli kod sayfa.

dt_wstr

0 Ile 4000'den küçük büyük.

0

0

0

Verileri kısıtlamalar yazın, çünkü özellikleri çıktı veri türünü temel alan sütun, doğru seçmelisiniz SSIS yönetilen türleriyle çalışırken, veri türü. Temel sınıf üç yardımcı yöntemleri sağlar. ConvertBufferDataTypeToFitManaged(DataType, Boolean%), BufferTypeToDataRecordType(DataType), ve DataRecordTypeToBufferType(Type), seçme yönetilen bir bileşen geliştiricileri yardımcı olacak bir SSIS veri belirli bir yönetilen bir tür'yazın. Bu yöntemler yönetilen bir veri türlerine dönüştürün. SSIS veri türleri ve bunun tersi de geçerlidir.

Aşağıdaki örnekte gösterildiği nasıl kod çıktı sütun koleksiyon bir bileşeni olan bir tablo şemasını temel alarak doldurulur.Veri türünü belirlemek için kullanılan temel sınıf yardımcı yöntemlerini sütun, ve veri türüne bağımlı özellikleri temel alınarak küme.

SqlCommand sqlCommand;

private void CreateColumnsFromDataTable()
{
    // Get the output.
    IDTSOutput100 output = ComponentMetaData.OutputCollection[0];

    // Start clean, and remove the columns from both collections.
    output.OutputColumnCollection.RemoveAll();
    output.ExternalMetadataColumnCollection.RemoveAll();

    this.sqlCommand = sqlConnection.CreateCommand();
    this.sqlCommand.CommandType = CommandType.Text;
    this.sqlCommand.CommandText = (string)ComponentMetaData.CustomPropertyCollection["SqlStatement"].Value;
    SqlDataReader schemaReader = this.sqlCommand.ExecuteReader(CommandBehavior.SchemaOnly);
    DataTable dataTable = schemaReader.GetSchemaTable();

    // Walk the columns in the schema, 
    // and for each data column create an output column and an external metadata column.
    foreach (DataRow row in dataTable.Rows)
    {
        IDTSOutputColumn100 outColumn = output.OutputColumnCollection.New();
        IDTSExternalMetadataColumn100 exColumn = output.ExternalMetadataColumnCollection.New();

        // Set column data type properties.
        bool isLong = false;
        DataType dt = DataRecordTypeToBufferType((Type)row["DataType"]);
        dt = ConvertBufferDataTypeToFitManaged(dt, ref isLong);
        int length = 0;
        int precision = (short)row["NumericPrecision"];
        int scale = (short)row["NumericScale"];
        int codepage = dataTable.Locale.TextInfo.ANSICodePage;

        switch (dt)
        {
            // The length cannot be zero, and the code page property must contain a valid code page.
            case DataType.DT_STR:
            case DataType.DT_TEXT:
                length = precision;
                precision = 0;
                scale = 0;
                break;

            case DataType.DT_WSTR:
                length = precision;
                codepage = 0;
                scale = 0;
                precision = 0;
                break;

            case DataType.DT_BYTES:
                precision = 0;
                scale = 0;
                codepage = 0;
                break;

            case DataType.DT_NUMERIC:
                length = 0;
                codepage = 0;

                if (precision > 38)
                    precision = 38;

                if (scale > 6)
                    scale = 6;
                break;

            case DataType.DT_DECIMAL:
                length = 0;
                precision = 0;
                codepage = 0;
                break;

            default:
                length = 0;
                precision = 0;
                codepage = 0;
                scale = 0;
                break;

        }

        // Set the properties of the output column.
        outColumn.Name = (string)row["ColumnName"];
        outColumn.SetDataTypeProperties(dt, length, precision, scale, codepage);
    }
}
Private sqlCommand As SqlCommand

Private Sub CreateColumnsFromDataTable()

    ' Get the output.
    Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0)

    ' Start clean, and remove the columns from both collections.
    output.OutputColumnCollection.RemoveAll()
    output.ExternalMetadataColumnCollection.RemoveAll()

    Me.sqlCommand = sqlConnection.CreateCommand()
    Me.sqlCommand.CommandType = CommandType.Text
    Me.sqlCommand.CommandText = CStr(ComponentMetaData.CustomPropertyCollection("SqlStatement").Value)

    Dim schemaReader As SqlDataReader = Me.sqlCommand.ExecuteReader(CommandBehavior.SchemaOnly)
    Dim dataTable As DataTable = schemaReader.GetSchemaTable()

    ' Walk the columns in the schema, 
    ' and for each data column create an output column and an external metadata column.
    For Each row As DataRow In dataTable.Rows

        Dim outColumn As IDTSOutputColumn100 = output.OutputColumnCollection.New()
        Dim exColumn As IDTSExternalMetadataColumn100 = output.ExternalMetadataColumnCollection.New()

        ' Set column data type properties.
        Dim isLong As Boolean = False
        Dim dt As DataType = DataRecordTypeToBufferType(CType(row("DataType"), Type))
        dt = ConvertBufferDataTypeToFitManaged(dt, isLong)
        Dim length As Integer = 0
        Dim precision As Integer = CType(row("NumericPrecision"), Short)
        Dim scale As Integer = CType(row("NumericScale"), Short)
        Dim codepage As Integer = dataTable.Locale.TextInfo.ANSICodePage

        Select Case dt

            ' The length cannot be zero, and the code page property must contain a valid code page.
            Case DataType.DT_STR
            Case DataType.DT_TEXT
                length = precision
                precision = 0
                scale = 0

            Case DataType.DT_WSTR
                length = precision
                codepage = 0
                scale = 0
                precision = 0

            Case DataType.DT_BYTES
                precision = 0
                scale = 0
                codepage = 0

            Case DataType.DT_NUMERIC
                length = 0
                codepage = 0

                If precision > 38 Then
                    precision = 38
                End If

                If scale > 6 Then
                    scale = 6
                End If

            Case DataType.DT_DECIMAL
                length = 0
                precision = 0
                codepage = 0

            Case Else
                length = 0
                precision = 0
                codepage = 0
                scale = 0
        End Select

        ' Set the properties of the output column.
        outColumn.Name = CStr(row("ColumnName"))
        outColumn.SetDataTypeProperties(dt, length, precision, scale, codepage)
    Next
End Sub

Bileşen doğrulanıyor

Bir kaynak bileşeni doğrulamak ve, çıktı sütunu derlemeleri içinde tanımlanmış sütunların sütun dış veri kaynağına en uygun olduğunu doğrulayın.Bazı durumlarda, çıktı sütunu karşı dış veri doğrulama kaynak veya bağlantısı kesilmiş durumda uzun yuvarlak gezilerinde sunucuya önlemek için tercih olduğunda gibi olanaksız olabilir.Bu durumda, çıktı sütunları hala kullanılarak doğrulanabilir ExternalMetadataColumnCollection() Çıkış nesnesinin. Daha fazla bilgi için bkz:Bir veri akışı bileşeni doğrulanıyor.

Bu koleksiyon her iki girdi vardır ve çıktı nesneleri ve bunu dış veri kaynağından alınan sütunlar ile doldurabilirsiniz.Bu koleksiyon, çıktı sütunu doğrulamak için kullanabileceğiniz, SSIS Tasarımcı çevrimdışıysa, bileşenin bağlantısı kesildi veya zaman ValidateExternalMetadata() özellik false. Koleksiyon, çıktı sütunu oluşturulan aynı anda önce doldurulması.Dış meta veriler sütunları ekleme koleksiyon dış meta veriler sütun ilk olarak çıktı sütun eşleşmelidir için oldukça kolaydır.Özellikler, veri türü sütun zaten doğru küme olması ve özelliklerini doğrudan kopyalanabilir IDTSExternalMetadataColumn100 nesne.

Aşağıdaki örnek kod, yeni oluşturulan bir çıkış sütun temel alan bir dış meta veriler sütun ekler.Bu, çıktı sütun zaten oluşturulmuş durumda varsayar.

private void CreateExternalMetaDataColumn(IDTSOutput100 output, IDTSOutputColumn100 outputColumn)
{
    
    // Set the properties of the external metadata column.
    IDTSExternalMetadataColumn100 externalColumn = output.ExternalMetadataColumnCollection.New();
    externalColumn.Name = outputColumn.Name;
    externalColumn.Precision = outputColumn.Precision;
    externalColumn.Length = outputColumn.Length;
    externalColumn.DataType = outputColumn.DataType;
    externalColumn.Scale = outputColumn.Scale;

    // Map the external column to the output column.
    outputColumn.ExternalMetadataColumnID = externalColumn.ID;

}
Private Sub CreateExternalMetaDataColumn(ByVal output As IDTSOutput100, ByVal outputColumn As IDTSOutputColumn100)


        ' Set the properties of the external metadata column.
        Dim externalColumn As IDTSExternalMetadataColumn100 = output.ExternalMetadataColumnCollection.New()
        externalColumn.Name = outputColumn.Name
        externalColumn.Precision = outputColumn.Precision
        externalColumn.Length = outputColumn.Length
        externalColumn.DataType = outputColumn.DataType
        externalColumn.Scale = outputColumn.Scale

        ' Map the external column to the output column.
        outputColumn.ExternalMetadataColumnID = externalColumn.ID

    End Sub

saat çalıştırın.

Yürütme sırasında verileri tarafından oluşturulan çıktı arabelleği için satır görev akış ve bu bileşen için sağlanan bileşenler ekleyin. PrimeOutput(Int32, array<Int32[], array<PipelineBuffer[]). Kaynak bileşenler için yöntem bir çıkış arabelleği için her aldıktan sonra denir. IDTSOutput100 Akış yönündeki bir bileşene bağlı bileşenidir.

Arabellekte sütun bulma

Çıkış arabelleği bileşeni için bir bileşen tarafından tanımlanmış bir sütun ve çıktısını akış yönündeki bir bileşen için eklenen herhangi bir sütun içerir.Örneğin, çıktısı ve sonraki bileşeni üç sütundaki bir kaynak bileşeni sağlarsa, bileşeni bu dört sütun içerir kaynağı tarafından kullanılmak koşuluyla, dördüncü bir sütun, çıkış arabelleği çıktı ekler.

Arabellek satırdaki sütunların düzenini dizin çıktı sütununun çıktı sütun koleksiyonunda'de tanımlı değil.Bir çıkış sütun yalnızca doğru bir arabellek satırı kullanarak bulunabilir FindColumnByLineageID(Int32, Int32) yöntem BufferManager(). Bu yöntem bulur sütun Belirtilen arabellekte belirtilen lineage kimlikli ve konumu satır döndürür.Çıktı sütunları, dizinleri genellikle bulunan PreExecute() yöntem ve kullanım sırasında saklanır. PrimeOutput(Int32, array<Int32[], array<PipelineBuffer[]).

Bir arama sırasında aşağıdaki kod örneği çıktı sütunu konumunu çıkış arabellekte bulur PreExecute()ve bir iç yapısı içinde saklar. Sütunun adını da yapıda saklanır ve bu kod örneği için kullanılan PrimeOutput(Int32, array<Int32[], array<PipelineBuffer[]) Bu konunun sonraki kısmında yöntem.

ArrayList columnInformation;

private struct ColumnInfo
{
    public int BufferColumnIndex;
    public string ColumnName;
}

public override void PreExecute()
{
    this.columnInformation = new ArrayList();
    IDTSOutput100 output = ComponentMetaData.OutputCollection[0];

    foreach (IDTSOutputColumn100 col in output.OutputColumnCollection)
    {
        ColumnInfo ci = new ColumnInfo();
        ci.BufferColumnIndex = BufferManager.FindColumnByLineageID(output.Buffer, col.LineageID);
        ci.ColumnName = col.Name;
        columnInformation.Add(ci);
    }
}
Public Overrides Sub PreExecute()

    Me.columnInformation = New ArrayList()
    Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0)

    For Each col As IDTSOutputColumn100 In output.OutputColumnCollection

        Dim ci As ColumnInfo = New ColumnInfo()
        ci.BufferColumnIndex = BufferManager.FindColumnByLineageID(output.Buffer, col.LineageID)
        ci.ColumnName = col.Name
        columnInformation.Add(ci)
    Next
End Sub

Satır işleniyor

Satır için çıkış arabelleği çaðýrarak eklenir AddRow() yöntem arabelleği yeni bir satır, sütun boş değerleri oluşturur. Bileşen, daha sonra için tek tek sütunların değerlerini atar.Bir bileşen için sağlanan çıktı arabelleği oluşturulur ve veri akışı görevi tarafından izlenen.Arabellek satırları, sonraki bileşene kazanmalarından tam olarak taşınır.veri akışı görevi satır hareketini bileşeni geliştiriciler için saydam olduğundan, satır toplu iş iş sonraki bileşene gönderildi belirlemenin bir yolu yoktur ve RowCount() özellik çıktı arabelleği üzerinde her zaman sıfırdır. Bir kaynak bileşeni bittiğinde, çıkış arabelleği için satır eklenmesi, veri akışı görevi çaðýrarak bildirir SetEndOfRowset() yöntem PipelineBuffer, ve kalan satırları arabellekte sonraki bileşene geçirilir.

Kaynak bileşeni, dış veri kaynağından satırlar okur, ancak "Satır okuma" veya "BLOB bayt okuma" performans sayaçlarını çaðýrarak güncelleştirmek isteyebilirsiniz IncrementPipelinePerfCounter(UInt32, UInt32) yöntem. Daha fazla bilgi için bkz:veri akışı altyapısı'nın performansını izleme.

Aşağıdaki kod örneği için bir çıkış arabellekte satır ekleyen bir bileşeni gösterir. PrimeOutput(Int32, array<Int32[], array<PipelineBuffer[]). Arabellekte çıktı sütunları, dizinleri kullanarak bulunamadı PreExecute() Önceki kod örneğinde.

public override void PrimeOutput(int outputs, int[] outputIDs, PipelineBuffer[] buffers)
{
    IDTSOutput100 output = ComponentMetaData.OutputCollection[0];
    PipelineBuffer buffer = buffers[0];

    SqlDataReader dataReader = sqlCommand.ExecuteReader();

    // Loop over the rows in the DataReader, 
    // and add them to the output buffer.
    while (dataReader.Read())
    {
        // Add a row to the output buffer.
        buffer.AddRow();

        for (int x = 0; x < columnInformation.Count; x++)
        {
            ColumnInfo ci = (ColumnInfo)columnInformation[x];
            int ordinal = dataReader.GetOrdinal(ci.ColumnName);

            if (dataReader.IsDBNull(ordinal))
                buffer.SetNull(ci.BufferColumnIndex);
            else
            {
                buffer[ci.BufferColumnIndex] = dataReader[ci.ColumnName];
            }
        }
    }
    buffer.SetEndOfRowset();
}
Public Overrides Sub PrimeOutput(ByVal outputs As Integer, ByVal outputIDs As Integer(), ByVal buffers As PipelineBuffer())

    Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0)
    Dim buffer As PipelineBuffer = buffers(0)

    Dim dataReader As SqlDataReader = sqlCommand.ExecuteReader()

    ' Loop over the rows in the DataReader, 
    ' and add them to the output buffer.
    While (dataReader.Read())

        ' Add a row to the output buffer.
        buffer.AddRow()

        For x As Integer = 0 To columnInformation.Count

            Dim ci As ColumnInfo = CType(columnInformation(x), ColumnInfo)

            Dim ordinal As Integer = dataReader.GetOrdinal(ci.ColumnName)

            If (dataReader.IsDBNull(ordinal)) Then
                buffer.SetNull(ci.BufferColumnIndex)
            Else
                buffer(ci.BufferColumnIndex) = dataReader(ci.ColumnName)

            End If
        Next

    End While

    buffer.SetEndOfRowset()
End Sub

Örnek

Aşağıdaki örnek, Bağlantı Yöneticisi ikili dosyalarıyla içeriğini yüklemek için bir dosya kullanan basit kaynak bileşeni göstermektedir veri akışı.Bu örnek tüm yöntemleri ve bu konuda tartışılan işlevselliği gösteren değil.Bu, önemli yöntemler her özel kaynak bileşeni kılmalıdır ancak Tasarım zamanı doğrulama kodunu içeren gösterir.Bir daha örnek kaynak bileşen için bkz: ADO Source Component Sample.

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

namespace BlobSrc
{
  [DtsPipelineComponent(DisplayName = "BLOB Inserter Source", Description = "Inserts files into the data flow as BLOBs")]
  public class BlobSrc : PipelineComponent
  {
    IDTSConnectionManager100 m_ConnMgr;
    int m_FileNameColumnIndex = -1;
    int m_FileBlobColumnIndex = -1;

    public override void ProvideComponentProperties()
    {
      IDTSOutput100 output = ComponentMetaData.OutputCollection.New();
      output.Name = "BLOB File Inserter Output";

      IDTSOutputColumn100 column = output.OutputColumnCollection.New();
      column.Name = "FileName";
      column.SetDataTypeProperties(DataType.DT_WSTR, 256, 0, 0, 0);

      column = output.OutputColumnCollection.New();
      column.Name = "FileBLOB";
      column.SetDataTypeProperties(DataType.DT_IMAGE, 0, 0, 0, 0);

      IDTSRuntimeConnection100 conn = ComponentMetaData.RuntimeConnectionCollection.New();
      conn.Name = "FileConnection";
    }

    public override void AcquireConnections(object transaction)
    {
      IDTSRuntimeConnection100 conn = ComponentMetaData.RuntimeConnectionCollection[0];
      m_ConnMgr = conn.ConnectionManager;
    }

    public override void ReleaseConnections()
    {
      m_ConnMgr = null;
    }

    public override void PreExecute()
    {
      IDTSOutput100 output = ComponentMetaData.OutputCollection[0];

      m_FileNameColumnIndex = (int)BufferManager.FindColumnByLineageID(output.Buffer, output.OutputColumnCollection[0].LineageID);
      m_FileBlobColumnIndex = (int)BufferManager.FindColumnByLineageID(output.Buffer, output.OutputColumnCollection[1].LineageID);
    }

    public override void PrimeOutput(int outputs, int[] outputIDs, PipelineBuffer[] buffers)
    {
      string strFileName = (string)m_ConnMgr.AcquireConnection(null);

      while (strFileName != null)
      {
        buffers[0].AddRow();

        buffers[0].SetString(m_FileNameColumnIndex, strFileName);

        FileInfo fileInfo = new FileInfo(strFileName);
        byte[] fileData = new byte[fileInfo.Length];
        FileStream fs = new FileStream(strFileName, FileMode.Open, FileAccess.Read, FileShare.Read);
        fs.Read(fileData, 0, fileData.Length);

        buffers[0].AddBlobData(m_FileBlobColumnIndex, fileData);

        strFileName = (string)m_ConnMgr.AcquireConnection(null);
      }

      buffers[0].SetEndOfRowset();
    }
  }
}
Imports System 
Imports System.IO 
Imports Microsoft.SqlServer.Dts.Pipeline 
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper 
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper 
Namespace BlobSrc 

 <DtsPipelineComponent(DisplayName="BLOB Inserter Source", Description="Inserts files into the data flow as BLOBs")> _ 
 Public Class BlobSrc 
 Inherits PipelineComponent 
   Private m_ConnMgr As IDTSConnectionManager100 
   Private m_FileNameColumnIndex As Integer = -1 
   Private m_FileBlobColumnIndex As Integer = -1 

   Public  Overrides Sub ProvideComponentProperties() 
     Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection.New 
     output.Name = "BLOB File Inserter Output" 
     Dim column As IDTSOutputColumn100 = output.OutputColumnCollection.New 
     column.Name = "FileName" 
     column.SetDataTypeProperties(DataType.DT_WSTR, 256, 0, 0, 0) 
     column = output.OutputColumnCollection.New 
     column.Name = "FileBLOB" 
     column.SetDataTypeProperties(DataType.DT_IMAGE, 0, 0, 0, 0) 
     Dim conn As IDTSRuntimeConnection90 = ComponentMetaData.RuntimeConnectionCollection.New 
     conn.Name = "FileConnection" 
   End Sub 

   Public  Overrides Sub AcquireConnections(ByVal transaction As Object) 
     Dim conn As IDTSRuntimeConnection100 = ComponentMetaData.RuntimeConnectionCollection(0) 
     m_ConnMgr = conn.ConnectionManager 
   End Sub 

   Public  Overrides Sub ReleaseConnections() 
     m_ConnMgr = Nothing 
   End Sub 

   Public  Overrides Sub PreExecute() 
     Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection(0) 
     m_FileNameColumnIndex = CType(BufferManager.FindColumnByLineageID(output.Buffer, output.OutputColumnCollection(0).LineageID), Integer) 
     m_FileBlobColumnIndex = CType(BufferManager.FindColumnByLineageID(output.Buffer, output.OutputColumnCollection(1).LineageID), Integer) 
   End Sub 

   Public  Overrides Sub PrimeOutput(ByVal outputs As Integer, ByVal outputIDs As Integer(), ByVal buffers As PipelineBuffer()) 
     Dim strFileName As String = CType(m_ConnMgr.AcquireConnection(Nothing), String) 
     While Not (strFileName Is Nothing) 
       buffers(0).AddRow 
       buffers(0).SetString(m_FileNameColumnIndex, strFileName) 
       Dim fileInfo As FileInfo = New FileInfo(strFileName) 
       Dim fileData(fileInfo.Length) As Byte 
       Dim fs As FileStream = New FileStream(strFileName, FileMode.Open, FileAccess.Read, FileShare.Read) 
       fs.Read(fileData, 0, fileData.Length) 
       buffers(0).AddBlobData(m_FileBlobColumnIndex, fileData) 
       strFileName = CType(m_ConnMgr.AcquireConnection(Nothing), String) 
     End While 
     buffers(0).SetEndOfRowset 
   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.