ADO.NET 2

ADO.NET - 2 -

         Yazı dizimizin birinci bölümünde sizlere veritabanlarına nasıl bağlanacağımızdan bahsetmiştim.

 

         İkinci bölümde ise bu bağlantıdan sonra veritabanımızdan verileri çekmek ve işlemek hakkında biraz bilgi vermeye çalışacağım.

 

         Bu işlemler için SqlCommand nesnemize ihtiyacımız vardır ve SqlCommand nesnemiz de SqlConnection nesnemiz gibi System.Data.SqlClient isim alanının altında bulunmaktadır. SqlCommand nesnemizi yaratmak için kod bloğumuza eklememiz gereken kod : SqlCommand cmd = new SqlCommand(); olacaktır.Burada cmd yerine istediğiniz ismi verebilirsiniz. Kullanım ve hatırlama açısından yapacağınız isleme göre isim vermeniz sizin açınızdan daha iyi olacaktır.

 

          Kodlamaya geçmeden önce SqlCommand nesnemizi daha yakından tanıyalım.

 

SqlCommand Nesnesi

 

         SqlCommand nesnesinin birçok özelliği bulunmaktadır. SqlCommand nesnemiz yaratıldıktan sonra aşağıdaki özellikleri kullanabiliriz.

 

Connection : Sql sorgumuzun kullanacağı bağlantının adını belirteceğimiz özelliğidir.

 

CommandType : Sql cümlemizin tipini belirler. Bunlar Text, StoredProcedure ya da TableDirect olabilir.

 

Text : Sql cümlemizi direk olarak yazmamız gerektiği zamanlarda kullanabiliriz.

 

StoredProcedure : Sql cümlemizi Stored Procedure yani saklı yordam şeklinde kullanmamız gerektiğinde kullanabiliriz.

 

TableDirect : Sql cümlesi veya Stored Procedure’ler yerine direk olarak tablo ismi girmemiz gerektiğinde kullanabiliriz.

 

CommandText : CommandType olarak belirttiğimiz Text, StoredProcedure yada TableDirect’ten hangisini belirttiysek CommandText alanına bunun hangisi olduğunu bildirmek zorundayız.

 

CommandTimeout : Sql cümleciğimiz üzerinden bize geri dönecek değerin maksimum dönüş süresini belirler. Eğer bu değerden daha fazla bir süre cevap gelmezse zaman aşımına uğrar. Biz değer belirtmediğimiz zaman varsayılan değer olan 30 değeri atanır. Vereceğimiz değerin saniye cinsinden olduğunu da belirtmek gerekir.

 

Transaction : Sql cümleciğimiz çalışırken bağlantıda kopma, zaman aşımı vs. durumlarda verilerimiz tam olarak iletilemeyebilir. Bu gibi durumlarda hatanın geri dönüşünün yapılabilmesi için gerekli bir özelliktir. Veri kaybını ve farklı yerlerde bulunan istemci makineler arasında farklı verilerin olmasını engeller. Bunu büyük projelerde kullanmanızı öneririm. Genelde kayıt ekleme, silme, güncelleme gibi işlemlerde kullanılır.

 

Buradan sonra yazacağım dört başlık SqlCommand nesnesinin verilerin geri dönüşte kullanacağı metodlarıdır.

 

ExecuteReader : Sql cümleciğimizden bir veya birden çok değer dönecekse bu metodun kullanılması uygundur. Bir değerden kastım en az 2 sütun. Çünkü tek bir satır ve sütun döndüreceksek bunun için de başka bir metodumuz bulunmaktadır. her birini yerine göre kullandığımızda performansımız çok daha iyi olacaktır.

 

ExecuteScalar : Üstteki metodumuzun sonunda bahsettiğim tek satır ve tek sütun döndürüleceği zaman kullanacağımız metodumuzdur.

 

ExecuteNonQuery : Eğer Sql cümleciğimizden geriye bir değer dönmeyecekse yani bir server’a bir parametre gönderdiğimizde bu metodun kullanılması gerekir. Kayıt silme, ekleme, güncelleme gibi işlemlerimizde bu metodu kullanmalıyız.

 

ExecuteXmlReader : Sql cümleciğimizin sonunda eğer bu metodumuzu kullandıysak bir XmlReader nesnesi oluşur ve verilerimiz Xml formatına dönüştürülmüş olur.

 

SqlCommand nesnesinin bir elemanı olmamasına rağmen biraz da Stored Procedure’lerden bahsetmek gerekir. Çünkü biraz sonra programımızı yazmaya başladığımızda kayıt ekleme, kayıt silme ve kayıt güncelleme gibi işlemleri direk olarak Sql cümleciğimiz üzerinden yapmak hem performans kaybı olur hem de ağ trafiğimizi yoğunlaştırır. Bu yüzden biraz da Stored Procedure’lere giriş yapalım.

 

Stored Procedure : Stored Procedure’ün Türkçe karşılığı Saklı Yordam’dır. Saklı yordamların bize faydaları nelerdir, bu faydaları ne şekilde sağlarlar; biraz bundan bahsederek konuya girmiş olalım.

 

Saklı Yordamlarımız veritabanımız üzerinde daha önceden derlenmiş Sql cümlecikleridir. Bunlar daha önceden derlenmiş oldukları için biz saklı yordamlarımıza çağrı yaptığımızda yeniden derlenmeyecekleri için daha önce de bahsettiğim gibi hem ağ trafiğimizi hem de programımızın performansını iyi yönde etkiler. Eğer saklı yordamları kullanmasaydık programımıza bir işlem emri verdiğimizde kodlarımız içerisindeki Sql cümleleri de her işlemde tekrar derlenecektir. Bunu profesyonelce programlama yapan programcıların isteyeceğini pek sanmıyorum.

 

         Saklı yordamları hem Visual Studio içerisinden Server Explorer bölümünden hem de MSSQL üzerinden yazıp derleyebilirsiniz.

 

         Saklı yordamlarımızın genel kod yapısına bakacak olursak ;

 

------------------------------------------------------------------------------

 

create procedure

 

@

@

@

.

.

.

 

as

 

(kolon isimleri)<çıkış parametreleri>(değişkenler)

 

------------------------------------------------------------------------------

 

Bir tane örnek olması amacıyla Saklı Yordam yazalım.

 

         MSSQL in standart veritabanlarında bulunduğu için birinci yazımda olduğu gibi yine Northwind tablosu üzerinde işlem yapacağız.

 

         Yapacağımız işlem : Northwind veritabanının Customers tablosuna yeni müşteri bilgilerini ekleyebileceğimiz bir Saklı Yordam yazmak ve bunun çalışıp çalışmadığını örnek programımızı yaptığımızda program üzerinden test etmek.

 

------------------------------------------------------------------------------

 

create procedure sp_add_customers

 

@CustomerID nchar(5),

@CompanyName nvarchar(40),

@ContactName nvarchar(30),

@ContactTitle nvarchar(30),

@Address nvarchar(60),

@City nvarchar(15),

@Region nvarchar(15),

@PostalCode nvarchar(10),

@Country nvarchar(15),

@Phone nvarchar(24),

@Fax nvarchar(24)

 

as

 

insert into Customers ( CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax )

 

values ( @CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, @Region, @PostalCode, @Country, @Phone, @Fax )

 

------------------------------------------------------------------------------

 

         Evet arkadaşlar Customers tablomuza kayıt eklemek için yazmamız gereken saklı yordam kodlarımızı da belirtmiş olduk. Kodları derlediğinizde Messages bölümünde “The command(s) completed successfully.” yazdıysa her şey tamamdır diyebiliriz. Eğer bu mesajı almazsanız işiniz biraz zorlaşabiliyor bazen. Çünkü çıkan hatalar pek anlaşılır olmuyor. O yüzden Stored Procedure’e yaptırmak istediğinizi bir yere not alıp en baştan yazmaya başlayın.

 

         Biliyorum Saklı Yordam biraz zor gibi gelebilir fakat tam anlamıyla öğrendikten sonra asla vazgeçemeyeceksiniz. Ama yerine göre küçücük bir çağrı yapacaksanız bunu Stored Procedure yerine program kodlarımız üzerinde çıplak bir Sql cümlesi performansınızı daha da arttırabilir. Bu size kalmış “Programcı olan sizsiniz.”

 

         Saklı Yordamlardan da bahsettik. Biraz da uygulamaya geçelim.

 

Bu seferki programcığımızda yapacaklarımız :

 

1-   Daha önceki ufak programcığımızdaki gibi veritabanı bağlantımızın yapılıp yapılmadığını status bar’da göstereceğiz.

2-   Veritabanı bağlantısı yapıp verileri programcığımızda bir datagrid üzerinde göstereceğiz.

3-   Programcığımız üzerinden veritabanımıza kayıt ekleme, kayıt silme, kayıt güncelleme gibi işlemler yapacağız ve bu işlemlerin sonuçlarını tekrar datagrid’imiz üzerinden göreceğiz.

 

Kodları açıklayarak anlatmaya başlayalım ;

 

------------------------------------------------------------------------------

 

private void Form1_Load(object sender, EventArgs e)

        {

            SqlConnection con = new SqlConnection("Data Source = localhost; Initial Catalog = Northwind; Integrated Security = SSPI;");

            toolStripStatusLabel2.Text = "Hoşgeldiniz";

        }

 

------------------------------------------------------------------------------

 

Bu kod bloğumuzun ilk satırı formumuzun Load olayında bir adet ConnectionString’i belirlenmiş SqlConnection nesnesi oluşturduğumuzu belirtiyor. İkinci satırda ise SqlConnection nesnesi oluştuktan sonra StatusStrip üzerinde oluşturduğum toolStripStatusLabel isimli etiketin değerini “Hoşgeldiniz" olarak atamasını gerçekleştiriyor.

 

------------------------------------------------------------------------------

 

private void bağlantıyıAçToolStripMenuItem_Click(object sender, EventArgs e)

        {

            try

            {

                con.Open();

                toolStripStatusLabel2.Text = "Bağlantı Başarılı";

            }

            catch (Exception exp)

            {

                toolStripStatusLabel2.Text = "Bağlantı Başarısız";

            }

            con.Close();

        }

 

------------------------------------------------------------------------------

 

Bu kod bloğunda Bağlantıyı Aç isimli MenuItem’ın Click olayı gerçekleştiğinde con isimli bağlantımızı açtıktan sonra toolStripStatusLabel isimli etiketin değerini “Bağlantı Başarılı” olarak atamayı dene eğer olmazsa olmamasının nedenini yakala ve toolStripStatusLabel etiketinin değerine “Bağlantı Başarısız” değerini ata diyoruz. Bütün bu işlemlerden sonra da try ve catch bloklarından çıkıldığında ilk işlem olarak con isimli bağlantımızın kapatılması emrini veriyoruz.

 

------------------------------------------------------------------------------

 

private void bağlantıyıKapatToolStripMenuItem_Click(object sender, EventArgs e)

        {

            try

            {

                con.Close();

                toolStripStatusLabel2.Text = "Bağlantı Kapatıldı";

            }

            catch (Exception exp)

            {

                toolStripStatusLabel2.Text = "Bağlantı Kapatılamadı";

            }

        }

 

------------------------------------------------------------------------------

 

Burada Bağlantıyı Kapat isimli MenuItem’ın Click olayı gerçekleştiğinde con isimli bağlantıyı kapatıp toolStripStatulLabel’a “Bağlantı Kapatıldı” değerini atamayı denemesini eğer olmazsa neden olmadığına dair hatayı yakaladıktan sonra toolStripStatusLabel’a “Bağlantı Kapatılamadı” değerini ataması emrini veriyoruz. catch bloğunun içerisinde exp isimli istisnamızı istersek bir messageBox içerisinde yazdırabiliriz. Örnek vermek gerekirse ; MessageBox.Show(exp.ToString()); burada yazdığımız .ToString() methodu yakalanan istisna durumunu string tipine çevirmek için kullanılmıştır.

 

------------------------------------------------------------------------------

 

private void dataGridiDoldurToolStripMenuItem_Click(object sender, EventArgs e)

        {

            try

            {

                con.Open();

                SqlDataAdapter da = new SqlDataAdapter("Select * from customers", con);

                DataTable dt = new DataTable("Musteriler");

                da.Fill(dt);

                datagrid.DataSource = dt;

                con.Close();

                toolStripStatusLabel2.Text = "Veriler Ekranda Gösterildi";

            }

            catch (Exception exp)

            {

                toolStripStatusLabel2.Text = "Veriler Bir Hatadan Dolayı Gösterilemiyor";

            }

        }

 

------------------------------------------------------------------------------

 

Burada DataGridiDoldur isimli MenuItem’ın Click olayı gerçekleştiği zaman yapılacak işlemler mevcuttur. Bu kod bloğu için sadece daha önce bahsetmediklerimden bahsedeceğim. SqlDataAdapter nesnemiz bizim veritabanımızdaki nesneleri bizim için alıp getirme görevini üstlenir. Arkasından da bir DataTable nesnesi oluşturup kendi bilgisayarımız üzerinde DataTable nesnemiz için bir alan oluşturduk. da.Fill(dt); ile SqlDataAdapter nesnemize gelen verileri DataTable nesnemizin içine dolduruyoruz. Bir sonraki satırda datagrid’imizin DataSource’u olarak DataTable’ımız içerisine doldurduğumuz verileri gösteriyoruz. Arkasından bağlantı kapatma, durum bildirimi vs. işlemler.

 

------------------------------------------------------------------------------

 

private void btnKayitEkle_Click(object sender, EventArgs e)

        {

            try

            {

                con = new SqlConnection("Data Source = localhost; Initial Catalog = Northwind;Integrated Security = SSPI;");

                con.Open();

                cmd = new SqlCommand("sp_add_customers", con);

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@CustomerID", txtCustomerID.Text.ToString());

                cmd.ExecuteNonQuery();

                con.Close();

                toolStripStatusLabel1.Text = "Kayıt Ekleme Başarılı";

            }

            catch (Exception exp)

            {

                toolStripStatusLabel1.Text = "Kayıt Ekleme Başarısız";

            }

        }

 

------------------------------------------------------------------------------

 

Kayıt ekleme işlemini başka bir form içerisinde yaptırdığımız için o form içerisinde bağlantımızı yeniden tanımlayıp bağlantıyı açıyoruz ve SqlCommand nesnemizi oluşturuyoruz. SqlCommand nesnemize ilk parametre olarak Saklı Yordamımızın ismini tırnak işaretleri arasında veriyoruz ve “,” ile ayırdıktan sonra ikinci parametre olarak bağlantımızın ismini verebiliriz. SqlCommand in Connection özelliğini kullanmak yerine bu daha kullanışlıdır. Arkasından cmd isimli SqlCommand nesnemizin Komut Tipi olarak Stored Procedure çalıştıracağını belirtiyoruz. Bir sonraki satırda cmd isimli SqlCommand nesnemize parametre ekleme işlemi gerçekleştiriyoruz. İlk parametre olarak Saklı Yordamımızdaki değişkenleri veriyoruz. İkinci parametresinde ise txtCustomerID isimli textBox’tan gelen değeri alıp string tipine dönüştürdükten sonra @CustomerID isimli değişkene atıyoruz. SqlCommand ile ilgili yapacağımız son işlem ise Execute etmek. Dökümanın başında belirttiğim ExecuteNonQuery methodunu kullanıyoruz. Arkasından bağlantı kapatma, durum bildirimi vs. işlemler var her zamanki gibi.

 

------------------------------------------------------------------------------

 

private void button1_Click(object sender, EventArgs e)

        {

            try

            {

                DialogResult silinsinmi;

                silinsinmi = MessageBox.Show(txtCustomerID.Text.ToString() + " Silinsin Mi ?", "Silinsin Mi ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (silinsinmi == DialogResult.Yes)

                {

                    SqlConnection con = new SqlConnection("Data Source = localhost;Initial Catalog = Northwind;Integrated Security = SSPI;");

                    con.Open();

                    cmd = new SqlCommand("sp_delete_customers", con);

                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.Add("@CustomerID", txtCustomerID.Text.ToString());

                    cmd.ExecuteNonQuery();

                    con.Close();

                    toolStripStatusLabel1.Text = "Kayıt Başarıyla Silindi";

                    txtCustomerID.Text = "";

                }

                else

                {

                    toolStripStatusLabel1.Text = "Kayıt Silinmekten Vazgeçildi";

                    txtCustomerID.Text = "";

                }

            }

            catch (Exception exp)

            {

                toolStripStatusLabel1.Text = "Kayıt Silinirken Bir Hata Oluştu Ve Kayıt Silinemedi";

                txtCustomerID.Text = "";

            }

        }

 

------------------------------------------------------------------------------

 

Bu kod bloğu biraz karmaşık gibi gözükebilir yeni başlayanlar için fakat açıkladığımda basit olduğunu göreceksiniz. DialogResult bizim için bir geri dönüş değeridir. Bunu kodun birkaç satır aşağısında if ile kontrol ettireceğimiz sırada kullanacağız. Aslında pek önemli gibi gözükmez ama kullanıcı veriyi silmek istediğinde bu kullanıcıyı silmek isteyip istemediğini ona sormamız yerinde olacaktır. DialogResult tipinde ve silinsinmi isminde bir değişken oluşturuyoruz. Bu değişkene atadığımız değer txtCustomerID alanına girilen değerden sonra ”CustomerID Silinsin Mi ?” sorusunu bir MessageBox içerisinde sormak. Burada CustomerID değeri bizim silinmesini istediğimiz kişinin id değeri yazacaktır. Örnek : “ALFKI Silinsin Mi ?”. MessageBox’ımızın iconuna Question icon değerini verdik ve bununla MessageBox’ımızda bir adet Soru işareti icon’unun çıkmasını sağladık. Bir de MessageBox’ımıza Yes ve No olmak üzere iki adet buton koyduk. Bu YesNo değeri bilgisayarınızın diline göre değişir. Standart olarak YesNo olarak geçtiğine bakmayın. Şimdi de bir if kontrolü ile MessageBox üzerinde hangi butona basıldığının değerini alıyoruz. Eğer Yes butonuna tıklandıysa con isminde bir bağlantı oluşturup bu bağlantının ConnectionString’ini ayarladıktan sonra bu bağlantıyı açmasını söyledik. Aslında sonrasında anlatacaklarım da Kayıt ekleme bölümünde yapılanların aynısı. Tek fark Saklı Yordamlar. Aşağıya da kayıt silmek için gerekli olan basit bir Saklı Yordam yazıp dökümanı bitireyim.

 

------------------------------------------------------------------------------

 

create procedure sp_delete_customers

 

@CustomerID nchar(5)

 

as

 

delete from Customers where CustomerID = @CustomerID

 

------------------------------------------------------------------------------

 

Saklı Yordamımızın ismi sp_delete_customers. @CustomerID isimli nchar tipinde ve 5 karakterlik bir değişken tanımladıktan sonra Customers tablosundan CustomerID değeri @CustomerID değişkeniyle eşit olan veriyi silmesini söylüyoruz. Hatırlarsanız @CustomerID değerini SqlCommand nesnemiz ile alıyorduk.

 

Örnek program : http://condoric.t35.com/AdoExample2.rar

 

Doğukan DEMİR

Döküman Arama

Başlık :

Kapat