Excel'de bulunan verilerimizi zaman zaman SQL Server'a taşımak isteyebiliriz.Bu işlemi hızlı ve güvenli bir şekilde yapmak için kullanacağımız class SqlBulkCopy sınıfıdır.Örnek üzerinden devam edecek olursak bir excel dosyamız var programımızda yüklenirken bu excel'deki bilgiler dataGridView'da listelenecek.Excel -> SQL butonuna basıldığında ise excel'de bulunan verileri SQL server'da oluşturmuş olduğumuz tabloya aktaracağız.
İlk olarak excel dosyamızı oluşturacak olursak.Yapı aşağıdaki gibidir;
1 numaralı satırda tablomuzun alanlarını belirtiyoruz.Burada 4 adet alan bulunmaktadır.Verilerimizi girdikten sonra bu tüm alanları seçip Ad Kutusu diye adlandırılan alan yani Calisanlar dediğimizi alana bu seçmiş olduğumuz tablo adını girmemiz gerekiyor.Biz örneğimizce Calisanlar diyip Enter'a bastık.Artık elimizde 4 alanlı Calisanlar isminde Excel'de bulunan bir tablomuz var.
Burada bulunan bilgileri SQL Server'a aktaracağımızda orada da buradaki ile aynı yapıya sahip bir tablo oluşturmamız gerekiyor. Excel'de oluşturduğumuz şekilde birbirine denk gelmesi için aynı tablo yapısını oluşturuyoruz.
Artık Excel tablomuza karşılık gelen SQL Server'da bir tablo bulunmaktadır. Şimdi bizim yapacağımız bu excel'deki verileri oluşturmuş olduğumuz Sql Server'a taşımak.Örneğimizin arayüzü aşağıdaki gibidir ;
Excel -> SQL butonuna basıldığında dataGrid'de gözüken bilgiler oluşturmuş olduğumuz SQL tablomuza gidecektir !
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.OleDb;
using System.Data.SqlClient;
namespace Ornek13
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//form yüklendiğinde excel dosyasına bağlanıp bilgileri okuduktan sonra dataGridView'da listeliyoruz.
void ExcelDosyaOku()
{
OleDbConnection con = new OleDbConnection(@"Provider = Microsoft.Jet.OleDb.4.0 ; Data Source = C:\CalisanlarExcel.xls ; Extended Properties = Excel 8.0");
//excel dosyasını oluşturup tüm alanları seçtikten sonra vermiş olduğumuz isimi yani Calisanlar bilgisini burada sorgumuzda belirtiyoruz.
OleDbCommand cmd = new OleDbCommand("select * from Calisanlar", con);
OleDbDataAdapter da = new OleDbDataAdapter(cmd.CommandText, con.ConnectionString);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
}
private void Form1_Load(object sender, EventArgs e)
{
//yukarıdaki listeleme metodunu çağırıyoruz.
ExcelDosyaOku();
}
//Excel'deki verileri SQL'e taşıyacak olan işlemler
private void btnBilgileriTasi_Click(object sender, EventArgs e)
{
//Excel dosya bilgileri için bağlantı,command ve dataReader nesnelerini oluşturuyoruz.Tüm bilgileri okuyup OleDbDataReader nesnemize atıyoruz.
OleDbConnection conExcel = new OleDbConnection(@"Provider = Microsoft.Jet.OLEDB.4.0 ; Data source= C:\CalisanlarExcel.xls ; Extended Properties = Excel 8.0");
OleDbCommand cmdExcel = new OleDbCommand("Select * from Calisanlar", conExcel);
conExcel.Open();
OleDbDataReader dr = cmdExcel.ExecuteReader();
//sql tablo bilgileri
SqlConnection conSQL = new SqlConnection("data source=. ; database=Calisanlar; integrated security=true");
//taşıma işlemini yapacak olan nesnemiz.Parametre olarak kopyalanacak olan hedefin connection bilgilerini veriyoruz.
SqlBulkCopy sbc = new SqlBulkCopy(conSQL);
//Sql'e taşınacak olan tablonun adı . Server'da oluşturduğumuz tablo adı
sbc.DestinationTableName = "CalisanlarTablo";
//SqlBulkCopy nesnesine excel ve sql server tablolarını birbirine eşitlememiz için SqlBulkCopyColumnMapping sıfınından oluşturduğumuz nesneye parametre olarak ilk alana kaynak tablo adını ikinci parametre olarakte hedef tablo adını verip daha sonra SqlBulkCopy sıfından oluşturmuş olduğumuz sbc nesnesinin ColumnMappings 'i ile add diyip eklemek için tanımladığımız SqlBulkCopyColumnMapping nesnesini veriyoruz.Uzun bir yoldur.
SqlBulkCopyColumnMapping sbccm = new SqlBulkCopyColumnMapping("ID", "id");
sbc.ColumnMappings.Add(sbccm);
//yukarıdaki uzun yolu kullanmak yerine bu yolu kullanarak direk Add diyip ilk parametreye kaynak tablo adını ikinci parametreye de hedef yani taşınacak olan tablo adını vererek tabloları belirleyebiliriz.
sbc.ColumnMappings.Add("Ad", "ad");
sbc.ColumnMappings.Add("Soyad", "soyad");
sbc.ColumnMappings.Add("Cinsiyet", "cinsiyet");
//Bu işlemleri yapmamız için hedef tablo bağlantımız yani SQL bağlantımızı açıyoruz.
conSQL.Open();
//SqlBulkCopy nesnemizin WriteToServer metodu yukarıda ki excel'de bulunan verileri barındıran OleDbDataReader türündeki dr isimli nesneyi parametre vererek sql'e excel'den okuduğu verileri yazmasını sağlıyoruz.
sbc.WriteToServer(dr);
//yazma işlemi tamamlandığında OleDbDataReader,SqlBulkCopy, Excel dosya connection'unu ve sql bağlantılarını kaptarak işlemimiz tamamlıyoruz.
dr.Close();
sbc.Close();
conExcel.Close();
conSQL.Close();
}
}
}
Sql tablomuza sorgu atarak sonuca bakacak olursakta Excel tablosunda bulunan tüm bilgilerin SQL Server'da oluşturduğumuz tabloya aktarıldığı görülüyor.
SqlBulkCopy örneğini indir
Faydalı olması dileğiyle iyi çalışmalar herkese :)
Serhat TAŞ