Ö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
|