Excel – SQL Veritabanı Senkronizasyonu

Pek çok şahıs, firma veya program kullanıcı etkileşimine açık veri tabanı işlemlerini, güvenliği sağlamak için excel gibi kullanımı kolay ve esnek veri tabanları üzerinde yapar. Örneğin bir anket ya da bir iş ilanı için başvuran kişinin cevaplaması gereken soruların yanıtlarının saklanması gibi…

Hal böyle olunca, işlemleri yürütecek uygulamalar için iki farklı tür veritabanı üzerinde işlem yapılması gerekmektedir. Bunun sağlanabilmesi için de Excel ve SQL veritabanının birbirine senkron olarak şekillendirilmesi gerekmektedir.

Senkronizasyondan kasıt nedir ?

Excel’de yer alan data field’lardan alınan tüm değerler string tipindedir. Uygulama tarafında bu tipler, içeriğine uygun olarak cast edilmeli ve veritabanındaki ilgili tablonun ilgili attribute’une o şekilde gönderilmelidir. Okunan değerin içeriği ve niteliğine göre (burda kastedilen değişken tipi : int, bool, text..) uygulamada cast edilmesi ve veritabanında da, okunan değerin içeriğine ve niteliğine göre bir attribute oluşturulması, EXCEL ile SQL Veritabanının senkronizasyonuna bir örnektir.

Bunun dışında elbette ki Veritabanı tasarıma uygun olarak bir Excel veritabanı şekillendirilmesi önemlidir. Örneğin Veritabanında oluşturuılmuş bir Person entitysinde bulunmayan Address attribute’unun , Excel dosyasında var olmasının hiç bir mantığı yoktur.

Yukarıda bahsettiklerim gibi tasarımsal senkronizasyonlar tamamlandıktan sonra, artık sql veritabanınıza excel kayıtlarını bir tık ile aktarabilmek için yapılması gereken tek şey, excel kayıtlarını sql için anlamlı hale çevirecek bir ara uygulama yazmak olacaktır.

Bu noktada bir kaç konu önceki bir yazıda bahsettiğim ODBC ile Veritabanı bağlantısı konusu oldukça işinizi görecek.

Eğer ODBC kullanmaz isek, Excel veritabanı bağlantısı için gereken tüm anahtarları bilmemiz, sheet ve page’ler ve book’lar tanımlamamız gerekecek. Bunlardan kaçınmak ve sade ve anlaşılır bir uygulama oluşturmak için, ODBC kullanıyoruz.

Not : Veritabanları üzerinde ODBC driver bağlantısı oluşturma adımlarından “SQL to ODBC Bağlantı Altyapısı Taşıma Projesi”  isimli yazıda daha önce bahsetmiştim.

C# ile ODBC veritabanı driver’ına bağlanmak için yapılması gerekenlere de >>buradan<< ulaşabilirsiniz…

Tüm bunları yaptığımızı varsayarak, kısa bir örnek kod üzerinden devam ediyorum…


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.IO;

namespace EXCELtoDB
{
 public partial class Form1 : Form
 {
 DataAccessLogicODBC.DataAccessLogicODBC dam; // ODBC baglanti adimlarini gerceklestiren Class Libraryden bir nesne turetiliyor...

//Siz burada paylastigim linkteki adimlari izleyerek bir baglanti olusturmalisiniz...
 public Form1()
 {
 InitializeComponent();
 }

private void button1_Click(object sender, EventArgs e)
{

DataTable dt1 = new DataTable();

Goster goster;

&nbsp;

dam = new DataAccessLogicODBC.DataAccessLogicODBC("dsn=xls"); // Tanimlanan Class Library nesnesine bir baglanti ataniyor.. "dsn = xls"  ifadesi odbc'nin alacagi connection stringdir.

// Execute Script komutu icerisinde bir command tanimlaniyor. CommandType olarak text seciliyor ve command dogrudan fonksiyona text olarak gonderiliyor. Daha sonra fonksiyon icinde command calistiriliyor, sorgudan donen kayitlar bir Datatable a aktarilarak return ediliyor.

dt1 = dam.ExecuteScript("Select * from [General$A4:C120]");

//Burada da return edilen datatable, localde tanimlanmis dt1 Datatable'ına ataniyor.

&nbsp;

//Dikkat: [General$A4:C120]  => Command icerisindeki FROM komutunda yer alan bu ifadeyi parse edip aciklayayim,

//[General --> Excel tablolarindan hangisi uzerinde sorgu yapmak istediginizi belirtir. SQL'deki tablolar Exceldeki Sheet'ler gibidir. Burada Sheet islem yapilacak sheet'in adi General imis.

//$A4:C120] --> İslem yapilacak sheet'in hangi satir ve sutun numarasi arasinda sizin icin anlamli oldugunu belirtiyor. Bu ornek icin sorgular A4 hucresi ile C120 hucresinin icerisinde kalan dortgende bulunan hucreler icin uygulanacak.

&nbsp;

&nbsp;

goster = new Goster(dt1, id,"1");

//Bu kisimda da excel dosyasindan gelen verileri bir listview'da gosterecek ve daha sonra da SQL database'ine aktaracak olan "Goster" formundan yeni bir nesne olusturuluyor ve excel veritabani uzerinde yapilan sorgunun sonucunun tutuldugu dataTable bu forma gonderiliyor..

}
 }
}

Buraya kadar yapılan işlemler ile, excel ile yarattığımız veritabanına bağlandık, üzerinde bir sorgu calıştırdık ve sorgu sonuçlarını bir dataTable a aktardık.

Şimdi bu dataTable i parametre olarak gönderdiğimiz “Goster” formunda neler oluyor buna bakalım..

Yapacağımız işlemler:

– Sorgudan dönen datatable i bir listView’da listeletmek.

– Dönen sonucları SQL Veritanabına yazmak.


private void Goster_Load(object sender, EventArgs e)
 {
 dm = new DataAccessLogicODBC.DataAccessLogicODBC("dsn=IsGorusmeleri"); // MSSQL Veritabanina baglaniliyor. (Yine ODBC üzerinden)
// Listview yapilandiriliyor...
 listView1.Columns.Add("#").Width = 25;
 listView1.Columns.Add("Name").Width = 80;
 listView1.Columns.Add("Password").Width = 100;
 listView1.Columns.Add("E-Mail").Width = 160;
 for (int i = 0; i < dt.Rows.Count; i++)//Degerler listview'a yazilmaya basliyor.
 {
 listView1.Items.Add((i+1).ToString());
 for (int j = 0; j < dt.Columns.Count; j++)
 {
 listView1.Items[i].SubItems.Add(dt.Rows[i][j].ToString());
 veri[j] = dt.Rows[i][j].ToString();
 }
 if (veri[2] != "")
 {
 dm.ExecuteNonScript("insert into GeneralAnswers (ID,SoruID,SType,Answer) values ('" + id + "','" + veri[0] + "','" + type + "','" + veri[2] + "')");
//Verinin anlamli olmasi durumunda text tipinde sql query ile bir command oluşturulup, veri bilgileriyle doldurularak oluşturduğumuz dm ODBC baglantisi uzerinden execute ediliyor...
//Ve islem sonlaniyor.
 }
 }

 }

Böylelikle EXCEL ile hazırlanmış bir veritabanından istediğimiz workbookun istediğimiz sheet’indeki istediğimiz veriyi alıp, oluşturduğumuz başka bir MSSQL Veritabanına yazdık. Bu tarz bir işlem söz konusu olduğunda ODBC kullanmak oldukça kritik bir seçimdir. Projenin okunabilirliği ve uyarlanabilirliğinin artması açısından oldukça önemli bir etmendir.

Eğer ki farklı veritabanlarının paralel işlenmesi gibi işlemler içeren bir proje tasarlanacaksa veya projenin sahip olduğu mevcut veritabanı yapısı, zaman içinde ihtiyaçların değişmesi ile değişikliğe uğrayacaksa (Örneğin excel veritabanında tutulan verilerin çok büyümesi ile kontrolü zorlaşabilir ve bu nedenle MSSQL Veritabanına aktarılması düşünülebilir. Böyle bir durumda SQLConnection üzerinden oluşturulmuş bir projenin uyarlanması da zaman alacaktır.) projede mutlaka ODBC Data Driver’ları ile veritabanı bağlantısı tanımlanmalıdır. Böylelikle bir değişiklik olduğunda, entity ve attributelerin birebir oluşturulması durumunda yapılması gereken tek işlem, taşınan yeni veritabanı için bir ODBC Data Driver oluşturmak ve veritabanı bağlantısını sağlayan connection stringi bu yeni driver’a göre düzenlemek olacaktır.

ODBC’nin dezavantajı nedir ?

ODBC, tüm veritabanları için farklı driverlar içermektedir. Veri iletişimi de bu driverlar üzerinden sağlanmaktadır. Bu noktada güvenilirlik ve maliyet (işlem maliyeti) konusunda birkaç sorun baş gösterebilir. Her ne kadar Microsoft, ODBC driverları üzerinden yapılan veri iletişimi konusunda veri güvenliğini garanti etse de, veritabanından çıktıktan sonra, veritabanında veri güvenliği için aldığınız tüm önlemler anlamsız kalacaktır.

Bir diğer dezavantaj da işlem maliyetinin yükselmesidir. Doğrudan veritabanı erişiminin yapılmaması, erişimin bir driver üzerinden gerçekleştirilmesi, küçük çaplı veritabanları için çok bir şey değiştirmese de, veritabanının büyümesi ile maliyet ve response time açısından sıkıntılar doğuracaktır.

Bu noktada uygulamanın veritabanı hareketliliğine göre; yapılması gereken, veritabanı yöneticisi ve yazılım uzmanının ortak kararı ile belirlenmelidir.

2 Responses to Excel – SQL Veritabanı Senkronizasyonu

  1. mahmut can diyor ki:

    excel tek L ile yazılır.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: