SSIS Custom Control Flow Task

6. December 2010

SSIS'in son zamanlarda en sevdiğim özelliği .NET teknolojileriyle geliştirilebilir olması ve kişiselleştirilebilir olması. Eğer biraz programcılık deneyiminiz varsa kendi ihtiyaçlarınıza yönelik kişisel Task'larınızı yaratabilirsiniz. Kaldı ki bu tip taskları tüm projelerinizde defalarca kullanabilir ve keyfini çıkartabilirsiniz.

Çok fazla söze gerek duymadan, bugün herhangi bir dizinin içerisindeki dosya listesini text file olarak yazan bir custom task yaratalım istiyorum. (Başlangıç için MSDN güzel bir yer Adresi: http://msdn.microsoft.com/en-us/library/ms135965.aspx Keza codeplex içerisinde de oldukça fazla örnek bulabilirsiniz: http://www.codeplex.com/MSFTISProdSamples)

 

Öncelikle Visual Studio içerisinde bir Class Library yaratalım.

 

Ardından class1.vb dosyasını FileListerTask.vb olarak yeniden adlandıralım.

 

Hemen Solution Explorer içerisindeki My Project üzerine çift tıklayarak proje özelliklerine giripisim düzenlemesi ve bazı referanslar ekleyelim.

References sekmesine giderek Add düğmesine tıklayalım:

 

Açılan pencereden Microsoft.Sqlserver.Dts.Design ve ManagedDts referanslarını ekleyelim. (Dikkat ben burada 10.0 versiyonu yani ssis 2008 için ekledim.)

 

Ardından references sekmesi şu şekilde görünmeli:

 

Compile sekmesine gelelim ve compile edildiğinde dll'in hangi klasöre yazılacağını belirleyelim:

 

Visual Studio SSIS öğelerini ararken Task objesinde kurulum dizini altındaki DTS\Task klasörüne bakıyor olması. Bizim dll'imizi de register edebilmek için bu klasörün altına koymalıyız. Benim konfigurasyonumda bu klasör aşağıdaki gibiydi:

C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\

Ardından yine aynı sekme içerisinde Task'ımızı build ettiğimizde otomatik olarak Global Assembly Cache'e eklemesi için Build Event girelim:

Açılan pencereden Post-build event command line bölümüne aşağıdaki komutu yazalım:

 

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\Gacutil" /if "$(TargetPath)"

 

Burada gacutil.exe'nin path'i değişebilir. Bu nedenle siz de kendi bilgisayarınızda gacutil.exe'nin absolute path'ini bulup onu yazmalısınız.

 

Ardından son olarak Signing sekmesine gelerek yaratacağımız dll'i güvenli olarak imzalayalım.

 

 

Aşağıdaki basit kod vereceğimiz bir klasör adresindeki tüm dosyaların listesini çıkartıp c:\FileList.txt içerisine yazacaktır:

Imports System

Imports Microsoft.SqlServer.Dts.Runtime

 

<DtsTask(DisplayName:="FileLister", _

TaskType:="ControlFlowTask", _

TaskContact:="FileLister; ssisnedir.com; www.ssisnedir.com", _

RequiredProductLevel:=DTSProductLevel.None)> _

Public Class FileListerTask

Inherits Task

 

Private _GlobalDirPath As String

Private _DirectoryExits As Boolean

 

Public Overrides Sub InitializeTask(ByVal connections As Connections, ByVal variableDispenser As VariableDispenser, ByVal events As IDTSInfoEvents, ByVal log As IDTSLogging, ByVal eventInfos As EventInfos, ByVal logEntryInfos As LogEntryInfos, ByVal refTracker As ObjectReferenceTracker)

Dim paramNames(0) As String

Dim paramTypes() As TypeCode = {TypeCode.Int32}

Dim paramDescriptions(0) As String

 

paramNames(0) = "GlobalDirPath"

paramDescriptions(0) = "The GlobalDirPath."

End Sub

 

 

Public Overrides Function Validate(ByVal connections As Connections, _

ByVal variableDispenser As VariableDispenser, _

ByVal events As IDTSComponentEvents, _

ByVal log As IDTSLogging) As DTSExecResult

 

Try

If Me._GlobalDirPath = "" Then

events.FireError(0, "FileLister", "The GlobalDirPath property must be configured.", "", 0)

Return DTSExecResult.Failure

End If

Return DTSExecResult.Success

Catch exception As System.Exception

events.FireError(0, "FileLister", exception.Message, "", 0)

Return DTSExecResult.Failure

End Try

 

End Function

 

 

Public Overrides Function Execute(ByVal cons As Connections, ByVal vars As VariableDispenser, ByVal events As IDTSComponentEvents, ByVal log As IDTSLogging, ByVal txn As Object) As DTSExecResult

Dim Files As String()

 

Try

If Me._GlobalDirPath = "" Then

events.FireWarning(0, "FileLister", "No Directory specified.", "", 0)

Me._DirectoryExits = False

Else

If System.IO.Directory.Exists(Me._GlobalDirPath) Then

Files = IO.Directory.GetFiles(_GlobalDirPath, "*")

For Each File In Files

WriteNameOfFileToTextFile(File, "c:\FileList.txt")

Next

Me._DirectoryExits = True

Else

Me._DirectoryExits = False

End If

End If

Return DTSExecResult.Success

Catch Ex As System.Exception

events.FireError(0, "FileLister", Ex.Message, "", 0)

Return DTSExecResult.Failure

End Try

 

End Function

Public Overrides ReadOnly Property ExecutionValue() As Object

Get

Return Me._DirectoryExits

End Get

End Property

 

 

Public Property GlobalDirPath() As String

Get

Return Me._GlobalDirPath

End Get

Set(ByVal Value As String)

Me._GlobalDirPath = Value

End Set

End Property

 

 

Public Function WriteNameOfFileToTextFile(ByVal FileName As String, ByVal TextFileToWrite As String) As Boolean

Dim TargetFile As System.IO.StreamWriter = Nothing

 

If System.IO.File.Exists(TextFileToWrite) Then

TargetFile = New System.IO.StreamWriter(TextFileToWrite, True)

Else

TargetFile = New System.IO.StreamWriter(TextFileToWrite, False)

End If

 

TargetFile.WriteLine(FileName)

TargetFile.Flush()

TargetFile.Close()

 

Return True

 

End Function

End Class

 

 

Çok detaya girmememin sebebi, yazacağımız kodun ihtiyaçlarımıza göre şekillenmesidir. Elimizden ne geliyorsa ardımıza koymamak için bir engelimiz yok yani J Parmaklarımıza kuvvet JJJ

 

İstediğimiz kodu yazdıktan sonra Build menüsünden projemizi compile edeceğiz:

 

Daha önce belirlediğimiz Post Build event nedeniyle kodumuz compile olduktan sonra kendisini direkt kullanabilecek durumda olacağız:

Bunun çin yeni bir Visual Studio açıp, yeni bir SSIS Solution'ı açalım.

Ardından yeni bir paket yaratalım ve Tools menüsünden Choose Toolbox Items içerisine girelim:

Tools>> Choose Toolbox Items

 

 

SSIS Control Flow Items içerisine girelim. Bu listede az önce yaratmış olduğumuz FileLister Task'ımızı görüyor olacağız:

 

Seçtiğimizde artık sol tarafta bulunan toolbox içerisinde görebiliyor olacağız.

 

 

Hemen dayanamayıp Control flow içerisine bir adet FileListerTask sürükleyip bırakalım.

 

Gördüğünüz gibi GlobalDirPath ile ilgili olarak kodda belirlediğimiz validasyon kurallarına uygun bir uyarı alıyoruz.

Hemen sağ tarafta bulunan task properties içerisinden GlobalDirPath içerisine c:\Windows yazalım ve paketi çalıştıralım:

 

Bu noktadan sonra task'ın çalışmasıyla birlikte paket içerisinde belirlemiş olduğumuz (kaldı ki bunu da parametrik yapmalıydık, üşengeçlik işte J) c:\FileList.txt'e göz attığımızda kendimizi mutlu addedebiliriz artık J

Çünkü ilk custom task'ımızı az önce başarıyla yazdık ve çalıştırdık JJJJJJ

 

 

Haydi hayırlı traşlar J

Custom Components , ,

Add comment




biuquote
  • Comment
  • Preview
Loading