ADO.NET(ActiveX Data Objects.NET) Kullanımı

ADO.NET (ActiveX Data Objects.NET) Microsoft’un bize sağlamış olduğu, veritabanı ile uygulamalarımızı birbirine bağlayan kütüphaneler topluluğudur.Ado.Net ile sadece MSSQL’e değil MS Access veya Oracle SQL’e de bağlanabilir,veritabnınızda ki datalarınızı C# programlama dili kullanarak geliştirdiğiniz projelerinizde gösterebilir,silebilir, güncelleyebilir yada yeni veriler girebilirsiniz.

ADO.NET’e Özel Tanımlar

SqlCommand: Database’imiz içerinde çalıştırdığımız sorguları burada da çalıştırabilmemiz için kullanılacak olan nesnemizdir. ADO.NET dahilinde bulunan iki Command nesnesinden MS-SQL Server için hazırlanmış olanıdır.(Diğer Command nesnesi ‘OleDbCommand’dır ve bu Command nesnesi diğer veritabanı türleri için kullanılır).

 SqlCommand cmd = new SqlCommand($"Insert Into Categories (CategoryName) values ('{txtCategoryName.Text}')", _con);

 

-SqlCommand Metotları

    1. ExecuteNonQuery: Veritabanımızda Insert,Delete ve Update işlemleri yaptığımızda kaç satır etkilendiğini “int” veri tipi halinde almamızı sağlayan metottur.Bu metot sayesinde kullanıcıya bilgilendirici mesaj verebilirsiniz.
       int etkilenenSayi = cmd.ExecuteNonQuery();
       MessageBox.Show($"{etkilenenSayi} satir etkilendi");
    2. ExecuteScalar: Veritabanımızdan sorgu cümlesiyle tek bir değer dönecekse veya birden fazla değer dönüyorsa da dönen sonucun ilk değerini getirir.Örnek olarak bir sorgumuzda özellikle ID’sini belirttiğimiz bir kullanıcı için Select yaparsak,ID değerimiz veritabanımızda Primary Key olduğu için tek kullanıcı belirttiğimiz ID değerine sahiptir ve biz burada tek bir değer döneceğini biliyoruz bu yüzden ExecuteScalar metotunu kullanıyoruz.
       Select Ad from Kullanicilar Where ID=1
    3. ExecuteReader: Veritabanımızdan sorgu cümlesiyle ne kadar değer dönüyorsa bütün değerleri getirir.Örnek olarak Kullanıcılar tablomuzda ki bütün verileri çekmek istediğimizde ExecuteReader metotunu kullanıyoruz.
       select * from kullanicilar

 

SqlConnection: Kullanılacak veritabanı için bağlantımızı sağlayan komuttur.  “Connection String”  yazabilmemiz için bir SqlConnection sınıfından instance almamız gerekmektedir.Kısaca, Çalıştırılacak komutun hangi bağlantı ile kullanılacağını belirler.Bütün veritabanları için yazılmış olan çeşitli Connection String’leri ” https://www.connectionstrings.com ” web sitesinden bulabilirsiniz(Biz ConnectionString için SQL Standart Security’yi Kullanıyoruz).

 SqlConnection _con = new SqlConnection("Server=.;Database=northwnd;User Id=sa;Password = 123;");

 

CommandType: SqlCommand sınıfının CommandType özelliği komut tipini belirlemek için kullanılır.Üç değişik değer alabiliyor(Text, StoredProcedure ve TableDirect).

 command = "exec my_sp";               //text
command = "my_sp";                       //storedprocedure
command = "select * from Tablo1";   //text
command = "Tablo1";                      //tabledirect

 

CommandText: Veritabanımız için çalıştırılacak sorgu cümlemizi CommandText özelliği ile kullanıyoruz.

  SqlCommand myCommand = new SqlCommand("Select ProductName From Products", _con);

 

Parameter: Sorgulara parametre vermek için kullanılan nesnedir.

  cmd.CommandText = "insert_questions @store_result, @store_title, @store_des";
  cmd.Parameters.AddWithValue("@store_result", store_result);
  cmd.Parameters.AddWithValue("@store_title", store_title);
  cmd.Parameters.AddWithValue("@store_des", store_des);

 

ADO.NET ile Veritabanı Bağlantısı

İlk olarak veritabanımıza basit bir şekilde bağlandığımızın kontrolünü yapabileceğimiz bir C#(Windows Forms App) programı yazalım.

 

Formumuza 1 buton ekleyelim ismini “btnVeritabanınaBaglan” olsun.Butonumuzun Click Eventine Tıklayıp “Form1.cs” isimli kod ekranımıza ilk olarak SqlConnection’ımızı tanımlayalım yalnız kullandığı “using System.Data.SqlClient;” isimli kütüphanemiz ekli değilse bize aşağıda ki resmimizde göründüğü gibi bize kendisi eklemeyi önerecek ve SqlConnection’ımızı kullanabileceğiz.

OrtamMedyası1: Kütüphaneyi Ekliyoruz
SqlConnection _con;   //Global Olarak Tanımlıyoruz.

 

OrtamMedyası2: Kütüphanenin Eklenmiş Hali
using System.Data.SqlClient;   //Kütüphanemiz Eklendi.

 

Artık ConnectionString’imizi kullanabiliriz.

OrtamMedyası3: Form Oluşturulduğunda Veritabanımız ile Direk Bağlantıyı Kuruyoruz
  _con = new SqlConnection("Server=.;Database=northwnd;User Id=sa;Password = 123;");

 

Ben Northwind veritabanı üzerinde çalışmak istedim bağlanabilmeniz için öncesinde SQL Server Management içerisine Northwind database’iizin script dosyasını yükleyebilir yada .bak(backUp) dosyası ile de veritabanınızı kurabilirsiniz.(Veritabanları Hakkında Yeni Bir Yazı Gelmek Üzere).

Veritabanınızın tam ismini yukarıdaki komut satırında ki gibi “Database=northwnd;”,veritabanınızın SQLServerAuthentication kullanıcı adınızı “User Id=sa;” şeklinde ve şifrenizi de “Password=123;” şeklinde girerek veritabanınızı sorunsuz bir şekilde projenize bağlayabilirsiniz.(SQLServerManagement problemsiz kurulum hakkında da bir makalemiz de yoldadır.)

OrtamMedyası4: Butonumuza Tıkladığımızda Bağlantımızın Başarılı Bir Şekilde Yapılıp, Yapılmadığının Kontrolü
  if (_con.State==ConnectionState.Closed)
  {
       _con.Open();
       MessageBox.Show("Bağlantı Açıldı");
  }
 else if(_con.State==ConnectionState.Open)
  {
      _con.Close();
      MessageBox.Show("Bağlantı Kapatıldı..!");
  }

btnVeritabanınaBaglan isimli butonumuza tıklandığında eğer veritabanı bağlantıımız kapalı ise açacak ve ekrana mesaj yazdıracaktır, eğer kapılı değil ise bağlantımızın acık olup olmadığını kontrol edecek ve açıksa veritabanı bağlantımızı kapatacaktır ama burada önemli olan nokta “_con.Close()” methodu ile yapılan veritabanı bağlantısı kapatma işleminde ConnectionString’imiz olan veritabanımızın bağlantı için gerekli kullanıcı adı ve şifre gibi bilgileri ram üzerinde tekrar açılabileceğini düşünerek Ram üzerinde saklı tutar ve biz tekrar açmak istediğimizde bu ConnectionString ile veritabanı bağlantımızı açabiliriz.Eğer “_con.Close()” metodu yerine “_con.Dispose();” metodunu kullansaydık ConnectionString’imizi Ram üzerinden silecekti ve tekrardan ConnectionString’imizi oluşturmak zorunda kalacaktık.Aşağıda buna alternatif olarak ConnectionString’imizin yerini değiştirerek çözüm bulabiliriz.

OrtamMedyası5: “_con.Close()” Metodu Yerine “_con.Dispose” Metodu ile Ram’den Veritabanı Bağlantısı İçin Gerekli Bilgileri İşimiz Bittiğinde Siliyoruz
OrtamMedyası6: Sorunsuz Bir Şekilde Veritabanımız ile Bağlantımızı Kurduk
OrtamMedyası7: Sorunsuz Bir Şekilde Veritabanımız ile Bağlantımızı Kestik
  • (SELECT)Şimdi Form’umuza veritabanımızdan ürünleri çekebilmemiz için bir Combobox getirelim ismi “cmbUrunler” olsun ve Form yüklendiği zaman(Form1_Load) veritabanımda ki bütün ürünler Combobox içerisinde listelensin.
OrtamMedyası8: Combobox İçerisine Veritabanından Bütün Ürünleri Form Yüklenirken Çektik
  private void Form1_Load(object sender, EventArgs e)
 {
    SqlCommand cmd = new SqlCommand("Select ProductName From Products", _con);//Veritabanımızda ki hangi tablodan hangi sütun'u çekeceğimizi ve ConnectionString'imiz ile birlikte bağlanacağını belirtiyoruz.
    _con.Open();//ConnectionString'imiz ile bağlantımızı açıyoruz.
    SqlDataReader dr = cmd.ExecuteReader();//Okuma işlemi yapacağımızı ve bu okuma işleminde verilerin hepsini getirmesi gerektiğini "ExecuteReader()" ile belirtiyoruz.
    while (dr.Read())//Birden çok veri geleceğini bildiğimiz için okuma işlemi devam ettiği sürece Combobox'a ekleme yapabilmesi için While döngüsü içerisinde verilerimizi Combobox içerisine ekliyoruz.
    {
       cmbUrunler.Items.Add(dr["ProductName"]);
    }
    _con.Close();//Veritabanı bağlantımızı kapatıyoruz.
 }

 

  • (INSERT)Şimdi veritabanımızda ki kategoriler tablosuna yeni bir kayıt girebilmek için formumuz içerisine bir Textbox ekleyelim ve Textbox içerisine gireceğimiz kategori ismini veritabanındaki kategoriler tablosuna kaydetmesi için bir tetikleyici buton oluşturalım.Textbox’ın ismi “txtCategoryName” olsun ve butonun ismi “btnKategoriEkle” olsun.Tetikleyicimiz buton olduğu için kodları btnKategoriEkle butonunun Click Event’i içerisine yazacağız.
OrtamMedyası9: TextBox İçerisinden Girilen Kategori İsmini Veritabanımız İçerisine Kaydediyoruz(SQL Injection Açığı Var).
private void btnKategoriEkle_Click(object sender, EventArgs e)
 {
     SqlCommand cmd = new SqlCommand("Insert into Categories(CategoryName) Values(" + "'"+txtCategoryName.Text+"'"+")", _con);
     //Yada Yukarıda ki SqlCommand Satırıyla Aynı İşlevi Gören Aşağıda ki Yorum Satırı İçerisinde Bulunan SqlCommand Satırını'da Kullanabilirsiniz.
     /*
     SqlCommand cmd = new SqlCommand($"Insert Into Categories(CategoryName) Values('{txtCategoryName.Text}')", _con);
     */
     _con.Open();//Veritabanı bağlantımızı açıyoruz.
     int etkilenenSatirSayisi = cmd.ExecuteNonQuery();//Veritabanımızda kaç satır verinin bu ekleme işleminin getirdiği değişiklikten etkilendiğini bir değişkene atıyoruz.
     MessageBox.Show($"{etkilenenSatirSayisi} Satır Etkilendi");//Kullanıcıya mesaj olarak değişiklikten etkilenen satırların sayısını gösteriyoruz.
     _con.Close();//Veritabanı bağlantımızı kapatıyoruz.
 }

 

Yalnız yukarıda ki örnekte SQL Injection açığı vardır yani kullanıcıdan Textbox aracılığı ile aldığımız veriyi hiçbir kontrole tabii tutmadan direk veritabanı içerisinde çalıştırdık ve bize bu yüzden açık oluştu.Açığın oluşmaması için kullanıcıdan Textbox aracılığıyla aldığımız veriyi ilk önce bir parametre oluşturarak içerisine atayıp daha sonrasında da bu parametre içerisinde ki veriyi bazı özel algoritmalarla kontrol etmemiz gerekmektedir. Örnek Aşağıdadır.

OrtamMedyası10: TextBox İçerisinden Girilen Kategori İsmini Veritabanımız İçerisine Kaydediyoruz(SQL Injection Açığı Parametreler İle Kontrol Edilebilir).
  • (UPDATE)Şimdi Veritabanımızda ki Kategoriler tablosundaki kategorilerin isimlerini güncelleyelim.Bir tane Combobox ekleyelim mevcut categori isimlerini görebilmek için ve ismi “cmbCategorySec” olsun, yeni kategorinin ismini girebilmek için bir tane TextBox ekleyelim ismi “txtNewCategoryName” olsun ve bu güncelleme olayını tetikleyecek bir buton ekleyelim ismi de “btnGuncelle” olsun.
OrtamMedyası11: Veritabanı İçerisinde ki Kategorileri Güncelle
OrtamMedyası12: Kategori Class’ı Oluşturuyoruz

Biz ilk değiştirmek istediğimiz Kategoriyi Combobox üzerinden seçerken aynı isimde olan başka kategorinin de kayıtlı olabileceğini düşünerek kategorilerin ID’leri üzerinden güncellenme işlemini yapacağız.Bu yüzden bir Class oluşturduk.

OrtamMedyası13: Kategoriler İsminde Bir Metot Oluşturduk Çünkü Bu Metot ile ComboBox İçerisini de Güncellettireceğiz.Methodumuzu Form1_Load ve Butonun Tetiklemesinde Yani 2 Farklı Yerde Çağıracağız
OrtamMedyası14: Güncelleme İşlemimizi Gerçekleştiriyoruz
 private void Form1_Load(object sender, EventArgs e)
 {
   Kategoriler();
 } 
private void btnGuncelle_Click(object sender, EventArgs e)
 {
    Kategori secilenKategori = (Kategori)cmbCategorySec.SelectedItem;
    SqlCommand cmd = new SqlCommand($"update Categories set CategoryName = @katName where CategoryID = {secilenKategori.Id}", _con);
    cmd.Parameters.AddWithValue("@katName", txtNewCategoryName.Text);
    _con.Open();
     int etkilenenSayi = cmd.ExecuteNonQuery();
     MessageBox.Show($"{etkilenenSayi} satir etkilendi");
     _con.Close();
     Kategoriler();
}
 void Kategoriler()
 {
     SqlCommand cmd = new SqlCommand("select categoryid , categoryname from Categories order by CategoryID asc", _con);
     _con.Open();
     SqlDataReader dr = cmd.ExecuteReader();
     cmbCategorySec.Items.Clear();
     while (dr.Read())
      {
         Kategori k = new Kategori();
         k.Id = Convert.ToInt32(dr["categoryid"]);
         k.Ad = dr["categoryname"].ToString();
         cmbCategorySec.Items.Add(k);
      }
     _con.Close();
 }
private class Kategori
 {
     public int Id { get; set; }
     public string Ad { get; set; }
     public override string ToString()
      {
        return Id + " - " + Ad;
       }
 }

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir