Makale Özeti

Bu makalemizde ADO.NET 2.0 ile birlikte gelen SqlBulkCopy sınıfını kullanarak çeşitli kaynaklardan SQL Server'ımıza verilerimizi kolay bir şekilde taşımayı inceleyeceğiz.

Makale

                    Çoğu zaman bir yerde bulunan kayıtlarımızı SQL Server’da ki bir tablomuza taşıma ihtiyacı doğmaktadır ve bu işlemleri kodlama yapmadan bazı yollar ile gerçekleştirebiliyorduk. Fakat veri taşıma işlemlerini bir uygulama içerisinde kullanmak istersek eğer bu işler için tasarlanmış bir sınıf bulunmaktadır. Adı SqlBulkCopy. Bu sınıf System.Data.SqlClient ‘ın altında bulunmakdatır. SqlBulkCopy yardımıyla çok büyük verileri hızlı bir şekilde SQL Server’da ki veritabanımıza transfer edebiliriz. SQL’e taşıyacak olduğumuz verilerin kaynağı Excel, Access veya XML dosyaları olabileceği gibi SQL Server’da ki veritabanları arasında veri taşımak istersek yine bu sınıftan yararlanmaktayız.
                  Kaynak olarak kullanacağımız veritabanında bulunan verileri okurken SqlDataReader, OleDbDataReader, DataTable, veya bir DataRow[] dizisini kullanarak verileri alabiliriz.
                  Aşağıda uygulamalarımızda kullandığımız SqlBulkCopy’in çalışma şekli gözükmektedir.

/Makaleler/Resimler/1000002134_mk_2_7.jpg

Şimdi isterseniz bir örnek üzerinden anlatmaya başlayalım. Örneğimizde Access veritabanımızda bulunan bir tablodaki kayıtların tamamını SQL Server’da ki veritabanımızda bulunan tablomuza taşımak istediğimizde aşağıda ki işlemleri yapıyor olacağız.




Artık yukarıda ki kodu çalıştırdığımızda Access’teki verilerimizin SQL Server’da belirttiğimiz tablomuza taşındığını göreceğiz.

Kopyalamak istediğimiz verilerin olduğu Access veritabanı.
/Makaleler/Resimler/1000002134_mk_2_1.jpg

Program çalıştıktan sonraki Access’de ki verilerin SQL Server’a kopyalandığını görüyoruz.
/Makaleler/Resimler/1000002134_mk_2_2.jpg

Şimdi biraz programımızda ki işlemleri inceleyelim. Hedef ve Kaynak veritabanlarının bağlantı bilgilerini tamamladıktan sonra taşıma işlemini yapacak olan nesnemizi tanımlamak için kullandığımız SqlBulkCopy’in özelliklerine bakalım.             

SqlBulkCopy sbc = new SqlBulkCopy(connHedef);
Burada taşıyacak olan nesnemizi tanımladık ve SqlBulkCopy’in 4 aşırı yüklenmiş halinden ilkini kullanarak hedef bağlantımızı  verdik.Bu 4 aşırı yüklenmiş hali ;

1)SqlBulkCopy(SqlConnection)  : Nesnemize hedefdeki veri tabanımızın bağlantısının tanımlandığı nesneyi veriyoruz.
2)
SqlBulkCopy(String) : Verileri taşıyacak olduğumuz hedefin bağlantı bilgilerini string olarak bizden istemektedir.
3)
SqlBulkCopy(String, SqlBulkCopyOptions) : Bu yapıcı metot ilk parametresinde bağlantı bilgisini string olarak , ikinci parametresini  ise SqlBulkCopyOptions tipindeki bir enum değeri istemektedir.Bu enumda ki değerler ;

Default

Bu enum varsayılan değerleri korur

KeepIdentity

Kaynakdan hedefe veri taşırken tablolarımızın identity alanlarını birbirine eşitler.Her şekilde tabloların identity değerleri aynı olur.

CheckConstraints

Kopyalama işlemi yapacak olduğumuz tabloya  enum isminden de anlaşılacağı gibi eğer kısıtlama bulunursa ona göre davranacağını belirtir.

TableLock

Hedeften Kaynağa veriyi taşırken tabloya kilit koyar

KeepNulls

Null değerler üzerinden işlem yapar.Eğer kaynaktan gelecek olan veri null ise bunu hedefdeki tablomuza yansıtarak hedef tablosunun o alana null alanlar için hazırlanan default değeri atanır.

FireTriggers

Veritabanımıza kayıt eklerken ki değer sırasında Trigger tetikler.


4)
SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction) : Son aşırı yüklenmiş halin de ise ilk parametre hedefteki bağlantı bilgimizi, ikinci parametre SqlBulkCopyOptions tipindeki enum değerini alaran son parametresin de ise SqlTransaction tipinden belirtilen nesneyi Transaction ile oluşturur.

Kopyalama işlemini yapacak olan nesnemizi tanımladıktan sonra artık üzerinde işlemler yapabilecek duruma geldiğimizden şimdi nesnemizin özelliklerini inceleyelim. SqlBulkCopy tipinden oluşturduğumuz sbc adındaki nesnemizin kullandığımız özellikleri ve metotları;

  • DestinationTableName  =  Kaynaktan alınan verinin hedefteki hangi tabloya taşınacağını belirttiğimiz property’dir.
  • ColumnMappings  = Bu bir koleksiyondur.Ve içerisinde taşıma işlemin gerçekleşeceği iki kaynak arasındaki verilerin bulunduğu alanların birbirine eşitlemesini sağlar.Örneğimiz de sbc.ColumnMappings.Add("Id", "Id") gibi bir kullanıma gittik.Fakat sbs adındaki nesnemize alanları eşitlerken arka tarafta koleksiyon SqlBulkCopyColumnMapping tipinden bir değer aldığından şöyle bir tanımlamada geçerlidir.

      SqlBulkCopyColumnMapping alanTest = new SqlBulkCopyColumnMapping(1, 1);

      sbc.ColumnMappings.Add(alanTest);

Burada alanTest adında bir nesne yaratılıyor ve daha sonra sbc adındaki taşıma işlemini yapacak olan nesnemizin alanlarını eşitleyen ColumnMappings koleksiyonunun Add() metodu yardımıyla nesnemizi ekliyoruz. alanTest nesnemizin alan parametrelerine bakacak olursak sayısal bir değer verdiğimizi görüyoruz.Burada yapılan Hedefdeki 1 numaralı alanındaki veriyi kaynak tablosunun 1 numaralı alanına taşı demiş oluyoruz.Tablo alanlarını eşitlerken böyle tanımlama yapabiliyoruz.

  • WriteToServer()  = Bu metodunda 4 aşırı yüklenmiş hali bulunmaktadır.Aşırı yüklenmiş hallerinin alabileceği parametreler  DataTable, DataRow[], SqlDataReader ve verilerin olduğu DataTable’dan DataRowState enumda ki seçilen değer doğrultusunda verileri hedef tabloya taşımaktadır. Biz örneğimizde dr adında ki yani OleDbDataReader tipinden bir nesneyi parametre gösterdik  çünkü okuyacak olduğumuz kaynak Access’di.
  • Close()  = Hedef ve kaynak arasında iletişimi sağlayan SqlBulkCopy tipindeki nesnemizin bağlantısını kapatmaktadır.
  • BatchSize = Bu property’i kullanmadık fakat eğer kullansaydık bizden int tipinden bir değer bekleyecekti.Vermiş olduğumuz değer doğrultusunda verileri paketleyerek hedef tablosuna göndermektedir.


Örneğimizde Access’den SQL’e verilerimizi taşımıştık.Peki ozaman eğer taşımak istediğimiz veriler bir Excel dosyasında olsa idi nasıl olacaktı ? . Bur örneğimizde Excel’den SQL’e veri taşıyacağız.İlk olarak Excel dosyamızı tasarlayalım ve içerisine veriler girelim.Aşağıda veritabanı görünümünde bir tasarım görüyorsunuz.Verilerimizi girdikten sonra hepsini seçip Ad Kutusu ‘na buradaki bilgilere ulaşmak istediğimiz tablo adını veriyoruz ve örnekte Öğrenciler diye belirtilmiş olduğunu görüyoruz.
/Makaleler/Resimler/1000002134_mk_2_3.jpg

Ve Excel’deki verilerimizi taşıyacak olduğumuz tablomuzu hazırlıyoruz SQL Server’da.Tablo tasarımı aşağıda gözükmektedir.
/Makaleler/Resimler/1000002134_mk_2_4.jpg

SQL’de ki tablomuzun ogrenciSoyad adındaki alanına eğer Excel dosyasında boş değer gelirse ve bu null değer üzerinden işlem yapıp  kendimiz bu duruma göre değer atamak istersek yukarıdaki düzenlemeyi yapmalıyız.Yukarıda ogrenciSoyad isimli alanın Allow Null özelliğinin işaretli ve Default value’sunun da belirtilmiş olduğunu görüyoruz.Default olarak belirtilen alana Excel’den kayıtları satır satır eklenirken eğer o alan boş ise burada belirtmiş olduğumuz değeri yazacaktır.

Fakat bu işlemi yapabilmek için yani null değerleri yakalayıp bu değerler göre işlem yapabilmek için  SqlBulkCopy ‘in tanımlamasını farklı yapmamız gerekiyor. SqlBulkCopy ‘in aşırı yüklenmiş hallerinden bahsederken belirttiğimiz SqlBulkCopyOptions’in enum’ından değer atamalıyız.Bu işlemleri yapabilmek için aşağıdaki kodları inceleyelim ve çalıştıktan sonraki görüntüsüne beraber bakalım.


                Ve yukarıda ki kodlarımızı çalıştırdığımızda verilerin başarılı bir şekilde Excel’den SQL Server’daki belirtmiş olduğumuz tabloya taşındığını görebiliriz.
/Makaleler/Resimler/1000002134_mk_2_5.jpg

                Excel dosyamızın içeriğini gösteren resime bakacak olursak Arda isminde öğrencinin Soyadının belirtilmediğini görüyoruz.Ve biz eğer Excel’den soyad alanına null değer gelirse default olarak belirttiğimiz değeri yazmasını istediğimizden artık Excel’den gelmiş olan SQL’deki tablomuza baktığımızda Arda isimli öğrencinin Soyad alanında bizim Default Value’muz yazacaktır.SQL’e basit bir sorgu attığımızda sonucu rahatca görebiliriz.

/Makaleler/Resimler/1000002134_mk_2_6.jpg

                Null değerler üzerinden işlemler yapmamızı SqlBulkCopy nesnemizi tanımlarken aşırı yüklenmiş halini kullanarak belirtiyoruz. Ve böylece çeşitli kaynaklardan olabileceği gibi bir Excel veya Access’den gelen  verilerimizi SQL Server’a  nasıl taşıyacağımız gördük.

Bir sonraki yazımızda görüşmek üzere.İyi çalışmalar

Serhat TAŞ

http://www.serhattas.net/