Bundan önceki yazılarımda veritabanına kayıt ekleme ve kayıtları datagridview içerisinde göstermekten bahsetmiştim. Şimdi ise veritabanı içerisinden istediğimiz kaydı bulduktan sonra nasıl güncelleme işlemi yapabileceğimizi anlatacağım. Örneğimizde kullanacağımız DataAdapter ve DataReader sınıflarını inceleyelim.
SqlDataAdapter; bellek üzerinde oluşturulan tablo ve kayıtların, veritabanına gönderilmesi ya da veritabanındaki tabloların belleğe çekilmesi işlemlerini gerçekleştiren sınıftır.
SqlDataReader; veritabanından okunan kayıtların bellek üzerinde tutulmasını sağlayan sınıftır. Bağlantı açık olduğu sürece çalışır ve aynı anda sadece bir kaydı bellekte saklayabilir.
Veritabanı işlemleriyle ilgili önceki yazılarımızı okumayanlar için Sql veritabanımızdaki musteriler tablomuzu aşağıdaki gibi hazırladığımızı belirtmek isterim.
Örneğimizin nasıl çalışacağını açıklayalım. Öncelikle üzerinde değişiklik yapmak istediğimiz müşterinin bilgilerini veritabanından çekip, bu bilgileri form üzerindeki kontrollere aktaracağız. Sonra gerekli değişiklikleri yapıp, yeni verileri eskisiyle değiştireceğiz. Bunun için aşağıdaki gibi formumuzu oluşturuyoruz.
Formuzun tasarımı bittikten sonra öncelikle Ara butonu yardımıyla müşteri bilgilerini bize getirecek olan kodlarımızı yazalım. Kodların çalışmasıyla ilgili ayrıntıları satır aralarına ekledim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using System; using System.Data; using System.Data.SqlClient; using System.Text; using System.Windows.Forms; namespace MusteriTakipProgrami { public partial class Guncelle : Form { public Guncelle() { InitializeComponent(); } static string conString = "Server=Kutlay-;Database=MusteriTakip;Uid=sa;Password=kutlay;"; SqlConnection baglanti = new SqlConnection(conString); private void btnAra_Click(object sender, EventArgs e) { baglanti.Open(); string kayit = "SELECT * from musteriler where musterino=@musterino"; //musterino parametresine bağlı olarak müşteri bilgilerini çeken sql kodu SqlCommand komut = new SqlCommand(kayit, baglanti); komut.Parameters.AddWithValue("@musterino", txtMusterino.Text); //musterino parametremize textbox'dan girilen değeri aktarıyoruz. SqlDataAdapter da = new SqlDataAdapter(komut); SqlDataReader dr = komut.ExecuteReader(); if (dr.Read()) //Sadece tek bir kayıt döndürüleceği için while kullanmadım. { lblMusterino.Text = dr["musterino"].ToString(); txtTc.Text = dr["tcno"].ToString(); txtIsim.Text = dr["isim"].ToString(); txtSoyisim.Text = dr["soyisim"].ToString(); txtTelefon.Text = dr["telefon"].ToString(); txtAdres.Text = dr["adres"].ToString(); //Datareader ile okunan verileri form kontrollerine aktardık. } else MessageBox.Show("Müşteri Bulunamadı."); baglanti.Close(); } } } |
Kontrollerin isimlerini yazarken hata yapmadıysanız veritabanında ki ilgili kaydı, form üzerinde aşağıdaki gibi görüntülemiş olmanız gerekiyor.
Şimdi müşteri bilgilerinde değişiklik yaptıktan sonra veritabanındaki bilgileri güncellemek için gerekli olan Kaydet butonumuza ait kodları yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
private void btnKaydet_Click(object sender, EventArgs e) { baglanti.Open(); string kayit = "update musteriler set tcno=@tcno,isim=@isim,soyisim=@soyisim,telefon=@telefon,adres=@adres where musterino=@musterino"; // müşteriler tablomuzun ilgili alanlarını değiştirecek olan güncelleme sorgusu. SqlCommand komut = new SqlCommand(kayit, baglanti); //Sorgumuzu ve baglantimizi parametre olarak alan bir SqlCommand nesnesi oluşturuyoruz. komut.Parameters.AddWithValue("@tcno", txtTc.Text); komut.Parameters.AddWithValue("@isim", txtIsim.Text); komut.Parameters.AddWithValue("@soyisim", txtSoyisim.Text); komut.Parameters.AddWithValue("@telefon", txtTelefon.Text); komut.Parameters.AddWithValue("@adres", txtAdres.Text); komut.Parameters.AddWithValue("@musterino", lblMusterino.Text); //Parametrelerimize Form üzerinde ki kontrollerden girilen verileri aktarıyoruz. komut.ExecuteNonQuery(); //Veritabanında değişiklik yapacak komut işlemi bu satırda gerçekleşiyor. baglanti.Close(); MessageBox.Show("Müşteri Bilgileri Güncellendi."); } |
Veritabanımızdaki müşterimize ait verileri sorunsuz şekilde güncelledik. Konuyla ilgili sorularınızı bana iletebilirsiniz. Bir sonraki yazımda veritabanından kayıt silme işlemini anlatacağım. Kolay gelsin.
elinize sağlık çok iyi bir anlatım
Hocam ellerinize sağlık çok güzel ama iki tane eksik şey buldum, geri dönerseniz çok memnun olurum.
1. Temizle butonuna bir müdahalede bulunmamısız 😀
2. Kayıt butonuna tıkladıgımda db’de hepsini değistiriyor ve aynısı oluyor 🙁
ama en azından çalısdı.
Gökhan Bey, yorumlarınız için teşekkür ederim. Kod karmaşası olmasın diye temizle butonuna kod eklemedim. Update sorgusunun where bölümünde hata yapmadığınıza emin misiniz?
hoca yanlısın var sanırım aynı kodlar ama olmuyor hata veriyor ? komut tanımında “adres=@adres where id=@id diye devam ettim adresin sonuna virgül koyupda denedim koymadan da gene olmadı
http://i.hizliresim.com/Ebl0W9.png
resimden bakabilirsiniz
Update sorgunuzda tablonuzun ismi tables ise from kelimesi fazlalık olmuş, onu silerseniz sorununuz düzelecektir. Kolay gelsin.
Hocam kodlarınızı aynen alıp, kendime göre düzenleyip çalıştırdım, bulma kısmı olup textboxlara getirdi ama değiştirme işlemi için aşağıdaki butona basınca aşağıdaki hatayı veriyor:
“Conversion failed when converting the nvarchar value ‘label8’ to data type int.”
Tablomda KitapNo kısmı var, hem birincil anahtar hemde otomatik sayı. (Başka bir tablodaki KitapNo ile de ilişkili.) Hocam lütfen yardım edin saatlerdir uğraşıyorum bir türlü hatayı çözemiyorum.. Teşekkürler.
Not: Hocam diğer kayıt ekleme, silme, bulma işlemlerinin hepsi gayet iyi çalıştı bunda sorun çıkarıyor sadece.
Hocam datatimepicker nasıl yansıtabiliriz veri tabanındaki tarihi?
private void btnara_Click(object sender, EventArgs e)
{
SqlConnection baglan = new SqlConnection(“Data Source=mete-bilgisayar\\sqlexpress;Initial catalog=omyo;Integrated security=true”);
baglan.Open();
string kayit = “Select * from bilnorm1 where SNo=@SNo”;
SqlCommand cmd = new SqlCommand(kayit, baglan);
cmd.Parameters.AddWithValue(“SNo”, txtsno.Text);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
dtpTarih.Value = dr[“AraSinavTarihi”].ToString(); ;
txtsaat.Text = dr[“SinavSaati”].ToString();
txtderskod.Text = dr[“DersKodu”].ToString();
txtdersadi.Text = dr[“DersinAdi”].ToString();
txtsinif.Text = dr[“Sinif”].ToString();
txtadsoyad.Text = dr[“AdiSoyadi”].ToString();
txtderslik.Text = dr[“Derslik”].ToString();
}
else
{
MessageBox.Show(“Kayıt Bulunamadı.”);
baglan.Close();
}
Merhaba üstadım üstünden 2 ay geçmiş sen çözmüşsündür zaten fakat belki daha sonra arayıp da bulamayanlar olur diye yazarım ben.
dtpTarih.Value = dr[“AraSinavTarihi”].ToString();
Burada ToString dersen olmaz çünkü tarih biçimi text değildir. Bunu Convert.ToDateTime içine al. tostring silmeyi unutma !
Kolay gelsin.
Temizle butonu için bunu yapmanız yeterli
private void temizleBtn_Click(object sender, EventArgs e)
{
foreach(Control item in this.Controls)
{
if(item is TextBox)
item.ResetText();
}
}
Hocam Kaydetme kısmında bağlantıyı kapattıgım halde “bağlantı kapatılmadı bağlantı durumu: açık” diyor.
Hocam ;
Bir proje üzerinde çalışıyorum ve bu projede satılan mallar ve alınan mallar var.
Alınan mallar da olan malzemeyi satmak istediğim zaman satılan mallara gidiyor.Burada bir sıkıntı yok.
Sıkıntı şurada satma işlemi yaptığım zaman alınan mallar da malzeme düşsün istiyorum.
Örnek
Alınan Mallar 1200 Adet
Satılan Mallar 1000 Adet
Bunu güncellediğim zaman alınan mallarda 200 tane kalmasını istiyorum.
Çok Teşekkür Ederim Şimdiden 🙂
Ben C#la hazırladığım programın database ni sql serverle bağladım şimdi c# da bisiklet kiralama ve teslim işlemi yaptığım formum var kiralama ekranımda KiraId KiralayanKisiId KiralanaBisikletId KiralananIstasyonId
TeslimTarihi TeslimSaati TeslimAlınaGorevliId bölümleri mevcut teslim formumda da KiraId TeslimTarihi TeslimSaati IadeTarihi IadeSaati IadeEdilenGorevliId KiralamaSüresi KiraUcreti ve bu 2 form aynı tablo üzerinde işlem yapıyor ve benim sorum da TeslimAlınaGorevliId ile IadeEdilenGorevliId aynı değil ise bisikletin zimmetli oldugu istasyon değişicek
zimmet tablom görevli tablom bisiklet tablom İstasyon tablom da var bunlarda bir birleriyle ilişkili bu sorumu triggerla yazmak istiyorum ama bunun için tanımladıgım değişkenlere sorgularla atamalar yapıp koşulu ssağlarsa zimmet ekranında güncelleme gerçekleşecek bunla ilgili fikirleri niz nedir
mükemmelden öte siteniz var
kral 3 sene olmuş cevap bulabildin mi ben de benzer bir zimmet otomasyonu gibi bir şey yapıyorum kaynak kodun falan varsa paylaşabilir misin
System.Data.SqlClient.SqlException: ‘Conversion failed when converting the nvarchar value ‘label9′ to data type int.’ bu hatayı alıyorum
SqlCommand update = new SqlCommand(“update Users set Ad=@name, SoyAd=@lastname,Phone=@phone,TcKimlik=@tc,Adress=@adress, DogumTarihi=@dogumTarihi,email=@mailAdresi,Picture=@pc where ID=@id”, con);
update.Parameters.AddWithValue(“@name”, txtad.Text.Trim().ToUpper());
update.Parameters.AddWithValue(“@lastname”, txtSoyad.Text.Trim().ToUpper());
update.Parameters.AddWithValue(“@phone”, maskedphone.Text);
update.Parameters.AddWithValue(“@tc”, txttc.Text.Trim().ToUpper());
update.Parameters.AddWithValue(“@adress”, txtAdress.Text.Trim().ToUpper());
update.Parameters.AddWithValue(“@dogumTarihi”, dtDogum.Value.Date);
update.Parameters.AddWithValue(“@mailAdresi”, txteposta.Text);
update.Parameters.Add(“@pc”, SqlDbType.Image, resim.Length).Value = resim;
update.Parameters.AddWithValue(“@id”, label9.Text);