Share via


Özel kaynak Bileşen geliştirme

SQL Server Integration Services gives developers the ability to write source components that can connect to custom data sources and supply data from those sources to other components in a data flow task.Özel kaynakları oluşturma yeteneği, var olan biri kullanılarak erişilemez durumda veri kaynaklarına bağlandığınız zaman değerli Integration Services kaynakları.

Bir veya daha fazla çıkış verir ve sıfır girdi kaynağı bileşenleri vardır.Tasarım sırasında saat, kaynak bileşenleri oluşturmak ve bağlantıları yapılandırmak için kullanılan sütun meta veriler dış veri kaynağından okumak ve dış veri kaynağını temel kaynağının çıktı sütunları yapılandırma.Yürütme sırasında bunlar dış veri kaynağına bağlanmak kaynak ve bir çıkış arabelleği için satır ekleyin.veri akışı görevi sonra bu arabellek veri satır aşağı akım bileşenleri sağlar.

Kaynak bileşen örneği için bkz: Integration Services örnekleri üzerinde Codeplex.Genel bir bakış için veri akışı bileşeni geliştirme, bkz: Bir özel veri akışı Bileşen geliştirme.

Tasarım zamanı

Tasarım - uygulamasaat bir kaynak bileşeni işlevselliği ekleme veri kaynağı yansıtacak çıktı sütunları yapılandırma ve bileşen çalıştırmaya hazır olduğunu doğrulayarak bir dış veri kaynağına bir bağlantı belirten kapsar.Tanım olarak, sıfır girdileri ve bir veya daha fazla zaman uyumsuz çıkışlarına bir kaynak bileşeni vardır.

Bileşeni oluşturma

Kaynak bileşenleri kullanarak dış veri kaynaklarına bağlanmak ConnectionManager nesnelerin tanımlanmış bir paket.Bağlantı Yöneticisi için kendi gereksinimi için bir öğe ekleyerek geldikleri RuntimeConnectionCollection koleksiyon , ComponentMetaData özellik.Bu koleksiyon iki amaca hizmet eder — yöneticileriyle bağlantı başvurularını saklamak için paket bileşen ve tasarımcı için bir Bağlantı Yöneticisi ihtiyacını bildirmek için kullanılır.Zaman bir IDTSRuntimeConnection100 eklenmiştir koleksiyon, Gelişmiş Düzenleyici görüntüler Bağlantı özelliklerini sekmesinde, paket içinde bir bağlantı oluşturun veya seçin sağlar.

Aşağıdaki kod örneği uygulaması gösterir ProvideComponentProperties , bir çıktı ekler ve ekler bir IDTSRuntimeConnection100 itiraz 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 kaynağına bağlanma

Bir bağlantı için eklendikten sonra RuntimeConnectionCollection, geçersiz kılma, AcquireConnections yöntem bağlantısı için dış veri kaynak.Hem tasarım hem de yürütme sırasında bu yöntem çaðrýlýr saat.Bileşen çalışma tarafından belirtilen Bağlantı Yöneticisi bağlantısısaat , bağlantı ve daha sonra dış veri kaynağına.

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

Aşağıdaki kod örneği, bir ado bağlayan bir bileşeni gösterir.Ağ Bağlantısı'nda AcquireConnections 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

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

Çıktı sütunu bir kaynak bileşeni yürütme sırasında veri akışı bileşeni ekler dış veri kaynağından sütunları onlarda.Tasarım sırasında saat, bileşeni bir dış veri kaynağına bağlanmak için yapılandırıldıktan sonra çıktı sütunları ekleyin.Tasarım -saat bir bileşeni kendi çıktı koleksiyonuna sütunlar değişir eklemek için kullandığı yöntem sırasında eklenmedi rağmen bileşen gereksinimlerini temel alarak Validate veya AcquireConnections.Örneğin, bileşen için veri küme denetleyen bir özel özellik bir sql deyim içeren bir bileşen sırasında kendi çıktı sütunları ekleyebilir SetComponentProperty yöntem.Bileşen, önbelleğe alınmış bir bağlantısı olan ve varsa, verilere bağlanır mı, bakar kaynak ve kendi çıktı sütunu oluşturur.

Sonra bir çıkış sütun olmuştur, oluşturulan çağırarak veri türü özelliklerini küme SetDataTypeProperties yöntem.Bu yöntem gereklidir çünkü DataType, Length, Precision, ve CodePage salt okunur özellikler ve her özellik diğer ayarlarına bağımlıdır.Bu yöntem olması için bu değerleri gereksinimini zorlar küme sürekli olarak, veri akışı görevi olmadıklarını doğrular ve küme doğru.

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 SSIS veri türü çalışırken yönetilen türler.Temel sınıf üç yardımcı yöntemler sağlar ConvertBufferDataTypeToFitManaged, BufferTypeToDataRecordType, ve DataRecordTypeToBufferType, yönetilen bileşen geliştiriciler seçerek size yardımcı olmak için 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.

Aşağıdaki kod örneği gösterir nasıl çıktı sütun bir bileşenin koleksiyonu doldurulan bir tablo şemasını temel alan.Yardımcı sınıfının yöntemleri temel veri türünü ayarlamak için kullanılan sütun, ve bağımlı özellikler veri türüne göre 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 onun çıktı sütunu koleksiyonları içinde tanımlanmış sütunların sütun dış veri kaynağı adresindeki eşleştiğini doğrulayın.Bazı durumlarda, dış verileri karşı çıktı sütunları doğrulama kaynak bağlantısı kesilmiş veya uzun sunucu olmaması tercih edilir gibi olanaksız olabilir.Bu durumda, çıktı sütunları hala kullanılarak doğrulanabilir ExternalMetadataColumnCollection Çıkış nesne.Daha fazla bilgi için bkz: Bir veri akışı bileşeni doğrulanıyor.

Bu koleksiyon nesnelerinde giriş ve çıkış var ve dış verileri sütunlar ile doldurabilir kaynak.Bu koleksiyon, çıktı sütunları doğrulamak için kullanabileceğiniz, SSIS Tasarımcısı çevrimdışı, bileşen bağlantısı kesilmiş veya zaman ValidateExternalMetadata özellik false.Koleksiyonun ilk aynı anda doldurulması saat çıktı sütunları oluşturulan.Dış meta veriler ekleme sütuns koleksiyonu için görece kolay çünkü dış meta veriler sütun başlangıçta çıktısına sütun.Sütun veri türü özelliklerini zaten doğru küme ve özelliklerini doğrudan kopyalanabilir IDTSExternalMetadataColumn100 nesne.

Aşağıdaki örnek kodu bir dış meta veriler ekler sütun yeni oluşturulan bir çıktı alarak sütun.Onu varsayar çıktı sütun zaten oluşturuldu.

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

Çalışma zamanı

Yürütme sırasında bileşenleri tarafından oluşturulan arabellekleri çıktısını almak için satır ekleme veri akışı görevi ve bileşen için sağlanan PrimeOutput.Kaynak bileşenleri için yöntem çıkış arabelleği her biri için alınca adlı IDTSOutput100 bileşenin bağlı olan akış aşağı bir bileşen.

Sütunları arabellekte bulma

Bir bileşen için çıkış arabelleği bileşen tarafından tanımlanmış sütunlar ve eklenen bir aşağı akım bileşeni çıktısına sütunlar içerir.Örneğin, bir kaynak bileşen çıktısı ve sonraki bileşene üç sütun sağlıyorsa, dördüncü bileşen kaynak olarak kullanmak için bu dört sütun içerir sağlanan çıkış arabelleği sütun çıktı ekler.

Arabellek satır sütunların sırasını çıktı sütununun çıktı sütun dizini tarafından tanımlanan koleksiyon.Bir çıkış sütun yalnızca doğru bir arabellek satırda kullanarak bulunabilir FindColumnByLineageID yöntem, BufferManager.Bu yöntem, belirtilen arabellek sütun belirtilen lineage kodlu bulur ve konumunda satır değerini verir.Çıktı sütunları dizinler genellikle yer PreExecute yöntem ve kullanım sırasında saklı PrimeOutput.

Bir arama sırasında çıkış arabellekte aşağıdaki kod örneği çıktı sütunları konumunu bulur PreExecuteve bir iç yapısı. saklarAdı sütun de yapısında depolanır ve kod örneği için kullanılan PrimeOutput yöntem sonraki bölümünde bu konuda.

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ırlar eklenebilir için çıkış arabelleği çağırarak AddRow yöntem, boş değerler içeren yeni bir arabellek satır oluştururkendi sütun. Bileşen daha sonra için tek tek sütunların değerlerini atar.Bir bileşen için sağlanan çıkış arabelleği oluşturulur ve veri akışı görevi tarafından izlenir.Tam olduklarında, arabellek satırları sonraki bileşene taşınır.veri akışı görevi tarafından satır hareketini bileşen geliştiriciler için saydam olduğu için ne zaman satır toplu iş iş sonraki bileşene gönderilip gönderilmediğini belirlemek için bir yolu yoktur ve RowCount özellik ise her zaman sıfır çıktı arabelleği.Bir kaynak bileşeni bitirdiğinde kendi çıktı arabelleği için satır ekleme, veri akışı görevi çağırarak bildirir SetEndOfRowset yöntem, PipelineBuffer, ve kalan arabellek satırları geçirilen sonraki bileşen.

Kaynak bileşeni bir dış veri kaynağından satırları okur iken "satırları okumak" güncelleştirmek isteyebilirsiniz ya da "blob bayt okuma" performans sayaçları çağırarak IncrementPipelinePerfCounter yöntem.Daha fazla bilgi için bkz: Veri akışı altyapısı performansını izleme.

Aşağıdaki kod örneği bir çıkış arabelleği için satır ekleyen bir bileşeni gösterir PrimeOutput.Çıktı sütunları arabellekte dizinleri kullanarak bulunduğu PreExecute önceki kod örneği.

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 bir kaynak bileşeni gösterir veri akışı.Bu örnek, tüm yöntemleri ve bu konuda tartışılan işlevselliğini göstermektedir.Her özel kaynak bileşeni geçersiz kılmak gerekir, ancak Tasarım - kodunu içeren önemli yöntemler gösterilmiştirsaat doğrulama.Görmek için daha eksiksiz bir örnek kaynak bileşeni, Readme_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 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.