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.



Şekil 1


Ş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

About Bahadır Şahin

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.

4 comments:

Unknown dedi ki...

nedense bu yazıyı daha önce
http://www.bsenyurt.com/MakaleGoster.aspx?ID=44
ve
http://www.bsenyurt.com/MakaleGoster.aspx?ID=45
sayfalarında okumuş gibiyim.

The Secret dedi ki...

merhaba hocam. sql de name model renk foto kolonlarim var. formda sadece name model renk kolonlarini goruyorum. fotoyu ise sectigim satira ait fotoyo yanda picturebox ta gormek istiyorum. bunu nasil hallederiz?

feridun durakci dedi ki...

Selam benim bir sorum olacak.Cevaplarsanız sevinirim. Ben sql veri tabanını kullanarak bir kütüphane programı yaptım yalnız bunu setup yaparken bir başka bilgisayarda çalıştıramıyorum.Bunu nasıl yapabilirim. Bu konuda bir makale yazarsanız sevinirim.

Adsız dedi ki...

bw.Write(byteResim) satırında ...Kapalı bir Akışa erişilemez. Diye bir hata veriyor bunun nedeni ne olabilir hocam

Öne Çıkan Yayın

GridView da Seçili Satırı DetailsView da Göstermek

Merhaba arkadaşlar bu makalemizde GridView nesnesi ile birlikte DetailsView nesanesini birlikte kullanacağız. GridView da seçili satırın de...