Jump to content

C#.net Ile Sql İçerisine Resim Kaydetmek.


wmismail

Recommended Posts

Kısaca Blob: Sql Server bize büyük boyutlardaki ikili (Binary) ve text bilgilerini saklamamamıza olanak tanır. Image , Text gibi büyük miktarda kayıt saklayabilen veri yapısına Blob (Binary Large Object) denilmektedir.

Böyle bir özelliğin var olmasının güzel olabileceğigibi bazı dez avantajlarıda vardır. Örneğin sorgulama işlemlerimizde performans kaybı olacağını sanırım tahmin edersiniz. Size tavsiyem bu tür veri türlerini kullanacaksanız tablonuzun dizayn esnasında en sonlarda tanımlayın.

Ben projeme Blob adında database yarattım. ve Resimde gördüğünüz gibi Personel adında bir tablo ve usp_PerEkle adındada bir insert procedure ü ekledim.

DataBase.JPG

StoreProcedure.JPG

Visual studio nuzu kullanarak yeni bir Windows Application projesi oluşturun.

ilk İşlem Projemizin içeriği FileStream sınıfını kulanarak resm dosyamızı bellek üzerinde açacağız ve BinaryReader sınıfı ile byte bye okutup byte[] türünden bir değişkene atarak veri tabanımıza kayıt ettireceğiz

ikinci İşlem MemoryStream Sınıfını kullanarak DataBase den okuttuğumuz blob veriyi Bellekte açıp yeni bir Bitmap içerisine atayarak PictureBox ımız içerisinde göstereceğiz.

Örnek programımızın içerisinde Kullanılan windows kontroller sırası ile

Kontrol Name

Listbox lbxPersonel

Textbox txtPersAdSoyad

Button btnYeni

Buttun btnResimAc

PictureBox imgPers

Tasarım Görüntüsü:

appBlob.JPG

Programın Kodları:

İlk olarak database imize bağlanıp ListBox ımızı dolduralım ve TextBox ve PictureBox ımızın DataBindins Özelliğini kullanarak DataTable mıza Bind edelim. Bu sayede ListBox içindeki herhagi bir kayda tıkladığımızda Textbox ın ve PictureBox ın içini dolduracağız.

SqlDataAdapter Da;

SqlConnection Con;

SqlCommand Com;

DataTable Dt;

void Bind()

{

Con = new SqlConnection(Genel.ConnectionString);

Da = new SqlDataAdapter("Select * from Personel",Con);

Dt = new DataTable();

Da.Fill(Dt);

lbxPersonel.DataSource = Dt;

lbxPersonel.DisplayMember = "PersAdSoyad";

lbxPersonel.ValueMember = "PersID";

txtPersAdSoyad.DataBindings.Clear();

imgPers.DataBindings.Clear();

txtPersAdSoyad.DataBindings.Add("Text", Dt, "PersAdSoyad");

/* pictureBox ımızın Image özelliğinde resmimizi gösterebilmemiz için binary olan bilgiyi resme çeviren “ResimFormat” event ını yazıyoruz.

*/

Binding bdResim = new Binding("Image", Dt, "Resim");

bdResim.Format += new ConvertEventHandler(ResimFormat);

imgPers.DataBindings.Add(bdResim);

}

// Formun Load evet içinde Bind metodumuzu çağırıyoruz.

private void Form1_Load(object sender, EventArgs e)

{

Bind();

}

private void ResimFormat(object sender, ConvertEventArgs e)

{

// e.Value DB den gelen orjinal value

try

{

Byte[] img = (Byte[])e.Value;

System.IO.MemoryStream ms = new System.IO.MemoryStream();

ms.Write(img, 0, img.Length);

Bitmap bmp = new Bitmap(ms);

ms.Close();

e.Value = bmp;

}

catch

{

/* Eğer database e resim kaydedilmemiş ise boş bir resim oluşturup value olarak gönderiyoruz. Eğer yapmazsak program hata verecektir

*/

Bitmap b=new Bitmap(10,10);

e.Value = b;

}

}

Faydalı olabileceğini düşündüğüm “Genel” Adında bir class yarattım SqlConnection nın ConnectionString bilgisini buradan aldırıyorum.

class Genel

{

public Genel() { }

static public string ConnectionString

{

get

{

return "Server=.;DataBase=Blob;UID=Adnan;PWD=deneme123";

}

}

}

btnYeni adındaki buttonum üzrinde küçük bir işlem yapıyorum. butonKontrol adında bir bool değişken tanımlayıp false/true durumuna göre text özelliklerini değiştirip işlem sıralarını belirliyorum.

bool ButonDurum;

private void btnYeni_Click(object sender, EventArgs e)

{

switch (ButonDurum)

{

case false:

btnYeni.Text = "Kaydet";

ButonDurum = true;

txtPersAdSoyad.Text = "";

imgPers.Image = null;

txtPersAdSoyad.Focus();

break;

case true:

btnYeni.Text = "Yeni";

ButonDurum = false;

Con = new SqlConnection(Genel.ConnectionString);

Com = new SqlCommand("usp_PerEkle", Con);

Com.CommandType = CommandType.StoredProcedure;

Com.Parameters.AddWithValue("@PersAdSoyad", txtPersAdSoyad.Text.Trim());

if (fdlg.FileName != "")

{

//Resim Seçilmiş ise resim cevir metodu devreye girerek byte türünden veriyi DB ye Gönderiliyor

Com.Parameters.AddWithValue("@Resim", ResimCevir(fdlg.FileName));

}

else

{

//Eğer resim seçilmemiş ise boş bir byte verisi gönderiyoruz.

Com.Parameters.AddWithValue("@Resim", new byte[] { });

}

try

{

Con.Open();

Com.ExecuteNonQuery();

}

catch (SqlException ex)

{

MessageBox.Show("Hata:" + ex.Message);

}

finally

{

Con.Close();

}

Bind();

break;

}

}

//Sql Server Image veri türü içerisine gömeceğimiz resmi

private byte[] ResimCevir(string path)

{

byte[] Resim;

try

{

System.IO.FileStream Fs =

new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);

System.IO.BinaryReader Br = new System.IO.BinaryReader(Fs);

Resim = Br.ReadBytes((int)Fs.Length);

Br.Close();

Fs.Close();

}

catch

{

Resim = null;

}

return Resim;

}

btnResimAc butonumuzu kullanarak ekleyeceğimiz resmimizi seçip PictureBox içinde gösteriyoruz. PictureBox ımızın SizeMode Özelliğini StretchImage yapmayı unutmayınız.

OpenFileDialog kontrolü yaratıyoruz. Ve seçilen resmi bmp değişkenimiz içinde kullanarak resmi bellekte oluşturup PictureBox kontrolünün Image özelliğine atıyoruz.

OpenFileDialog fdlg = new OpenFileDialog();

Bitmap bmp;

private void btnResimAc_Click(object sender, EventArgs e)

{

fdlg.Title = "Resim Seçiniz";

fdlg.InitialDirectory = @"C:\";

fdlg.Filter = "JPG Resimler (*.jpg)|*.jpg";

if(fdlg.ShowDialog()==DialogResult.OK)

{

bmp = new Bitmap(fdlg.FileName);

imgPers.Image = bmp;

}

}

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...