Makale Özeti

DTS Paketi Oluşturmak ve ASP.NET ile Çalıştırmak - 1 isimli makalede DTS paketi hazırlamak ve ağ üzerinden çalıştırmak ile ilgili bilgileri vermiştim. Bu makalede hazırlanmış DTS paketinin ASP .NET kullanılarak çalıştırılması ile ilgili bilgileri bulacaksınız.

Makale

Bir önceki makalede aşağıdaki senaryoya göre bir DTS paketi üretilmişti:

Senaryo:
Bir şirketin kullanıcılardan verileri belirli bir formatta aldığını ve bu verileri toplu halde veritabanına aktarmak istediğini düşünelim. Dosya formatı olarak Excel’i kullanalım.  Senaryoya göre kullanıcılar bir web uygulaması aracılığıyla Excel formatındaki dosyaları sunucuya yüklüyorlar.  Sunucuya gelen dosyadaki veriler SQL Server’daki DTS paketi çalıştırılarak veritabanındaki ilgili tablolara yerleştiriliyor.

Senaryonun DTS paketi hazırlamak ile ilgili bölümü önceki makalede işlendiğinden sırada bu paketi ASP .NET uygulamasından çalıştırmak için gerekli kodları yazmak var. .NET Framework içinde DTS paketlerine ulaşacak yapılar bulunmadığından bu iş için C:\Program Files\Microsoft SQL Server\80\Tools\Binn adresindeki dtspkg.dll bileşenini kullanacağız. .NET’in managed ortamından Dtspkg.dll COM bileşeninin unmanaged kodlarına ulaşabilmek için bu bileşeni RCW (Runtime Calleble Wrapper) olarak düzenlememiz gerekiyor. Bunun için şu üç işlemi yapacağız:

1. Strong name oluşturulacak
2. Bileşen tlbimp.exe kullanılarak bu strong name ile işaretlenecek   Böylece Dtspkg.dll bileşeni RCW olarak paketlenmiş olacak.
3. Bileşen GAC'a eklenecek

Dtspkg.dll için bir Strong Name Key oluşturalım.



Daha sonra Type Library Importer’ı kullanarak oluşturduğumuz Dtspkg.dll’den RCW’yi oluşturalım.





Oluşturduğumuz Microsoft.SqlServer.DTSPkg80’yi GAC’a ekleyelim.



Artık bu bileşeni .NET kodları içinde DTS paketini çağırmak için kullanabiliriz. Uygulama için bir web projesi açalım ve projenin References bölümüne oluştumuş olduğumuz Microsoft.SqlServer.DTSPkg80.dll’ini ekleyelim. WebForm1’i aşağıdaki gibi oluşturalım ve Microsoft.SqlServer.DTSPkg80’i forma import edelim:



Formdaki Yükle butonunun Click olayını açalım ve aşağıdaki kodları yazalım:

if (FileField1.PostedFile.FileName.Length != 0)
{
    FileField1.PostedFile.SaveAs(@"c:\klasor\UrunStokBildirim.xls");
    PackageClass DtsPackage=new PackageClass();
    object pVarPersistStgOfHost=null;
    DtsPackage.LoadFromSQLServer(   "ELIF",
                                    null,
                                                                      null,
                                    DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection,
                                    null,
                                    null,
                                    null,
                                    "DTSUrunStok",
                                    ref pVarPersistStgOfHost);  
    DtsPackage.GlobalVariables.Item("@Calisan").let_Value(User.Identity.Name.ToString());
    DtsPackage.GlobalVariables.Item("@Donem").let_Value(Calendar1.SelectedDate.ToShortDateString());
    DtsPackage.GlobalVariables.Item("@Aciklama").let_Value(txtAciklama.Text);
    DtsPackage.Execute();

    DtsPackage.UnInitialize();
    DtsPackage=
null;
}

Butona tıklandığında önce FileField1’e bir dosyanın gönderilip gönderilmediği kontrol ediliyor. Eğer bir dosya yüklenmişse sunucudaki c:\klasor\UrunStokBildirim.xls adresine kaydediliyor. Dosyayı sunucuya kaydettiğiniz adresin DTS paketinde Excel bağlantısı için kullandığınız adres olmasına dikkat etmelisiniz aksi halde DTS paketi dosyayı bulamaz.

Dosya yüklendikten sonra DTS paketine ulaşmak için kullanılacak PackageClass nesnesi tanımlanıyor. Bu nesnenin LoadFromSQLServer metodu kullanılarak DTS paketinin bulunduğu SQL Server, DTS paketinin adı ve SQL Server’a bağlanmak için kullanılacak güvenlik bilgileri veriliyor. Bu örnekte Windows hesabı kullanarak bağlanıyoruz, bunun için  DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection parametresini gönderiyoruz.  Burada dikkat etmemiz gereken nokta ASPNET kullanıcısna SQL Server'a bağlanma izni vermektir.  Çünkü uygulama bu hesabı kullanarak DTS paketine ulaşacak. 

Daha sonra DTS paketi içinde tanımlanmış Global Variable’lara değerleri gönderiliyor. Execute metodu kullanılarak paket çalıştırılıyor.

Tüm kodu Try-Catch bloğu içine alırsak kodda meydana gelecek herhangi bir hatayı yakalayabiliriz. Ancak DTS paketi çalıştırıldığında SQL Server’da paketin çalışması sırasında meydana gelebilecek hataları yakalayamayız. Bu hataları yakalamanın yollarından biri DTS adımlarını hatalara karşı tek tek kontrol etmektir. Bunun için DTS paketinin Execute metodu çalıştırıldıktan sonra her adımında hata bulunup bulunmadığına bakılır. Eğer varsa bir Exception fırlatılır. Bunun için DTS paketinin Execute metodundan sonra şu kod eklenmelidir:

foreach(Step Stp in DtsPackage.Steps)
{
     int pErrorCode, pHelpContext;
     string bpstrSource, bpstrDescription, bpstrHelpFile, pbstrIDofInterfaceWithError;
     Stp.GetExecutionErrorInfo( out pErrorCode,
                                 out bpstrSource,
                                 out bpstrDescription,
                                 out bpstrHelpFile,
                                 out pHelpContext,
                                 out pbstrIDofInterfaceWithError
                                 );
 
    if(pErrorCode!=0)
    {
        throw new Exception(
                        " pErrorCode: " + pErrorCode +
                        " bpstrSource: " + bpstrSource +
                        " bpstrDescription: " + bpstrDescription +
                        " bpstrHelpFile: " + bpstrHelpFile +
                        " pHelpContext: " + pHelpContext +
                        " pbstrIDofInterfaceWithError: "+ pbstrIDofInterfaceWithError);
    }
}
DTS paketinde çalışan her adım tek tek foreach döngüsü ile kontrol ediliyor.  Step class'ının GetExecutionErrorInfo metodu kullanılarak eğer varsa hata ile ilgili bilgiler alınıyor.  Böylece dosyanın  veritabanına aktarılamaması durumnda kullanıcıya uyarı verilebilir.  GetExecutionErrorInfo metodundaki pErrorCode parametresi 0'dan farklı bir değer alması DTS paketinin bir hata sebebiyle çalışmadığı anlamına gelir.
Kodun tamamı aşağıdaki gibi oluşturulduktan sonra artık SQL Server'da bulunan DTS paketi web üzerinden gönderilen bir dosya ile çalıştırılabilir. 
try
{
    if (FileField1.PostedFile.FileName.Length != 0)
    {
        FileField1.PostedFile.SaveAs(@"c:\klasor\UrunStokBildirim.xls") ;
        PackageClass DtsPackage=new PackageClass(); 
        object pVarPersistStgOfHost=null; 
        DtsPackage.LoadFromSQLServer(
                                                                       "ELIF",
                                    null,
                                    null,
                                    DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection,

                                    null,    
                                    null,
                                    null,
                                    "DTSUrunStok",
                                    ref pVarPersistStgOfHost);
        DtsPackage.GlobalVariables.Item("@Calisan").let_Value(User.Identity.Name.ToString());
        DtsPackage.GlobalVariables.Item("@Donem").let_Value(Calendar1.SelectedDate.ToShortDateString());
        DtsPackage.GlobalVariables.Item("@Aciklama").let_Value(txtAciklama.Text);    
        DtsPackage.Execute();
        foreach(Step Stp in DtsPackage.Steps)
        {
            int pErrorCode, pHelpContext;
            string bpstrSource, bpstrDescription, bpstrHelpFile, pbstrIDofInterfaceWithError;
            Stp.GetExecutionErrorInfo(
                                    out pErrorCode,
                                    out bpstrSource,
                                    out bpstrDescription,
                                    out bpstrHelpFile,
                                    out pHelpContext,
                                    out pbstrIDofInterfaceWithError
                                    );
            if(pErrorCode!=0)
            {
                throw new Exception(
                                " pErrorCode: " + pErrorCode +
                                " bpstrSource: " + bpstrSource +
                                " bpstrDescription: " + bpstrDescription +
                                " bpstrHelpFile: " + bpstrHelpFile +
                                " pHelpContext: " + pHelpContext +
                                " pbstrIDofInterfaceWithError: "+ pbstrIDofInterfaceWithError);
            }
        }
 
        DtsPackage.UnInitialize();
        DtsPackage=null;
        Response.Write(Message);
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
}