SQL Server-DTS(Data Transformation Services)
// 15 Mayıs 2009 // Delphi, Programlama, Veritabanı
Hep Delphi hep Delphi olmasın dedim, Delphi + SQL Server lı bir makale yazayım. Bu makalem daha bir renkli olacak galiba çünkü dosya upload etmenin yolunu buldum sanırım.En azından deneyeceğim , Screen capture’lı falan anlatacağım.Daha akılda kalıcı olur.Bu makalemizde SQL Server’ın çok akıllı bir servisinden yani DTS’den bahsetmek istiyorum.DTS(Data Transformation Services) SQL Serverı kullanan pek çok programcı arkadaşımızın SQL Server’dan herhangi bir başka kaynağa, yada herhangi bir başka kaynaktan SQL Server’a veri aktarma yollarından bir tanesi ancak en hızlısı. İnanılmaz bir hızda veri aktarımı yapabiliyor.Ben hala şaşırıyorum bu duruma ya neyse. Bulk Insert tabir edilen aktarma metodunu kullanıyor. Şimdi burasının formatını bozmamak adına (ne de olsa bir Delphi blog’undayız) bu DTS olayını biraz Delphi’ce anlatacağım. Yani Delphi’den DTS paketi çalıştırmayı anlatacağım kısaca. DTS paketi ise SQL Server üzerinde sihirbaz yardımı ile tasarlanan bir aktarım işlevinin SQL Server üzerine bir dosya gibi saklanmasıdır. Gelin bunu grafiklerle adım adım anlatalım.
Yukarıdaki resimde DTS sihirbazını nasıl başlatacağımızı görüyoruz.Aslında menüde görünen Export yada Import’un bir anlamı yok.Her ikisinden birisini seçebilirsiniz.Şimdi sihirbazda adım adım ilerleyelim.
Size Import yada Export seçmenizin bir anlamının olmadığını söylemiştim.Bunu söylememdeki amaç ikisininde yukarıdaki ekranı açıyor olmasıydı.Sadece DataSource değişiyor.Bu ekranda veri kaynağını seçiyorsunuz.Biz örneğimizde Northwind database’ini kullanacağız siz istediğiniz database’i kullanabilirsiniz.Bir sonraki ekranımız hedef bilgilerini içerecek.Biz excel’e aktarmak istiyoruz.O yüzden görünümü aşağıdaki gibi yapacağız.
Bu aşamadan sonra bir sonraki adıma geçiyoruz.
Yukarıdaki ekranda bize iki seçenek sunulmuş durumda.Varsayılan olarak gelen seçenk ile ilerleyeceğiz ancak diğerini de kısaca izah etmek isterim.Diğer seçeneği işaretlediğinizde ve ileri dediğinizde aktarım için kullanılacak SQL cümlesini girebileceğiniz bir alanla ve daha da güzeli bir Query Builder ile karşılaşacaksınız.Ancak biz varolan serçenek olan “Copy table(s) and wiev(s) from the source database” seçeneği ile devam ediyor ve ileri tuşuna basıyoruz.
Yukarıdaki ekranda ise aktarım yapmak istediğimiz tabloların yanındaki kutucukları işaretliyoruz.
İşte en önemli ekranımız(bu makale için en önemli ekran). Bu ekrandaki en önemli kısım Save DTS Package yazan yerdir.Varsayılan olarak işaretsiz gelir.Biz işaretliyoruz.Bu ekrandaki diğer kısımların kendilerini ifade ettiklerini düşünüp daha fazla anlatmayı düşünmüyorum.İlerliyoruz…
Yukarıdaki ekranda en önemli kısım ise kırmızı çerçeve içerisindeki DTS adı bölümü.DTS paketimizi çalıştırırken bu ismi kullanacağız.
Oluşturduğumuz paketi yukarıda görüyorsunuz.Bu aşamadan sonra Delphi’ye geçiyoruz.Pek çok programcının hala Delphi 7 kullanıyor olmasından ötürü bende Delphi 7 üzerinden anlatmayı tercih edeceğim.Delphi 7 yi açtıktan sonra Project Menüsünden Import Type Library komutunu veriyoruz.Açılır listede “Microsoft DTSPackage Object Library (Version 2.0) olanı seçip Create Unit button’una basıyoruz.Bu işlem muhtemelen \Imports klasörünüzün altında DTS_TLB.pas isimli bir dosya oluşturacaktır.Bu dosyayı uses DTS_TLB; ile projenize ekleyin.Bu aşamadan sonra işimiz kod kısmına geldi.Kodumuz ise şu şekilde olacak:
procedure TForm1.Button1Click(Sender: TObject); var pkg : Package; ov : OleVariant; EmptyStr : OleVariant; PackageName : String; begin EmptyStr := WideString(''); PackageName := 'Delphiden_Cagiracagimiz_DTS_Paketi'; pkg := coPackage.Create; pkg.LoadFromSQLServer('(local)', 'sa', EmptyStr, 0, EmptyStr, EmptyStr, EmptyStr, WideString(PackageName), ov); pkg.Execute; pkg.UnInitialize; end;
LoadFromSQLServer isimli metod adından da anlaşılabileceği üzere SQL Server üzerinde kayıtlı olan bir DTS paketini yükleme işlevini görür. Paremetreleri, ServerName, ServerUserName, ServerPassword, Flags, PackagePassword, PackageGUID, PackageVersionGUID, PackageName ve yazmakta bile zorlanacağım için yazmadığım son garip parametre. Gerçi sizde Delphi içerisinde fonksiyon üzerinde iken Ctrl + Shift + Space tuşuna basarsanız parametreleri ve tiplerini görebilirsiniz.
İşte bu kadar, aslında direkt kodu da verebilirdim zaten SQL Server kullananlar DTS’in nasıl yapılacağını biliyorlardır diye de düşünebilirdim ama bizim burası her bilgi düzeyinden arkadaşımıza açık olduğu için bilen arkadaşlarımın affına sığınarak biraz fazla detaylı anlatmak durumunda kaldım. Umarım işinize yarar.
Saygılar,sevgiler..
Merhaba,
Toplu veri girişi (Bulk Insert) metodunu ilk gördüğümde bende oldukça şaşırmıştım. Diğer kopyalama yöntemlerine göre gerçekten çok daha hızlı, sanki veriyi blok blok alıp diğer tarafa yapıştırıyor gibi arkasındaki yapıyı bende merak ediyorum.
Makalenize gelince bence çok güzel olmuş elinize sağlık, nacizane benimde eklemek istediğim bir husus var. Delphi ile toplu veri girişi (Bulk Insert) kullanmak için illaki bir DTS paketine ihtiyacınız yok, bunu Delphi içinden SQL komutlarıylada gerçekleştirebilirsiniz. Hatta ben yazdığım küçük bir sınıf ile bu işlemi yapıyorum.Büyük verileri kopyalamakla uğraşan arkadaşların bu konuyu incelemelerini tavsiye ederim.
Merhaba, beğenmenize sevindim. Tabii bulk copy’nin birden fazla yöntemi var. BULK INSERT komutu, yada bcp komut satırı yardımcısı vb. Diğer kullanımlar mesela INSERT INTO … SELECT * FROM … gibi bulk copy gibi çalışmıyor.
Bu arada Selman ile görüşüyor iseniz selamlarımı iletirseniz sevinirim.
Merhaba,
Doğrusu beni hatırlayacağınızı düşünmediğim için bu yönde bir mesaj yazmaktan vazgeçmiştim ama yanıldığıma sevindim.
Selmana selamınızı iletirim elbet, mayıs ayında askerliği sona erdi, şimdi evde keyif yapıyor
Ben Ankara’ya taşındım, olur ya yolunuz bu tarafa düşerse sizi mutlaka ağırlamak, misafir etmek isterim. Sağlıcakla kalın, iyi çalışmalar.
ben araya girip cikicam hemen
zafer , ankara da ikamet edenler icin bi etkinlik vs. duzenlemek lazim. tugrul hocayi da konuk oyuncu olarak cagiririz.
Zafer’e: Hafızam eskisi gibi güçlü değil ama yine de fena sayılmaz Selman’ın dinlenmek hakkıdır tabii biraz, askerlik dönüşü hayata adaptasyon zordur hakikatten. Nadiren de olsa Ankaraya geliyorum, geldiğim zaman ziyaret etmekten memnuniyet duyarım, teşekkürler zafer.
Sadettin’e: İmkanım olursa başımla beraber üstad
var
pkg : Package;
ov : OleVariant;
EmptyStr : OleVariant;
PackageName : String;
begin
EmptyStr := WideString(”);
PackageName := ‘Delphiden_Cagiracagimiz_DTS_Paketi’;
pkg := CoPackage.Create;
pkg.LoadFromSQLServer(‘(local)’,
‘(MKKUL)’,
‘mk’,
0,
EmptyStr,
EmptyStr,
EmptyStr,
WideString(PackageName),
ov);
pkg.Execute;
pkg.UnInitialize;
end;
ben bunu yaptıgımda bana
‘object or class type required’
hatası verıyor yardım edersenız sewınırım
Merhabalar. DTS_TLB.pas dosyasını uses ile eklediniz değil mi ?