SqlBulkCopy Class’ı ile DTS’e Meydan Okuyun

Bazen bir veri kaynağından diğerine binlerce veriyi programınız içerisinde taşıma zorunluluğu doğabilir. Örneğin bir veri tabanında bulunan verileri başka bir veritabanındaki tablonun ilgili sütunlarına atmak isteyebilirsiniz. Bu işlemi yapmak için çeşitli yollardan yararlanabilirsiniz.

Eğer verileriniz 4000-5000 adet ise çok büyük sorunumuz yok. Ufak bi program yazarak bir iki dakika da bu işlemi yapabilirsiniz. Pekii veri adedi 500.000 ise? Ya da 1.000.000?

İşte bu gibi durumlarda Sql Server içerisinde bulunan DTS yapısı kullanılır. Ama başta da dediğim gibi olayı program içerisinden çözmeniz gerekiyorsa size güzel ve en az DTS kadar hızlı bir önerim var. SqlBulkCopy Classı! Bu Classı kullanarak neredeyse DTS kadar hızlı bir veri taşıma kapasitesine sahipsiniz. 500.000 adet veriyi neredeyse 30-40 sn içerisinde taşırsınız.

Kullanım aşağıdaki gibidir…

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient; //EKLEYİNİZ

namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

SqlConnection baglantiKaynak = new SqlConnection(“server=localhost;initial catalog=veritabanı_adı;integrated security=true”);
SqlCommand komut;
private void button1_Click(object sender, EventArgs e)
{
komut = new SqlCommand(“select top 500000 * from tablo”,baglantiKaynak);
if (baglantiKaynak.State == ConnectionState.Closed)
{
baglantiKaynak.Open();
}
SqlDataReader oku = komut.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(oku);
oku.Close();
SqlBulkCopy Kopyala = new SqlBulkCopy(baglantiKaynak);
Kopyala.BulkCopyTimeout = 60;
Kopyala.ColumnMappings.Add(“adi”,”adi”);
Kopyala.ColumnMappings.Add(“dosya_no”,”dosya_no”);
Kopyala.DestinationTableName = “dbo.bulkcopydeneme”;
Kopyala.WriteToServer(dt);
baglantiKaynak.Close();
}

}
}

Burada önemli olan hususlara değinelim…

SqlBulkCopy Kopyala = new SqlBulkCopy(baglantiKaynak);//SqlBulkCopy için yavru değişken türetildi…
Kopyala.BulkCopyTimeout = 60; //İşlemin bitmesi için 60 saniye süre verildi… Siz uzatabilirsiniz…
Kopyala.ColumnMappings.Add(“adi”,”adi”); //kaynak tabloda hangi sütunun hedefteki hangi sütunla bağlanacağı belirlendi…
Kopyala.ColumnMappings.Add(“dosya_no”,”dosya_no”);
Kopyala.DestinationTableName = “dbo.bulkcopydeneme”; //Hedef tablo
Kopyala.WriteToServer(dt); //Veriler gönderildi…

Diğer yazılarımda görüşmek üzere…