Makale Özeti

Merhabalar, Bu yazımızda özellikle .Net platformunun genişletilebilir yapısını kullanarak kendi Ado.Net bileşenimizi yazacağız. Daha sonra bu bileşeni ToolBox a yerleştirip her projede kullanılabilir hale getireceğiz.

Makale

Hemen başlayalım. Visual Studio .Net inizi açın ve bir Windows Application oluşturun adına WinComp yazın. Hemen bu Solition a bir Class Library projesi daha ekleyin adınada AdoComp yazın. “Niye ayrı bir Class Library oluşturduk ?” yada “Windows Application da yapamazmıydık bunu ?” diye bir soru belirdiyse cevabı, Ayrı bir uygulama oluşturarak oluşacak bileşeni diğer uygulamalardan ayırmaktır. Yani bileşenimizi ayrı bir projede oluşturarak başka projelerde kullanılmasını sağladık. Her projenin bir çıktısı olacağını düşünürseniz eğer WinApp da bu bileşenimizi yazsaydık çıktı dosyası exe olacaktı ve bileşenimiz exe ye gömülecekti. Biz bu şekilde bileşenimiz için ayrı bir dll (yani bir assembly) oluşturulmasını sağladık. Bunun diğer avantajıda bu bileşeni ister Vb ile ister başka herhangi bir .Net dili ile yazılmış olan, Windows Form, Web Form, Mobile Form gibi diğer bütün uygulamalarınızda kullanabilmeniz.

 

Amacımız bir Ado.Net bileşeni yazmak ve işlerimizi otomatize etmek. Bileşenimizi adım adım planlayacağız ki her istediğimiz amaca hizmet etsin. İlk önce Sql Server den nasıl veri alınıp bir DataSet e nasıl doldurulduğunu hatırlayalım. Bunun için formunuzun üstüne bir buton ve bir DataGrid yerleştirin. Ve butonun Click olayına aşağıdaki kodları yazın. En yukarıya Using System.Data.SqlClient i eklemeyi unutmayın.

private void button1_Click(object sender, System.EventArgs e)

{

      string ConStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      SqlConnection conn = new SqlConnection(ConStr);

      string sql = "SELECT * FROM Employees";

      SqlDataAdapter da = new SqlDataAdapter(sql,conn);

      DataSet ds = new DataSet();

      da.Fill(ds);

      dataGrid1.DataSource=ds.Tables[0];

}

Yukarıdaki kodların ne yaptığını bildiğinizi kabul ediyorum. Yukarıdaki kodlar Ado.Net ile alakalı.

Şimdi tek tek bu kodlarımızı Classımıza yerleştireceğiz ama ondan önce yarattığımız Classı Windows uygulamamıza Referans olarak ekleyelim. Bunun için Windows uygulamasının References klasörüne sağ tuş tıklayarak Add Reference e tıklayın açılan formdan üçüncü sekmeyi Project sekmesini tıklayın ve bileşeninizin olduğu assembly i referans lara ekleyin.

 

Şimdi sırada bileşenimiz var. En yukarıya System.Data ve System.Data.SqlClient ı Using ile ekleyin. Bu iki Namespace yi eklemezseniz DataSet yada SqlConnection gibi Classları kullanamayız.

 

İki tane değişken tanımlamamız gerekiyor. Bu değişkenleri daha sonra propertyler ile değer verip Connection String i ve Sql cümleciğini alacağız.

 

private string mConnStr;

private string mSql;

 

public string ConnStr{

      get{

            return mConnStr;

      }

      set{

            mConnStr = value;

      }

}

public string Sql{

      get{

            return mSql;

      }

      set{

            mSql = value;

      }

}

 

Propertylerimizi tanımladıktan sonra ilk fonksiyonumuzu yazıyoruz. Bu fonksiyonumuz bize SqlConnection döndürücek. Aşağıdaki kodları Classınıza ekleyin.

public SqlConnection ConnDondur(){

      SqlConnection conn = new SqlConnection(mConnStr);

      return conn;

}

İlk fonksiyonumuz gördüğünüz gibi çok basit. Sadece bir SqlConnection üretip bunu geri döndürüyor. Şimdi bu fonksiyonu az önce DataGridi dolduran formumuzdaki cümlecikle birleştireceğim.

 

Formdaki kodları aşağıdaki gibi düzenleyin.

 

private void button1_Click(object sender, System.EventArgs e)

{

      //string ConStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      //SqlConnection conn = new SqlConnection(ConStr);

 

      AdoComp.AdoComponent comp = new AdoComp.AdoComponent();

      comp.ConnStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      string sql = "SELECT * FROM Employees";

      SqlDataAdapter da = new SqlDataAdapter(sql,comp.ConnDondur());

      DataSet ds = new DataSet();

      da.Fill(ds);

      dataGrid1.DataSource=ds.Tables[0];

}

 

Gördüğünüz gibi ilk önce comp diye kendi bileşenimin bir instancesini oluşturdum. Daha sonra bunun içindeki ConnStr property sine Connection String imi atadım. Sonrada SqlDataAdapter deki Connection parametresine kendi bileşenimdeki ConnDondur fonksiyonunu verdim.

Şimdi sırda bir adım daha atmak var. Bileşenimize SqlDataAdapter döndürteceğiz.

 

Bileşenimize şu fonksiyonu ekleyin.

 

public SqlDataAdapter DaDondur(){

      SqlConnection conn = new SqlConnection(mConnStr);

      SqlDataAdapter da = new SqlDataAdapter(mSql,conn);

      return da;

}

 

Formdaki kodları aşağıdaki gibi tekrar düzenleyin.

 

private void button1_Click(object sender, System.EventArgs e)

{

      //string ConStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      //SqlConnection conn = new SqlConnection(ConStr);

      //string sql = "SELECT * FROM Employees";

      //SqlDataAdapter da = new SqlDataAdapter(sql,comp.ConnDondur());

 

      AdoComp.AdoComponent comp = new AdoComp.AdoComponent();

      comp.ConnStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      comp.Sql = "SELECT * FROM Employees";

      DataSet ds = new DataSet();

      comp.DaDondur().Fill(ds);

      dataGrid1.DataSource=ds.Tables[0];

}

 

Gördüğünüz gibi şimdide bileşenimin Sql propertysini kullanarak Sql cümleciğimi verdim ve bileşenimdeki DaDondur fonksiyonunu geri dönüş değerinin Fill metodunu kullanarak DataSetimi doldurdum.

 

Bir adım daha atarak DataSet bölümünüde Classıma adapte edeceğim. Aşağıdaki fonksiyonu bileşenimize ekleyelim.

 

public DataSet DsDondur(){

      SqlConnection conn = new SqlConnection(mConnStr);

      SqlDataAdapter da = new SqlDataAdapter(mSql,conn);

      DataSet ds = new DataSet();

      da.Fill(ds);

      return ds;

}

 

Şimdi yine formumuzdaki kodu düzenlemek gerekiyor. Kodu aşağıdaki gibi düzenleyin

 

private void button1_Click(object sender, System.EventArgs e)

{

      //string ConStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      //SqlConnection conn = new SqlConnection(ConStr);

      //string sql = "SELECT * FROM Employees";

      //SqlDataAdapter da = new SqlDataAdapter(sql,comp.ConnDondur());

      //DataSet ds = new DataSet();

      //comp.DaDondur().Fill(ds);

 

      AdoComp.AdoComponent comp = new AdoComp.AdoComponent();

      comp.ConnStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      comp.Sql = "SELECT * FROM Employees";

      dataGrid1.DataSource=comp.DsDondur().Tables[0];

}

 

Gördüğünüz gibi Formda artık Ado.Net ile ilgili hiç birşey kalmadı herşeyi benim kodum yapıyor. Hatta isterseniz Formunuzun üstündeki System.Data.SqlClient namespace sini bile kaldırabilirsiniz. Burada adım adım eğer işlemleri yaparsanız bileşenimizin Formdaki kodlara oranla çok daha hızlı çalıştığı dikkatinizi çekmeli.

 

Şimdi bileşenimizi biraz daha geliştirelim. DataSet in yanında birde DataTable döndürmesini sağlayalım. Bileşenimize aşağıdaki kodları ekleyin.

 

public DataTable DtDondur()

{

      SqlConnection conn = new SqlConnection(mConnStr);

      SqlDataAdapter da = new SqlDataAdapter(mSql,conn);

      DataTable dt = new DataTable();

      da.Fill(dt);

      return dt;

}

 

Eğer bu kodlarıda eklediyseniz formumuzdaki kodda şöyle olacak (değişen bölüm sadece DataGrid bölümü olduğu için orayı yazıyorum)

 

dataGrid1.DataSource=comp.DtDondur();

 

Böylece DataSet gibi büyük bir yapı yerine daha küçük olan bir DataTable döndü.

 

Classımızı biraz daha geliştirelim. Diyelimki ben hep aynı Sql Server e bağlanıyorum ve genellikle hep aynı Sql cümlesini kullanıyorum. Öyleyse niye her seferinde bu propertylere değer atayayımki. Bir otomatik yolu olmalı değilmi ? bildiniz var :) bir Classın Kurucu Fonksiyonu. Kurucu fonksiyon Class ın Instancesi oluşturulduğunda otomatik olarak oluşur. Genel amacı Classın içindeki değişkenlere ilk değer vermektir. C# da bir Class ın kurucu fonksiyonu bu Class ın ismi taşıyan fonksiyondur. Aşağıdaki kodları bileşenimizin Class dosyasına ekleyin. (Classımızın isminin AdoComponent olduğunu unutmayın.)

 

public AdoComponent()

{

      mConnStr = "data source=.; initial catalog=Northwind; uid=sa; pwd=sa";

      mSql = "SELECT * FROM Employees";

}

 

Bu koduda yazdıysanız eğer Class ı instanceye çevirdiğinizde bu değişkenlere değerler otomatik olarak atanacak ve kullanıcı eğer değiştirmek isterse Property leri kullanıp değiştirecekler. Hiç değer vermezlerse varsayılan olarak bu değerler kullanılacak. Şimdi formdaki kodların nasıl olması gerektiğine bakalım.

 

private void button1_Click(object sender, System.EventArgs e)

{

      AdoComp.AdoComponent comp = new AdoComp.AdoComponent();

      dataGrid1.DataSource=comp.DtDondur();

}

 

Gördüğünüz gibi sadece nesnemi oluşturuyorum. Nesnemi oluştururken (new ile başlayan bölümde) Classın kurucu fonksiyonu otomatik olarak çalışıp değişkenlere değerleri atıyor. Bende varsayılan değerler ile bileşenimi kullanıyorum.

 

Bu makalede amacımız herhangi bir .Net dili ile yazılmış herhangi bir platformdaki uygulamalarda ortak olarak ve çok sık kullandığımız Ado.Net işlemlerini bir bileşende birleştimekti. Umarım size faydalı olmuştur. Bu uygulamanın kaynak kodlarını buradan indirebilirsiniz. Herhangi bir problemde bana mail yollayabilirsiniz.

 

Levent Cenk Çağlar

cenkc@yazgelistir.com