SqlBulkCopy İle Veri Kopyalama
10 Eylül Cuma, 2010 | Ado.Net Sql /*Yorumlar (0)*/
Excel yada benzeri bir kaynaktan elde ettiğimiz yaklaşık bir milyon kayıt içeren bir DataTable olduğunu düşünelim. Bu kayıtları veritabanında ki x bir tabloya nasıl eklerizinsert?
Tek tek Insert yapmak mı? Bildiğin intihar olur.
DataAdapter ile UpdateGüncelleme yapmak mı? İnanılmaz zahmetli ve gereksiz.(Çalışacağından emin bile değilim)
Biri Bulk Insert mü dedi, işte aradığımız cevap.
Bulk Insert, yüklü miktarda ki verileri herhangi bir tablotableya performanslı bir şekilde eklemek için veri katmanında kullanabileceğimiz bir komuttur. Ado.Net teknolojisi SqlBulkCopy (kısaca sbc diyelim) nesnesi ile bu komutu kolaylıkla kullanmamıza olanak verir.
Tabi kullanımı bu kadar kısıtlamamak gerekir. Sbc ile iki farklı sunucu yada aynı sunucu içinde iki farklı tablo da kopyalanabilir.
Bir örnek ile açıklayalım;
Excel dosyasındaki verileri DataTable nesnesine dolduracağız. Peşinde sbc ile DataTable içindeki verileri örnek bir tabloya ekleyeceğiz.
Örnek Excel dosyası

Hedef tablo

Excel dosyasındaki alanlar ile tablo alanfieldlarını bilerek farklı isimlendirdim. Sbc nesnesinin bir özelliği de bu gibi durumlarda alanları adresleyebilmesidirmapping.
//Excel -> DataTable
string SourceConnStr =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\data.xls;Extended
Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";";
DataTable SourceDT = null;
using (OleDbConnection SourceConn = new OleDbConnection(SourceConnStr))
{
using (OleDbDataAdapter SourceDAP = new OleDbDataAdapter(
"select * from [Contact]", SourceConn))
{
SourceDT = new DataTable("Contact");
SourceDAP.Fill(SourceDT);
}
}
//DataTable -> Sql
using (SqlConnection DestinationConn = new SqlConnection(
"Data Source=.;Initial Catalog=Ordek;Integrated Security=True"))
{
DestinationConn.Open();
using (SqlBulkCopy SBC = new SqlBulkCopy(DestinationConn))
{
//Verilerin kopyalanacağı Tablo Adı
SBC.DestinationTableName = "Kisiler";
//Kaynak ile hedef alanlarının adları farklı ise
//alanları adreslemek gerekir
SBC.ColumnMappings.Add("ContactID", "ID");
SBC.ColumnMappings.Add("FirstName", "Ad");
SBC.ColumnMappings.Add("LastName", "Soyad");
SBC.ColumnMappings.Add("EmailAddress", "Email");
SBC.ColumnMappings.Add("Phone", "Telefon");
//son olarak WriteToServer metotu ile kaynak hedefe kopyalanır
SBC.WriteToServer(SourceDT);
//DataTable dışında DataRow koleksiyonu yada DataReader nesnesi de
//parametre olarak verilebilir.
}
}
Örnek proje.