İlk önce Formunuza 1 adet dataGridView, pictureBox ve Button ekleyin.
Ş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
4 comments:
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.
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?
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.
bw.Write(byteResim) satırında ...Kapalı bir Akışa erişilemez. Diye bir hata veriyor bunun nedeni ne olabilir hocam
Yorum Gönder