Visual C# .Net Üzerinde Veritabanına Resim Kaydetmek – Resim Çekmek

.Net ailesinde veritabanına herhangi bir dosya veya resim kaydetmek çok kolay bir işlemdir. Bu yazımda size, “Visual C#.Net veya VisualBasic.Net üzerinde veritabanına resim nasıl kayıt edilir ve bu resim tekrardan nasıl çekilir” problemini en kolay yoldan çözmeyi anlatacağım.

Öncelikle bu örneği yapabilmek için, bir veritabanı ve bu veritabanına ait bir tane tablo oluşturuyorum.

  • Veritabanımın adı ResimArsivi, tablomun adı ise Resimler.
  • Resimler tablosunda id ve veri adlı iki tane sütun ekliyorum.
  • Id sütunum için int veri tipini olarak seçiyorum.
  • veri adlı sütunum için varbinary(MAX) veritipini seçiyorum. Bu şekilde verilerimi binary şekilde kayıt edebileceğim.
  • tablomun identity sütununu ID olarak belirliyorum

Resimler Tablosunun Sütunları

Resimler Tablosunun Properties Penceresi

Buraya kadarki bölüm veritabanı tasarımıydı. Şimdi kod kısmında bu işlemleri aşama aşama bir dosyayı binary şekline dönüştürmeyi görelim.

  • Bu işlemi yapmamız için kullanabileceğimiz bir sınıfımız mevcut. Bu sınıf System.IO içindeki MemoryStream sınıfıdır. Bu sınıf bellek üzerinde verileri ikilik sistemde saklamamıza yardımcı olacak.
  • Daha sonra Image sınıfını kullanarak yeni bir değişken oluşturuyorum. Bu değişkenin içine, veritabanına yüklemek istediğim resmi atıyorum.
  • Image sınıfını kullanarak oluşturduğum değişkenimin içinde SAVE diye bir fonksiyon yer almaktadır. Bu fonksiyon sayesinde MemoryStream olarak tanımladığım değişkenimin içini doldurmuş olacağım. Şimdi bu karışık gibi görünen adımları kodla gösterelim.
// Öncelikle MemoryStream Sınıfını kullanarak, değişken oluşturuyoruz.
// Ardından Image sınıfından bir değişken oluşturuyorum.

System.IO.MemoryStream msResim1 = new System.IO.MemoryStream();
Image img = Image.FromFile(oFDResim.FileName);

img.Save(msResim1, System.Drawing.Imaging.ImageFormat.Bmp);
  • img değişkenimin Save fonksiyonu benden, birinci parametre olarak MemoryStream tarzından bir tür, ikinci parametre olarak da bir resim formatı belirtmemi istiyor.
  • Bu işlemden sonra resim msResim1 adlı değişkenimin içinde bellek üzerinde işlenmiş oluyor.
  • Daha sonra parametre içinde bu veriyi kullanabiliyoruz.
// Parametre olarak içeriği aktarıyorum.
myParameter = new SqlParameter("@veri", msResim1.ToArray());
// SqlCommand nesneme parametrelerin neler olduğunu gösteriyorum.
myCommand.Parameters.Add(myParameter);

Yani kodumuzun son hali aşağıdaki gibidir.

            // Öncelikle MemoryStream Sınıfını kullanarak, değişken oluşturuyoruz.
            // Ardından Image sınıfından bir değişken oluşturuyorum.

            System.IO.MemoryStream msResim1 = new System.IO.MemoryStream();
            Image img = Image.FromFile(oFDResim.FileName);

            img.Save(msResim1, System.Drawing.Imaging.ImageFormat.Bmp);

            // Parametre olarak içeriği aktarıyorum.
            myParameter = new SqlParameter("@veri", msResim1.ToArray());
            // SqlCommand nesneme parametrelerin neler olduğunu gösteriyorum.
            myCommand.Parameters.Add(myParameter);

            try
            {
                myCommand.Connection.Open();
                myCommand.ExecuteNonQuery();
                MessageBox.Show("Kayıt Başarıyla Gerçekleşti");
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                myCommand.Connection.Close();
            }
  • Kayıt okumak bundan daha kolay bir işlem. DataReader üzerinden gelen veriyi byte dizisine casting edip, bu değeri byte değişkene aktarıyoruz.
  • Daha sonra MemoryStream adlı bir değişken oluşturup, kurucu parametresi olarak bu byte dizini veriyoruz. Yani elimizde DataReader ile okumuş olduğumuz sütunun MemoryStream‘deki değeri bulunuyor.
  • Image sınıfının FromStream adlı fonksiyonundan yararlanarak, bu veriyi herhangi bir Image sınıfından oluşmuş resim değişkeninde kullanabiliyoruz. Bu aşamadan sonra ister PictureBox üzerinde gösterim yapın isterseniz disk üzerine kayıt edip üzerinde işlem yapın.
myCommand= new SqlCommand("Select veri From Resimler Order by id desc",myConnection);
myCommand.Connection.Open();
myReader = myCommand.ExecuteReader();

if (myReader.Read())
{
byte[] myPicByte = (byte[])myReader[0];
System.IO.MemoryStream msResim1 = new System.IO.MemoryStream(myPicByte);
Image img = Image.FromStream(msResim1);

picResim.Image = img;

}

myCommand.Connection.Close();

Ayrıca aşağıda VisualStudio 2010‘da hazırlamış olduğum örnek projeye göz atabilirsiniz.

Csharp MSSQL Veritabanina Kayit (2122)

This entry was posted in Visual C# .Net and tagged , , , , , , , , , . Bookmark the permalink.

4 Responses to Visual C# .Net Üzerinde Veritabanına Resim Kaydetmek – Resim Çekmek

  1. secilus says:

    Cok tesekkur ediyorum 🙂 cok yardımci oldunuz:) ellerinize saglik……..

  2. Ehocam says:

    @secilus; yardımcı olabildiysem ne mutlu bana. İyi çalışmalar.

  3. selman candemi says:

    örnek baya bi güzel ancak fotografla beraber diğer verileri okuturken oku butonunun neresine kodu yazacağımı bulamadım yardımcı olursanız sevinirim.

  4. ilyas says:

    wala pek anlamadım o kodları nerde yazacam ben lütfen yardımcı olur musnuz?

Leave a Reply

Your email address will not be published. Required fields are marked *