Kendi DataAdapterimizi yapalım

Kendi DataAdapter’ imizi yapalım

Kendi DataAdapter’imizi Kendimiz Yapalım

 

.NET’ in biz programcılara sunduğu nimetlerden biride hepimizin bildiği gibi DataAdapter’dir. DataAdapter sayesinde veri tabanına zahmetsizce bağlanıp istediğimiz verileri çektikten sonra isteğe göre DataTable’ a veya DataSet’ e vs. doldurup uygulamamızın herhangi bir  yerinde  kullanıcıya gösterebiliriz. Hepimiz takdir ederiz ki DataAdapter sadece bunları yapmakla sınırlı değil. Ancak yaptığı işleri yazmaya kalkarsak makalemizin konusundan uzaklaşmış oluruz. Bu makalemizde biz DataAdapter’ in calışma mantığından biraz bahsedip ondan sonra da kendi DataAdapter’ imizi yapmaya çalışacağız.

 

Bu makale sonunda aşağıdaki başlıklar hakkında genel bir bilginiz olmuş olacak;

1.       DataAdapter’ in çalışma mantığı.

2.       Class Library oluşturma.

3.       Oluşturmuş olduğumuz Class Library’ imizi başka uygulamalarda kullanma.

 

NOT: Bu makalede okuyucuların ADO.NET hakkında genel bir bilgiye sahip olduğu varsayılmıştır.

 

Senaryo:

Bu makalemizde, SQL Server’ ımızdaki veri tabanlarını alan, seçilen veri tabanına göre tablo ve kolonları getiren ve son olarak da kolon içeriklerini getiren bir uygulama yazacağız. Öncelikle DataAdapter’ imizi Class Library şeklinde hazırlayacağız. Daha sonra bu Class Library’ imizi yeni bir uygulama açıp, açmış olduğumuz uygulamamıza referans olarak verip Class Library’ mizi kullanacağız.

NOT: Bu uygulama için ben bu yolu tercih ettim. Arzu edenler sadece tek bir uygulama üzerinde de yapabilirler. Ancak ClassLibrary şeklinde hazırlarsanız başka projelerinizde de kullanabilirsiniz.

 

Class Library’ imizi hazırlıyoruz:

Bunun için öncelikle yeni bir proje açıyoruz ve Class Library’ i seçiyoruz.

 

   

Projemizi açtıktan sonra Classımızın içerisine ‘Fill’ adında, DataTable çeviren, public bir metod yazacağız. (Not: Classımızın en başına using System.Data.SqlClient; ve

using System.Data; yazarsak kodlarken zorluk çekmeyiz.)

 

 

 

 

public DataTable Fill(string yapilacakis, SqlConnection conn, DataTable dt)

                        {

                                   DataColumn dc; //DataTable" imiz icin kolon tanimliyoruz.

                                   DataRow dr; // DataTable" imiz icin satir tanimliyoruz.

 

                                   SqlCommand cmd = new SqlCommand(yapilacakis, conn); // Command nesnemizi tanimliyoruz ve baglantisini sagliyoruz.

 

                                   SqlDataReader rdr; // Okuma islemi icin Reader"imizi tanimliyoruz.

                                   conn.Open();

                                   rdr = cmd.ExecuteReader();

                                   conn.Close(); //Sistem kaynaklari bizim icin onemli o yuzden baglantimizi kapatiyoruz.

 

                                   //Bu dongu icerisinde okuma islemi devam ettikce tablomuzdaki kolonlari aliyoruz ve DataTable" imizin kolonlarina ekliyoruz.

                                   for (int i = 0; i <= rdr.FieldCount - 1; i++)

                                   {

                                               dc = new DataColumn();

                                               dc.ColumnName = rdr.GetName(i);

                                               dc.DataType = rdr.GetFieldType(i);

 

                                               dt.Columns.Add(dc);

                                   }

 

                                   //Burada ise yine okuma islemi boyunca datatable" imiza satir ekliyoruz.

                                   while (rdr.Read())

                                   {

                                               dr = dt.NewRow();

                                               for (int i = 0; i <= rdr.FieldCount - 1; i++)

                                               {

                                                           dr[i] = rdr[i];

                                               }

                                               dt.Rows.Add(dr);

                                   }

 

                                   dt.AcceptChanges(); // Datatable" imizin satirlerinin RowState" lerini sifirliyoruz.

                                   return dt; // Son olarak ise doldurmus oldugumuz DataTable" imizi ceviriyoruz.

 

 

Metodumuzu yazdıktan sonra, projemizi derliyoruz ve dll dosyamızın oluşmasını sağlıyoruz. (Dll dosyasını projenizin dizini içerisindeki ‘bin’à ‘Release’ klasörü içerisinde bulabilirsiniz.)

 

Dll dosyamızı hazırladıktan sonra şimdi sıra yeni bir proje açıp, kendi dataadapterimizle veri tabanından verileri almaya geldi.

 

Yeni proje açıyoruz:

Bunun için yeni bir proje açıyoruz ve formumuza aşağıdaki şekilde görüldüğü gibi tasarlıyoruz. (Tasarım işi birazda kendinize kalmış, istediğiniz gibi tasarım yapabilirsiniz. Burada ben böyle bir tasarım yaptım.)

 

 

Tasarım işinden sonra sıra geldi kod tarafına. Kod tarafına geçip metodlarımızı yazmaya başlıyoruz.

 

Öncelikle SQL Server’ dan veri tabanlarını alan metodumuzu yazıyoruz.

 

    private void GetDatabases()

        {

            SqlCommand cmd = new SqlCommand(); //Command nesnemiz.

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Connection = conn;

            cmd.CommandText = "sp_databases";

 

 

            conn.Open();

            SqlDataReader rdr; // Reader nesnemiz.

            rdr = cmd.ExecuteReader();

            while (rdr.Read())

            {

                listBox1.Items.Add(rdr["DATABASE_NAME"]);

            }

            conn.Close();

            doldumu = true;

        }

 

 

Veri tabanlarımızı aldıktan sonra, seçtiğimiz database’ e ait tabloları getiren metodumuzu yazıyoruz.

 

private void GetTablesbyDatabase()

        {

            string connstring = "server=.;database=" + listBox1.SelectedItem.ToString() + ";Integrated Security=true";

 

            SqlConnection conntable = new SqlConnection(connstring);

            if (doldumu == true)

            {

                listBox2.Items.Clear();

                checkedListBox1.Items.Clear();

                SqlCommand cmd = new SqlCommand();

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Connection = conntable;

                cmd.CommandText = "sp_tables";

                cmd.Parameters.AddWithValue("@TABLE_TYPE", ""TABLE"");

 

                conntable.Open();

                SqlDataReader rdr;

                rdr = cmd.ExecuteReader();

                while (rdr.Read())

                {

                    if (rdr["TABLE_NAME"].ToString() != "sysdiagrams" && rdr["TABLE_NAME"].ToString() != "dtproperties")

                    {

                        listBox2.Items.Add(rdr["TABLE_NAME"]);

                    }

                }

                conntable.Close();

                conntable.Dispose();

            }

        }

 

 

Son olarak da seçmiş olduğumuz tabloya ait kolonları getiren metodumuzu yazıyoruz.

 

private void GetColumnsbyTable()

        {

            string connstring = "server=.;database=" + listBox1.SelectedItem.ToString() + ";" + "Integrated Security=true";

            SqlConnection conntable = new SqlConnection(connstring);

            if (doldumu == true)

            {

                checkedListBox1.Items.Clear();

                SqlCommand cmd = new SqlCommand();

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Connection = conntable;

                cmd.CommandText = "sp_columns";

                cmd.Parameters.AddWithValue("@table_name", listBox2.SelectedItem.ToString());

 

                conntable.Open();

                SqlDataReader rdr;

                rdr = cmd.ExecuteReader();

                while (rdr.Read())

                {

                    checkedListBox1.Items.Add(rdr["COLUMN_NAME"]);

                }

               

                conntable.Close();

                conntable.Dispose();

                tablename = listBox2.SelectedItem.ToString();

            }

        }

 

 

Uygulamamızda kullanacağımız tüm metodlarımız hazır. Sizlere yardımcı olması amacıyla uygulamamızda kullanacağımız kodları toplu halde vermek istiyorum. Tüm kodlar aşağıda olduğu gibidir;

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Data.SqlClient;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using mumyAdaptor;

 

namespace MumyAdapter

{

    public partial class Form1 : Form

    {

        SqlConnection conn = new SqlConnection("Server=.;Database=Northwind;Integrated Security=true");

        bool doldumu;

        string tablename;

 

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            this.GetDatabases();

        }

 

        private void GetDatabases()

        {

            SqlCommand cmd = new SqlCommand(); //Command nesnemiz.

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Connection = conn;

            cmd.CommandText = "sp_databases";

 

 

            conn.Open();

            SqlDataReader rdr; // Reader nesnemiz.

            rdr = cmd.ExecuteReader();

            while (rdr.Read())

            {

                listBox1.Items.Add(rdr["DATABASE_NAME"]);

            }

            conn.Close();

            doldumu = true;

        }

 

        private void GetTablesbyDatabase()

        {

            string connstring = "server=.;database=" + listBox1.SelectedItem.ToString() + ";Integrated Security=true";

 

            SqlConnection conntable = new SqlConnection(connstring);

            if (doldumu == true)

            {

                listBox2.Items.Clear();

                checkedListBox1.Items.Clear();

                SqlCommand cmd = new SqlCommand();

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Connection = conntable;

                cmd.CommandText = "sp_tables";

                cmd.Parameters.AddWithValue("@TABLE_TYPE", ""TABLE"");

 

                conntable.Open();

                SqlDataReader rdr;

                rdr = cmd.ExecuteReader();

                while (rdr.Read())

                {

                    if (rdr["TABLE_NAME"].ToString() != "sysdiagrams" && rdr["TABLE_NAME"].ToString() != "dtproperties")

                    {

                        listBox2.Items.Add(rdr["TABLE_NAME"]);

                    }

                }

                conntable.Close();

                conntable.Dispose();

            }

        }

 

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

        {

            this.GetTablesbyDatabase();

        }

 

        private void GetColumnsbyTable()

        {

            string connstring = "server=.;database=" + listBox1.SelectedItem.ToString() + ";" + "Integrated Security=true";

            SqlConnection conntable = new SqlConnection(connstring);

            if (doldumu == true)

            {

                checkedListBox1.Items.Clear();

                SqlCommand cmd = new SqlCommand();

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Connection = conntable;

                cmd.CommandText = "sp_columns";

                cmd.Parameters.AddWithValue("@table_name", listBox2.SelectedItem.ToString());

 

                conntable.Open();

                SqlDataReader rdr;

                rdr = cmd.ExecuteReader();

                while (rdr.Read())

                {

                    checkedListBox1.Items.Add(rdr["COLUMN_NAME"]);

                }

               

                conntable.Close();

                conntable.Dispose();

                tablename = listBox2.SelectedItem.ToString();

            }

        }

 

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)

        {

            this.GetColumnsbyTable();

        }

 

        private void btnretrieve_Click(object sender, EventArgs e)

        {

            string connstring = "server=.;database=" + listBox1.SelectedItem.ToString() + ";" + "Integrated Security=true";

            SqlConnection connstr = new SqlConnection(connstring);

            if (checkedListBox1.CheckedItems.Count != 0)

            {

                StringBuilder sbstring = new StringBuilder();

                sbstring.Append("SELECT ");

                for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)

                {

                    sbstring.Append(checkedListBox1.CheckedItems[i].ToString());

                    sbstring.Append(", ");

                }

                sbstring.Append(" FROM ");

                sbstring.Append(listBox2.SelectedItem.ToString());

                sbstring.Remove(sbstring.Length - (8 + tablename.Length), 1);

 

                MuammerAdaptor adp = new MuammerAdaptor();

                DataTable dt = new DataTable();

                if (conn.State == ConnectionState.Open)

                {

                    conn.Close();

                }

                dataGridView1.DataSource = adp.Fil(sbstring.ToString(), connstr, dt);

                dt.AcceptChanges();

            }

            else

            {

                MessageBox.Show("Select at least one Column!");

            }

        }

 

        private void btnselectall_Click(object sender, EventArgs e)

        {

            for (int i = 0; i <= checkedListBox1.Items.Count-1; i++)

            {

                checkedListBox1.SetItemChecked(i, true);

            }

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            for (int i = 0; i <= checkedListBox1.Items.Count - 1; i++)

            {

                checkedListBox1.SetItemChecked(i, false);

            }

        }

   }

}

 

 

Tüm yazmamız gereken kodlar işte bu kadar. Artık sizin de kendi DataAdapter’ iniz var. İstediğiniz gibi projelerinizde kullanabilirsiniz. Programımızın çalışır hali şekildeki gibi olacaktır;

 

Bol yazılımlı günler.

 

NOT: Kodlardaki değişken isimlerinin kendi değişken isimlerinizle aynı olmasına dikkat ederek yazarsanız kodlamada sorun yaşamassınız.

Döküman Arama

Başlık :

Kapat