Yazı Font Küçült Yazı Font Büyült

Sql Veritabanındaki Resimlere PictureBox ta Bakmak ve Dosya Olarak Kaydetmek

 

Merhaba arkadaşlar. Önceki makalemizde resim dosyalarını Sql veritabanına kaydetmeyi görmüştük. Şimdi de Sql veritabanındaki Binary resim dosyalarını okuyup, dosya olarak kaydetmeyi göreceğiz. Binary alandan verileri okumak için Stream nesnesinden ve BinaryWriter sınıfından yararlanacağız.

İlk önce Formunuza 1 adet dataGridView, pictureBox ve Button ekleyin. 

Gerekli açıklamalar kod kısmında genişçe verilmiştir.

 

Resim1

Şekil 1

 

Resim1

Şekil 2

 

Form1.cs

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Data.SqlClient;

using System.IO;

 

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            this.dataGridView1.MouseClick += new System.Windows.Forms.MouseEventHandler(dataGridView1_MouseClick);

        }

        SqlConnection baglan;

        private void Form1_Load(object sender, EventArgs e)

        {

            baglan = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\bilgi.mdf;Integrated Security=True;User Instance=True");

            SqlDataAdapter da = new SqlDataAdapter("Select Id,Aciklama from Katalog",baglan);

            DataTable dt = new DataTable("Resimler");

            baglan.Open();

            da.Fill(dt);

            dataGridView1.DataSource = dt;

            baglan.Close();

 

        }

 

        private void btnKaydet_Click(object sender, EventArgs e)

        {

            /*Bu kısımda dataGridView nesnesinde seçilen resimi

             C sürücüsüne test.jpg olarak kaydedeceğiz.*/

 

            SqlDataReader dr;

            int secilensatir;

 

            //dataGridView nesnesinde seçilen satırın indeksini alıyoruz.

           secilensatir = Convert.ToInt32((dataGridView1.CurrentCell.RowIndex + 1).ToString());

           //Seçilen satır indeksine göre sql sorgumuzu oluşturuyoruz.

           string SqlStr = "Select Resim From Katalog Where Id=" + secilensatir;

            SqlCommand komut = new SqlCommand(SqlStr, baglan);

            //Veritabanı bağlantısı kontrol ediyoruz. Bağlantı kapalıysa açıyoruz.

            if (baglan.State != ConnectionState.Open)

            {

                baglan.Open();

            }

            /*CommandBehavior.SequentialAccess ile resim üzerinde byte seviyesinden okuma sağlanıyor */

               dr = komut.ExecuteReader(CommandBehavior.SequentialAccess);

          

            //resim alanındaki bytler ı 50 şerli paketler halinde okutacağız.

            byte[] byteResim = new byte[50];

            FileStream fs = new FileStream("C:\\test.jpg", FileMode.OpenOrCreate, FileAccess.Write);

            BinaryWriter bw = new BinaryWriter(fs);

            /* BinaryWriter nesnesiyle okunulan byte lar, FileStream metodu ile resim dosyası olarak oluşturuluyor. */

 

            long donenDeger;

            long baslangicIndeks = 0;

            /*Şimdi de Resim alanımızın değerini döndüğü satırları

            SqlDataReader metodu ile okumaya başlıyoruz. */

            while (dr.Read())

            {

 

                /*

                 GetBytes metodundaki parametreler;

                 GetBytes(Resim alanının indeksi, Okunmaya başlanacak byte no, okunacak olan bytlerın yazılacağı byte dizisi , yazılacak byte dizisindeki başlangıç byte nosu,Okunacak bytelerın kaç byte lik alana yazılacağı belirtilir.);

                 */

                donenDeger = dr.GetBytes(0, 0, byteResim, 0, 50);

                while (donenDeger == 50)

                {

                    bw.Write(byteResim);

                    bw.Flush();

                    baslangicIndeks += 50;

                    donenDeger = dr.GetBytes(0, baslangicIndeks, byteResim, 0, 50);

 

                }

 

                bw.Write(byteResim);

                bw.Flush();

 

            }

            dr.Close();

            baglan.Close();

 

        }

 

     

        private void dataGridView1_MouseClick(object sender, MouseEventArgs e)

        {

 

            /*Bu kısımda dataGridView nesnesinde seçmiş olduğumuz

            satırdaki resim alanındaki resimi pictureBox ta göstereceğiz. */

           

            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

                      

            SqlDataReader dr;

            int secilensatir;

 

            secilensatir = Convert.ToInt32((dataGridView1.CurrentCell.RowIndex + 1).ToString());

 

            string SqlStr = "Select Resim From Katalog Where Id=" + secilensatir;

            SqlCommand komut = new SqlCommand(SqlStr, baglan);

 

            if (baglan.State != ConnectionState.Open)

            {

                baglan.Open();

            }

 

            dr = komut.ExecuteReader(CommandBehavior.SequentialAccess);

 

 

            byte[] byteResim = new byte[50];

            /*MemoryStream ile tampon bellek oluşturuyoruz.

            Böylece pictureBox nesnesi resmi tampon bellekten

            okumasını sağlayacağız.*/

            MemoryStream ms = new MemoryStream();

            BinaryWriter bw = new BinaryWriter(ms);

            long donenDeger;

            long baslangicIndeks = 0;

            while (dr.Read())

            {

                donenDeger = dr.GetBytes(0, 0, byteResim, 0, 50);

                while (donenDeger == 50)

                {

                    bw.Write(byteResim);

                    bw.Flush();

                    baslangicIndeks += 50;

                    donenDeger = dr.GetBytes(0, baslangicIndeks, byteResim, 0, 50);

 

                }

 

                bw.Write(byteResim);

                pictureBox1.Image = Image.FromStream(ms);

                bw.Flush();

                ms.Close();

            }

            dr.Close();

            baglan.Close();

 

              

        }

 

     

    }

}

 

Bir makalenin daha sonuna geldik. Bir sonraki makalede görüşmek dileğiyle. Hoşçakalın. Bahadır ŞAHİN