Bu yazımızda C# ile Access veritabanı bağlantısı gerçekleştirceğiz. Örneğimizde Veritabanına resim yolu kaydetme işleminin nasıl yapılacağını göreceğiz. OpenFileDialog kullanarak veritabanına resmi değil resim yolunu kaydederek, kaydetmiş olduğumuz bu resim yolunun Picturebox’ta Resim olarak gösterilmesini sağlayacağız.
Örneğimizde kullanacağımız veritabanının ismi “dbPersonel” ve tablomuzun ismi “Kisiler” olacak. “Kisiler” tablosunu aşağıdaki şekilde tasarlayarak projemizin içinde “…/bin/Debug” klasörü altına kopyalıyoruz.
form tasarımımızı inceleyelim.
Görüleceği üzere Formumuzda kayıtları görüntülemek için kullanacağımız 1 adet datagridView, resim görüntülemek için kullanacağımız 1 adet Picturebox, Ekleme, Silme ve Güncelleme işlemlerini gerçekleştireceğimiz Butonlar ve Textbox‘ lar bulunuyor.
Formumuzu tasarladıktan sonra Datagridview‘ de tüm satırın seçili olabilmesi için
SelectionMode özelliğini FullRowSelect olarak ayarlıyoruz. Resim ekleme ve Güncelleme işlemlerini OpenFileDialog ile yapacağız. Bu işlem için Formumuzda bulunan Seç Butonunu kullanacağız. Seç butonuna basıldığında Resim seçme işlemini gerçekleştirecek olan bir Dialog penceresi açılacak. Resmimizin yolunu bu şekilde elde ettikten sonra Kaydetme ve Güncelleme işlemlerinde kullanacağız. Silme işlemini datagridView’ de seçili olan satıra göre yapacağız. Bağlantımızda Ekleme, Silme ve Güncelleme işlemlerini Parametreli Sorgu Kullanarak gerçekleştireceğiz. Parametre kullanımında eğer Access bağlantısı kullanıyorsak özellikle güncelleme sorunu yaşamamak için Parametre sırasına dikkat etmek gerektiğini hatırlatalım.
Kodlarımızda göreceğimiz diğer bir husus Datagrid’de tıklanan satıra ait verilerin ilgili textBox‘ larda görüntülenmesini sağlamak amacıyla ;
datagridView CellEnter olayına yazmak olacaktır. Verilerimizin datagridview üzerinde görüntülenmesi işlemi Form yüklendiğinde, Ekleme yapıldığında, Güncelleme yapıldığında ve Silme işlemi gerçekleştiğinde olacağından tekrar tekrar yazmamak için KisiListele isminde Metot oluşturacağız. Bu metodu ne zaman ihtiyaç duyarsak çağıracağız. Metot kullanımı hakkında yeterli bilgiye sahip değilseniz daha önceki metotlarla ilgili yazılarımıza bakabilirsiniz.
Kodlarımız aşağıdaki gibi olacaktır.
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.OleDb; namespace veritabaniResimyolu { public partial class Form1 : Form { public Form1() { InitializeComponent(); } OleDbConnection baglanti; OleDbCommand komut; OleDbDataAdapter da; void KisiListele() { baglanti = new OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;Data Source=dbPersonel.accdb"); baglanti.Open(); da = new OleDbDataAdapter("Select *From Kisiler", baglanti); DataTable tablo = new DataTable(); da.Fill(tablo); dataGridView1.DataSource = tablo; baglanti.Close(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog dosya = new OpenFileDialog(); dosya.Filter = "Resim Dosyası |*.jpg;*.nef;*.png | Tüm Dosyalar |*.*"; dosya.ShowDialog(); string dosyayolu = dosya.FileName; textBox3.Text = dosyayolu; pictureBox1.ImageLocation = dosyayolu; } private void Form1_Load(object sender, EventArgs e) { KisiListele(); } private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) { textBox1.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString(); textBox2.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString(); textBox3.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString(); pictureBox1.ImageLocation = dataGridView1.CurrentRow.Cells[3].Value.ToString(); } private void button2_Click(object sender, EventArgs e) { string sorgu = "Insert into Kisiler (ad,soyad,resim) values (@Ad,@Soyad,@Resim)"; komut = new OleDbCommand(sorgu, baglanti); komut.Parameters.AddWithValue("@Ad",textBox1.Text); komut.Parameters.AddWithValue("@Soyad", textBox2.Text); komut.Parameters.AddWithValue("@Resim", textBox3.Text); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); KisiListele(); } private void button3_Click(object sender, EventArgs e) { string sorgu = "Update Kisiler Set ad=@Ad,soyad=@Soyad,resim=@Resim Where id=@Id"; komut = new OleDbCommand(sorgu, baglanti); komut.Parameters.AddWithValue("@Ad", textBox1.Text); komut.Parameters.AddWithValue("@Soyad", textBox2.Text); komut.Parameters.AddWithValue("@Resim", textBox3.Text); komut.Parameters.AddWithValue("@Id", (dataGridView1.CurrentRow.Cells[0].Value)); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); KisiListele(); } private void button4_Click(object sender, EventArgs e) { string sorgu = "Delete From Kisiler Where id=@Id"; komut = new OleDbCommand(sorgu, baglanti); komut.Parameters.AddWithValue("@Id", (dataGridView1.CurrentRow.Cells[0].Value)); baglanti.Open(); komut.ExecuteNonQuery(); baglanti.Close(); KisiListele(); } } } |
Kodlarımızı yazıp programımızı çalıştırarak test edelim.
Ayrıca C# dilinde yazılmış daha fazla örnek ve konular için C# Dersleri yazısını yada sağ üstte bulunan site içinde arama panelini kullanabilirsiniz.
çok güzel yontem kullanıya uyarı msj nasıl verecez , yanlışlıla sılmesın 🙂
hocam c# veritabanına çoklu resim koyarım örnek artı butonu basınca koysun devamlı eski butona basınca çıkarsın
örnek resimdeki gibi
https://hizliresim.com/cRPAyB
güncellemede hata alıyorum neden ?
aynısını listview de yapabiliyormuyuz
Hocam peki seçtiğimiz resmi proje dosyalamızdaki klasöre nasıl kayıt edebiliriz.
Bununla ilgili en kisa zamanda bir örnek hazirlayarak linki buraya ekleyecegim.
Hocam 3 gün sürem var projeyi bitirmek için.Yardımcı olabilir misiniz?
Hazir bir ornek var. Bugun eklemeye calisirim.
Teşekkür ederim eklediğiniz zaman beni bilgilendiriseniz sevinirim.İyi Günler..
OpenFileDialog dosya = new OpenFileDialog();
dosya.Filter = “Resim Dosyası |*.jpg;*.nef;*.png | Tüm Dosyalar |*.*”;
dosya.ShowDialog();
string dosyayolu = dosya.FileName;
string yeniyol = (System.IO.Directory.GetCurrentDirectory())+”\\images\\” +Guid.NewGuid().ToString() + “.jpg”;
File.Copy(dosyayolu, yeniyol);
Resim Seçme bölümüne yukarıdaki gibi kodları eklerseniz otomatik olarak benzersiz isim vererek proje içinde önceden oluşturmuş olduğunuz bin/debug içindeki “images” klasörüne kopyalayacaktır.
Yarın konuyla ilgili daha detaylı bir örnek oluşturacağım.
Hocam çok teşekkür ederim oldu ama bir sorun var gibi.Dosyayı projemdeki belittiğim klasöre kopyaladı yalnız dosya yolu olarak projemdeki yolu değilde başka bir yerden seçtiğim dosyayı baz almış bu kodda.Yani bu verdiğiniz kod sadece resmi projeme kopyalama görevi görmüş
Evet yolladığım kodlar resmi proje içine kopyalama ile ilgili. Veritabanına kaydetme kısmını Kaydet butonunda yapacaksınız. Onu yapmak için ise yukarıda yazmış olduğum kodlarda bulunan dosyayolu ve yeniyol değişkenlerinden yeniyol değişkenini kullanacaksız. Birde Bu değişkeni public olarak tanımlamalısınız ki kaydederken kullanabilesiniz.
Hocam Dosya yolu değilde application.startuppath ile yapılamaz mı.Dosya yolu ile yapıldıgı zaman proje baska bır dızıne tasındıgı aman proje içindeki resimleri bile görmüyor.
Sorununuzu şimdi daha net anladım. Çözüm için şunları yapmak gerekiyor.Klasör içine resmi attıktan sonra sizin için önemli olan kısım sadece dosya adını veritabanına kaydetmek olacak. Sadece Dosya adını almak için ise örnek olarak Ekle butonu için;
komut.Parameters.AddWithValue(“@Resim”, Path.GetFileName(yeniyol));
şeklinde resim dosyasının sadece adını alıp accesse kaydetmek gerekiyor. Daha sonra çağırıken zaten aktif klasör içine kopyaladığımız için
Datagrid Cell Enter bölümünde;
pictureBox1.ImageLocation = Application.StartupPath + “\\images\\” + dataGridView1.CurrentRow.Cells[3].Value.ToString();
bu şekilde çağırmak gerekiyor. Kaydetme haricinde Güncelleme içinde
Path.GetFileName(yeniyol) yi kullanmak gerekiyor.
Sorununla ilgili küçük bir program parçası hazırladım inceleyebilirsin. Buradan indirebilirsin.
Bu konuyla ilgili eklediğiniz dosyayı açamadım. Kodları buraya ekleme şansınız var mı?
Hocam Süpersiniz tam olarak istediğim buydu.Allah razı olsun büyük bir dertten kurtardınız beni 🙂
Aktif çalışan klasör içine atabilirsiniz.
Örnek :MessageBox.Show(Directory.GetCurrentDirectory());
şeklinde aktif dizini öğrenip kayıt işlemini ona göre yapabilirsiniz.
Hocam biraz daha açarmısınız konuyu.Kusura bakmayın daha yeniyim c#’da
hocam merhabalar. elimde şablon olarak kullandığım bir word dosyası var. hasta sorgulama ekranında hastanın bilgilerini textboxlara çektikten sonra “bilgileri worde aktar” butonuyla bu bilgileri şablon dosyamdaki boş alanlara çekiyorum. yani taslak bir sayfaya farklı hastaların bilgilerini yazdırıyorum.
sorun şu ki bu word dosyasının yolu benim bilgisayarımda ve program başka bilgisayarda çalıştığında bu dosyayı göremeyecek, dolayısıyla problem yaşanacak. ben dosyayı resources’a eklemeye çalıştım ama sanırım word dosyası olduğu için dosya tipini tanımadı. bu sorunu nasıl halledebilirim? şimdiden teşekkürler.