![]() | |
SqlBulkCopy Sınıfını Kullanarak Veri Transferi | 23.03.2007 10:22:00 |
| Kategori : ADO.NET Özet : Yazılım geliştiricilerin dünyasında, verinin bir yerden başka bir yere aktarılması sıklıkla yapılan bir çalışmadır. Bu makalemizde de, .NET 2.0 ile gelen SqlBulkCopy sınıfını kullanarak; farklı veri kaynaklarından SQL Server veritabanına nasıl veri kopyalanabileceğini göreceğiz. | |
Çalıştığım merkezdeki 6 yıllık milyonlarca verinin bir yerden başka bir yere aktarılması gerekiyordu. Bu sefer alışmış olduğum klasik yöntemler yerine başka bir çözüm aradım. Sonunda.NET 2.0 ile gelen SqlBulkCopy sınıfı ile karşılaştım. İşte bu makalede bu sınıf ile neler yapabileceğimize bir göz atacağız.
Şimdi, herkesin de rahatlıkla uygulayabilmesi için elimizdeki kaynakları da kullanarak bir veritabanı tasarımı yapalım. SQL Server 2005 kurulu tüm bilgisayarlarda bulunan AdventureWorks veritabanındaki Person.Address tablosunu baz alarak 3 yeni tablo yapalım. Aşağıdaki veritabanı diyagramını inceleyerek; tabloları oluşturabilirsiniz. Çok sade, hoş bir tasarım oldu :)
Burada Address_Old ve Address_New tablolarımız aynı eski Address tablosunda olduğu gibi aynı şemaya sahip. Sadece Address_Specific tablosu bunlardan farklılık gösteriyor. Bunun sebebini makalenin ilerleyen bölümlerinde bulabileceksiniz.
SqlBulkCopy, WriteToServer adında veriyi bir kaynaktan hedefteki kaynağa transfer etmek için kullanılan bir instance metot içerir. WriteToServer metodu, DataRow[] dizisinde, DataTable da ve DataReader üzerinde işlem yapabilir. Duruma göre istediğiniz herhangi bir taşıyıcıyı seçebilirsiniz. Bunda bir kısıtlama yok ama birçok durumda olduğu gibi DataReader ı seçmek iyi olur sanırım. Bunun nedeni DataReader yapısından kaynaklanır. DataReader sadece ileri (forward-only) ve salt okunabilir (read-only) çalışır. Herhangi bir şekilde veri tutmasına, bağlamasına gerek yoktur ve işte bu yüzden DataTable ve DataRows[] dan kat kat hızlı çalışır (bu senaryoda). Aşağıdaki kodda kaynak tablomuzdan hedefteki tablomuza veriyi nasıl aktarabileceğimizi görebilirsiniz.
Şimdi burada bahsedilecek birkaç nokta var. Öncelikle, veritabanı tablosundan satırları çekmek için DataReader kullanıyoruz. SqlBulkCopy sınıfı nesnesi bulkCopy, DestinationTableName özelliğine burada Address_New olan tablomuzu set ediyor. Address_New burada hedef tablomuz. Çünkü verileri Address_Old tablosundan, Address_New tablosuna aktaracağız. bulkCopy nesnesi, NotifyAfter özelliği tarafından belirlenen satırlara ulaştıktan sonra SqlRowsCopied olayını da çalıştırıyor. Bunun anlamı da, bu olay NotifyAfter özelliği 1000 olarak ayarlandığından dolayı; her 1000 satırdan sonra SqlRowsCopied olayı çalıştırılacaktır.
Bir önceki örnekte, her iki tablomuzda aynı şemaya sahipti. Fakat bazen, farklı şemalara sahip tablolar arasında da veri transferi yapmak zorunda kalabiliyoruz. Şimdi bir adres tablosu içindeki tüm adres satırlarını ve posta kodlarını, Address_Old tablosu içinden Address_Specific tablosu içine aktarmak istediğimizi varsayalım. Farklı sütun isimlerini sahip oldukları için, dolayısıyla bu iki tablonun şemaları da farklıdır. En başta gördüğümüz veritabanı tasarımını gösteren diyagram resminde de bunu görebiliriz.
Burada ColumnMappings koleksiyonu, kaynak tablo ile hedef tablo arasındaki sütunları belirlemede kullanılır. Veri kaynaklarını sadece veritabanı tabloları ile sınırlayabilir miyiz? Elbette hayır. XML dosyalarını da veri kaynağı olarak kullanabiliriz. Aşağıda, bulk copy işleminde kaynak olarak kullanabileceğimiz; çok basit bir XML dosyası var.
Bu da kaynak kodumuz.
Dosya ilk olarak DataTable içinde okunuyor ve daha sonra SqlBulkCopy sınıfının WriteToServer metoduna aktarılıyor. Yine, hedef tablo olarak, Address_Specific tablosunu seçtiğimiz için ColumnMappings kullanarak sütünları belirliyoruz.
Bu makalede, .NET 2.0 ile birlikte gelen SqlBulkCopy sınıfını nasıl kullanabileceğimizi gördük. SqlBulkCopy sınıfı, bir veri kaynağından SQL Server veritabanına veri transfer etmek istediğimizde; işimizi oldukça kolaylaştırır. Sizde değişik senaryolarla bunu test edebilirsiniz.
Bir sonraki makalelerde görüşmek üzere. İyi çalışmalar... Tayfun AKCAY
| |
Yazgelistir.com | |