Recordset Destination ve Object Variable Yazma Okuma ile Dataflow Task’lar Arası Veri Aktarımı

6. December 2010

Basit dizayn gerektiren SSIS paketleri içerisinde en az kullanılan şeylerden biri de değişkenlerdir. Bu değişkenler arasından çoğu kişinin kullanmadığı ama aslında oldukça önemli bir işleve sahip olan değişkenlerden tiperinden biri ise Obje tip değişkenlerdir. Bu değişken tipi mvcut pipeline içerisinde bir dizi halinde verileri tutabilirler ve genelde programlama ile az çok uğraşmış olan kişilerin anlayacağı dille ifade etmek gerekirse Object Variable = Datareader nesnesi gibi davranır.

SSIS ile dts'in en büyük farkı bildiğiniz üzere SSIS'in buffer ve memory temelli bir yapıya sahip olmasıdır. Dolayısıyla eskiden DTS paketlerinde olduğu gibi veri result seti ile ilgili ikincil bir işlem için mevcut pipeline'ı herhangi bir tabloya persist ettirmek gerekiyordu. Ancak SSIS buffer'lar halinde veriyi tuttuğundan istediğiniz gibi bu veriyi dataflow içerisinde kullanabilmektesiniz. Ancak bu veriyi dataflow içerisinde kullandıktan sonra diğer bir Dataflow içerisine nasıl yollayacaksınız? Bunu sağlamak için memory'de oluşturduğunuz result set'i object variable içerisine kusup, onu diğer dataflow'lar içerisinde de kullanabilirsiniz.

Dilerseniz fazla gevelemeden direkt örneklerle açıklamaya çalışayım.

OBJECT VARIABLE VERİ YAZMA

Öncelikle paketimize bir object tipli değişken tanımlayalım.

 

Ardından bu değişkenin içerisindeki veriyi ilk dataflow'da dolduralım. Bunu gerçekleştirmek için dataflow içerisine bir adet OLEDB Data Source ve bir adet de RecordSet Destination koyalım.

 

Datasource tanımlamasını yaptıktan sonra Recordset destination içerisini açarak yaratmış olduğumuz objvar isimli değişkenimizi Recordset Destination içerisinde tanımlayalım.

 

Bu tanımlamanın ardından Input Columns kısmına gelerek değişkenimizde hangi pipeline kolonlarını kullanacağımızı belirleyelim.

 

Bu işlemi tamamladıktan sonra yeni bir dataflow oluşturalım ve içerisinde Script Component atalım ve açılan ekranda Source olarak tipini seçelim.

 

Tipini seçtikten sonra özelliklerine girelim ve output kolonları tanımlayalım. (Burada tanımlarken dikkatli olun veritipleri konusunda.)

 

Output kolon tnaımlamasını tamamlandıktan sonra script'i yazmaya başlamadan önce script içerisinde kullanacağımız değişkenimizi belirlememiz gerekiyor.

(Dikkat değişken isimleri Case Sensitive'dir.)

 

Bu işlem de tamamlandıktan sonra kodu ekranına girebiliriz. Kodu yazmaya başlamadan önce kod içerisinde kullanacağımız bir referansı etklememiz lazım. Bunun için Script Editor'de Project menüsünden Add Reference seçilir.

SYSTEM.xml.dll bulunur ve eklenir.

Ardından kodu yazmaya geçebiliriz:

 

' Microsoft SQL Server Integration Services user script component

' This is your new script component in Microsoft Visual Basic .NET

' ScriptMain is the entrypoint class for script components

 

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

Imports System.Xml

Imports System.Data.OleDb

 

 

Public Class ScriptMain

Inherits UserComponent

 

Public Overrides Sub CreateNewOutputRows()

Dim oleDA As New OleDbDataAdapter

Dim dt As New DataTable

Dim col As DataColumn

Dim row As DataRow

Dim sMsg As String

Dim CurrencyKeyOrdinal As Integer

Dim CurrencyAlternateKeyOrdinal As Integer

Dim CurrencyNameOrdinal As Integer

 

 

oleDA.Fill(dt, Variables.objVar)

 

CurrencyKeyOrdinal = dt.Columns("CurrencyKey").Ordinal

CurrencyAlternateKeyOrdinal = dt.Columns("CurrencyAlternateKey").Ordinal

CurrencyNameOrdinal = dt.Columns("CurrencyName").Ordinal

 

 

For Each row In dt.Rows

Output0Buffer.AddRow()

Output0Buffer.varCurrencyKey = CInt(row(CurrencyKeyOrdinal).ToString())

Output0Buffer.varCurrencyAlternateKey = row(CurrencyAlternateKeyOrdinal).ToString()

Output0Buffer.varCurrencyName = row(CurrencyNameOrdinal).ToString()

Next

 

Output0Buffer.EndOfRowset()

End Sub

 

Kodda yapılanı kısaca anlatmak gerekirse OLEDB Dataadapter nesnesinin fill komutu ile datatablosunu mevcutta bulunan object tipi değişkenin değerleriyle doldurduktan sonra datatable'ın tüm satırlarını for each ile dönüp output buffer'ımızdaki alanlarla eşleştiriyoruz.

İşlem bittikten sonra da Output0Buffer.EndOfRowset() ile daha fazla satır gelmeyeceğini söyledikten sonra paketimiz çalışmaya hazır oluyor.

 

Paketimizi çalıştırdığımızda bir önceki dataflow içerisinden gelen verilerin diğer dataflow'un pipeline'ı içerisinde göründüğünü görebiliriz.

 

 

(Inspired by Andy Leonard's and blog entry (Thanks): http://sqlblog.com/blogs/andy_leonard/archive/2007/10/14/ssis-design-pattern-read-a-dataset-from-variable-in-a-script-task.aspx (cross referenced by Jamie Thomsons blog entry too))

Dataflow Components, Sources,Destinations , ,

Add comment




biuquote
  • Comment
  • Preview
Loading