C# ADO.NET

C# ADO.NET

C# ADO.NET Parametreli Islemler

Ado.NET giriş konulu yazımızda ExecuteScalar, ExecuteNonQuery ve ExecuteReader konularını yazmaya çalıştık.  Bu sefer Insert işlemini parametreli olarak yapmaya çalışacağız. Aşağıdaki gibi bir form tasarımımız var.

2 adet groupBox’ımız var baştaki groupBox’ın içine ID, UrunAd, Fiyat ve Kategorisini göstermek için labellar ve textboxlar ekliyoruz. Kategori kısmını seçmek için combobox ekliyoruz 1 adet’te yeni kayıtlar için kaydet butonu koyuyoruz. Alttaki groupBox’a ise listeleme işlemini göstermek için listview ekliyoruz.

FormUrun

Form tasarımı işleminden sonra kodlama kısmına geçiyoruz. Öncelikle bağlantı cümlemizi yazıyoruz.

SqlConnection baglan = new SqlConnection(“Server=.;Initial Catalog=Northwind;Integrated Security=true”);

Ürünleri getir adında bir metot oluşturuyoruz.

void UrünleriGetir()
{
listView1.Items.Clear();
SqlCommand cmd = new SqlCommand("Select c.categoryId, p.ProductName,p.UnitPrice,c.CategoryName,p.ProductID from products p inner join categories c on c.categoryId=p.categoryId", baglan );

baglan.Open();
SqlDataReader rd = cmd.ExecuteReader();

while (rd.Read())
{
ListViewItem list = new ListViewItem();
list.Text=rd["ProductId"].ToString();
list.SubItems.Add(rd["ProductName"].ToString());
list.SubItems.Add(rd["CategoryName"].ToString());
list.SubItems.Add(rd["UnitPrice"].ToString());
list.SubItems.Add(rd["CategoryId"].ToString());

listView1.Items.Add(list);

}
cnn.Close();
}

Yazdığımız kodu açıklayacak olursak, birden fazla yerde bu metodumuzu çağıracağımız için yeni ekleme yaptığımız yerlerde ekleme yaptığımız ürünü o anda görmek için listview’ı temizliyoruz.

Sql cümlemizi SqlCommand içinde yazıyoruz. sorgumuzdan sonra virgül koyup baglantımızın adını tanıtmamız lazım yoksa bize sorgu bağlantınız açın diye hata döner.

Baglantıyı açıp sorgumuzu ExecuteReader ile okuyup SqlDataReader değişkenimize atıyoruz. ExecuteReader bize SqlDataReader sonucu döndüreceği için bu işlemi yaptık.

while döngüsü ile SqlDataReader tipinde oluşturduğumuz değişkenimizi SqlDataReader’ın Read() metodu ile okuyoruz, yani demek istediğimiz okuyacak veri olduğu sürece while döngüsünde dönmesini istiyoruz.

Okuduğumuz verileri listview’e eklemek için listviewItem ınstance’ını alıyoruz. ve aldığımız ınstance’ın özelliklerinden text’ine oluşturduğumuz rd değişkenindeki [“ProductId”] kolonunu ekle diyoruz. burda index numarasınıda belirtebiliriz yani rd[0], textini ekledikten sonra subıtem’larını yani alt alanlarını diğer kolonlarla dolduruyoruz en sonunda listview’imizi doldurduğumuz listviewItem değişkenini listview1’in item’larına ekliyoruz.
son olarak bağlantımızı kapatıyoruz.

Şimdi ise Kategorileri Getir adında bir metot oluşturuyoruz.

void KategorileriGetir()
{
SqlCommand cmd = new SqlCommand("Select CategoryId,CategoryName From Categories",baglan);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);

cmbKategori.DataSource = dt;
cmbKategori.DisplayMember = "CategoryName";
cmbKategori.ValueMember = "CategoryID";

}

Kodu açıklayacak olursak yukarıdaki gibi SqlCommand ile sorgu cümlemizi yazıyoruz. Bu sefer yazdığımız sql sorgusunu SqlDataAdapter ile tutuyoruz ve DataTable ınstance’ı alarak yeni bir DataTable nesnesi oluşturuyoruz. sorgumuzu tuttuğumuz SqlDataAdapter nesnesini Fill metodu ile DataTable nesnemize yani dt isimli değişkenimize atıyoruz. Şuan sorgudan dönen sonucumuz bizim oluşturduğumuz DataTable nesnesinde DataTable ise sanal bir tablo görevi görmektedir.

Sıra şimdi oluşturduğumuz comboboxların içini doldurmaya geldi Combobox’ın datasource özelliği ile direk içini doldurabiliyoruz. DataSource özelliğine DataTable nesnemiz olan dt yi verdik. DisplayMember’ını yani görünecek olan kısmını CategoryName olarak belirledik. ve ValueMember’ını yani CategoryName karşılık gelen CategoryID sini belirledik.

Şimdi ise eklediğimiz butonun tıklandığı zaman ne yapacağını kodlamaya geldi.

private void btnKaydet_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand("Insert Into Products(CategoryID,UnitPrice,ProductName) Values(@KategoriId,@fiyat,@ad)", baglan);
cmd.Parameters.AddWithValue("@KategoriId", cmbKategori.SelectedValue);
cmd.Parameters.AddWithValue("@fiyat",Convert.ToDouble(txtFiyat.Text.Trim()));
cmd.Parameters.AddWithValue("@ad", txtAd.Text.Trim());

baglan.Open();
cmd.ExecuteNonQuery();
baglan.Close();

UrünleriGetir();

}

Yukarıda ki kodu açıklayacak olursak yine SqlCommand ile Sql Sorgumuzu yazıyoruz. Kaydet butonuna bastığımız zaman veri tabanına ekleme sorgumuzu yazıyoruz. value değerlerini dışarıdan parametre ile alacağımız için @ işareti ile parametrelerini tanımladık. ilk parametremizi dolduralım “@kategoriId” yazıp virgülden sonra kategoriId ye gelecek değerin hangi nesneden gelceğini yazıyoruz Combobox’ın selectedValue’su yani yukarı valuemember olarak categoryId sini belirttiğimiz için kategoryId’yi göndericek. diğer parametrelerde aynı bu şekilde doldurulur. Sonrasında baglantımız açılıp ExecuteNonQuery metodumuz çağırılır. Bu metot ile insert işlemini gerçekleştirmiş oluruz. Sonrasında da baglantımızı kapatırız. Eklediğimiz kaydı görmek için UrunleriGetir metoduna gideriz.

Ekstra olarak listview’de seçtiklerimizi textboxlara ve combobox’ta göstermek için listview’ın SelectedIndexChanged eventini aşağıdaki kodları yazıyoruz. Listview’e çift tıkladığımızda bu event açılır. Aşağıdaki kod satırlarında ise oluşturduğumuz listview’ın FocusedItem özelliği ile oluşturduğumuz item ismindeki listview ınstancemızın SubItems’larındaki index numaralarına göre text’indekileri göstermek istediğimiz nesnelerimizin text’ine gönderiyoruz.

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.FocusedItem != null)
{
ListViewItem item = listView1.FocusedItem;
txtAd.Text = item.SubItems[1].Text;
lblID.Text = item.SubItems[0].Text;
txtFiyat.Text=item.SubItems[3].Text;

cmbKategori.SelectedValue = item.SubItems[4].Text;

}
}

Formumuzun Load’ında  UrünleriGetir ve KategorileriGetir metodunu çağırıyoruz.

private void FormUrunler2_Load(object sender, EventArgs e)
{
UrünleriGetir();
KategorileriGetir();
}

Böyle bir örneklede bu konuyu anlatmaya çalıştık, Sorularınızı yorum olarak bırakabilirsiniz.

 

 

 

 

C# ADO.NET

Listview’de Execute Scalar kullanarak veri tabanından veri çekme işlemini yapacağız. Tasarımımızı aşağıdaki gibi yapıyoruz. GroupBox’ın içinde 1 buton 1 listview ekleyip listview’in üstündeki ok işaretine tıklayıp edit colums kısmından Ad ve Soyad ekleyip, view yani görünümünü Details yapınca kolonlarımız gözükecektir.
ExecuteScalarTasarım işleminden sonra butona çift tıklayıp click eventine kodlarımızı yazmaya başlıyoruz.

private void button1_Click(object sender, EventArgs e)
{

SqlConnection baglanti = new SqlConnection(); // Sql Bağlantı class'ımızın instance'ını alıyoruz.
//Bağlanacağımız Server ismi ve veri tabanımızın ismini ConnectionString ile belirtiyoruz.
baglanti.ConnectionString=("Server=.;Initial Catalog=Northwind;Integrated Security=true;");
baglanti.Open(); // Bağlantımızı açıyoruz.

// Sorgumuzu SqlCommand içinde yazıyoruz (Baş harfi a olanı getir dedim.)
SqlCommand sorgu = new SqlCommand("Select Firstname From employees where firstname like 'a%' ",baglanti);
// ExecuteScalar metodunu tek değer döndüreceğimiz zaman kullanıyoruz bize object türünde sonuc döndüreceği için sonuc diye object türünde bir değişkene atıyoruz.
object sonuc = sorgu.ExecuteScalar();

//ListView'de göstermek için listview classının instance'sini alıyoruz.
ListViewItem list = new ListViewItem();

list.Text = sonuc.ToString(); //List'in textine sonuc değişkenimizi atıyoruz.

//Yukarıdaki yaptıklarımızla listview'in 1. kolonunu doldurduk şimdi 2. kolonu dolduralım

//SqlCommand ile 2. sorgumuzu yazıyoruz
SqlCommand sorgu2 = new SqlCommand("Select Lastname from employees where firstname like 'a%'",baglanti);
object sonuc2 = sorgu2.ExecuteScalar();
list.SubItems.Add(sonuc2.ToString()); //Bu sefer list'in SubItems'ına yani alt elemanına ekliyoruz.

listView1.Items.Add(list); //En sonra listview'de list'i ekleyip tüm değerlerimizi görebiliyoruz.
}

Yukarıda tek veri dönmesini istediğimiz için ExecuteScalar kullandık, Bu sefer ExecuteReader ile result bir değer döndürecek işlem yapacağız. Yukarıdaki işlemde tasarım ile ilgili gerekli bilgileri verdiğim için burada tekrar tasarım kısmını anlatmayacağım.

ExecuteReade

private void button2_Click(object sender, EventArgs e)
{

SqlConnection baglanti = new SqlConnection(); //Sql Bağlantı class'ımızın instance'ını alıyoruz.
baglanti.ConnectionString = ("Server=.;Initial Catalog=Northwind;Integrated Security=true");
baglanti.Open();

SqlCommand cmd = new SqlCommand("Select CustomerID,CompanyName from Customers",baglanti);
//ExecuteReader bize SqlDataReader türünde bir değer döndüreceği için sonuc adında bir değişkene komudumuzu atıyoruz.
SqlDataReader sonuc= cmd.ExecuteReader();

while (sonuc.Read()) //Okunacak veri olduğu sürece while döngüsünde dönecek
{
ListViewItem list = new ListViewItem(); //Listview'e eklemek için instance alıyoruz.
list.Text = sonuc[0].ToString(); //list'in textine 0. indekteki değeri yani customerID yi yazdırıyoruz.
list.SubItems.Add (sonuc[1].ToString()); //listin alt elemanına 1. indexteki değeri yazdıyoruz.

listView2.Items.Add(list); // List'i listview'de gösteriyoruz.
}
}

Bu sefer ExecuteNonQuery yani insert delete update gibi işlemlerde sonuc döndürmeyen komutu işleyen metodu kullanacağız. Tasarım aşağıdaki gibi 2 adet textbox’a ad ve soyad bilgisi gireceğiz butona bastığımızda Employees tablosuna eklemiş olacağız.

Employees

private void button3_Click(object sender, EventArgs e)
{
if (textBox1.Text == "" || textBox2.Text == "") //TextBoxlar'a değer girilmediyse işlem yaptırmayacak.
{
MessageBox.Show("Lütfen Boş Alanları Doldurunuz.");
}
else
{
try
{

// Calisan diye bir class oluşturup içine Ad ve Soyad olarak 2 tane property ekledik ve aşağıda class'ımızın instance'ını aldık
Calisan cls = new Calisan();
cls.Ad = textBox1.Text;
cls.Soyad = textBox2.Text;

SqlConnection baglan = new SqlConnection(); //Sql Bağlantı class'ımızın instance'ını alıyoruz.
baglan.ConnectionString = ("Server=.;Initial Catalog=Northwind;Integrated Security=true");
baglan.Open();

//SqlCommand ile ekleme yapacağımız tabloyu ve değerleri nereden alacağını yazıyoruz.
SqlCommand sorgu = new SqlCommand("Insert Into Employees(Firstname,Lastname) values('" + textBox1.Text + "','" + textBox2.Text + "')", baglan);

sorgu.ExecuteNonQuery();

//String formatı kullanarak ekrana eklenen kişiyi mesaje olarak gösteriyoruz.
string sonuc = string.Format("{0} {1}", textBox1.Text, textBox2.Text);
MessageBox.Show(sonuc + " Veri Tabanına Eklenmiştir.");

baglan.Close();
}

//Hata oluşması durumunda catch bloğu çalışacak ve bize message gösterecek.
catch (Exception ex)
{
MessageBox.Show("Hata Oluştu", ex.Message);
}
}
}