wmismail Posted August 10, 2008 Share Posted August 10, 2008 MSSQL VERİTABANINA RESİM GÖMMEK Bu çalışmamda MSSQL veritabanı içerisine image formda Binary olarak Resim Dosyalarının nasıl gömüleceğini göstereceyim.makaleme başlamadan önce resim dosyalarının veritabanında neden yolunun değilde bizzat neden kendisini tuttuğumuzu anlatmaya çalışacağım Öncelikle veritabanı üzerinde resim adındaki bir alana varchar tipinde bir alan tanımlayarak ve proje içerisindeki resimleride bir klasor içerisinde tutar ve resimlere ait yol bilgisini veritabanındaki bu varchar alanda tutabilirdik ancak şöle bir problem karşımıza çıkabilirdi. 1-eğer proje dosyası içerisinde bulunan resmin klasorunun path’i değiştiğinde projemiz hata verecektir. 2-eğer veritabanımıza eklenen resimler güvenlik açısından gizlilik arzediyorsa böle bir durumda resimleri herkesin kolayca açabileceği bir klasor içerisinde bulundurmak doğru olmayacaktır. *İşte bu bahsetmiş olduğum temel iki sebeb den dolayı resim dosyalarının veritabanına gömülmesi sayesinde çözüm elde edilmiş olur.Şimdi projemizi hazırlamaya başlayalım. 1-MSSQL enterprise manager’ı açıyorum ve orda Test adında bir veritabanı oluşturuyorum Images adındaki tablomuzu da oluşturuyoruz ve içerisine Stream adında bir alan ekliyoruz.tipinide image olarak ayarlıyoruz 2-VS.net de C#.net Projesi Açıyoruz Burada 2 Form ekliyoruz ilk formu aşağıdaki şekilde iki buton ve bir adet DATAGRID ekliyoruz. 3-Kullanacağımız veritabanına baglanmak için projemize using System.Data.SqlClient;// eklememiz gerekiyor. 4-Veritabanına Baglantıyı Sağlamak İçin protected static string ConnectionString//bağlantı stringi geri döner. { get { return "Integrated Security=SSPI;Initial Catalog=Test;Data Source=localhost;"; } } protected static SqlConnection Connection //veritabanına baglanmayı saglar { get { return new SqlConnection(ConnectionString); } } 5-Gridview’i doldurmak için aşağıdaki fonksiyonu oluşturdum protected DataTable TABLOM; protected CurrencyManager cm; protected void Grid_doldur() { SqlConnection con = Connection; con.Open(); try { TABLOM = new DataTable(); SqlCommand cmd = new SqlCommand("select * from Images",con); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(_dataSource); Grid1.DataSource = TABLOM;//Grid dolduruluyor cm = (CurrencyManager)BindingContext[TABLOM]; } finally { con.Close(); } } 6-Form üzerinde OpenFileDialog compenet’i ekleyelim ve Ekle Butonuna Çift Tıklayalım private void EkleButton_Click(object sender, System.EventArgs e) { if (DialogResult.Cancel == OpenFileDialog1.ShowDialog()) { return; } try { byte[] resimdizisi = BitmapDizi(OpenFileDialog1.FileName); /*burada bitmapdizi fonksiyonu sayesinde openfiledialog ileokunan resim dosyası resimdizisi adlı dizi içerisine byte byte gönderilir. */ veritabanınagonder(resimdizisi);/*okunan resim artık resimdizi’si içerisinde binary formdadır.veritabanına gonder fonksiyonu sayesinde bu veri binary olarak veritabanına gonderilir*/ Grid_doldur(); /*son olarak grid uzerinde eklenilenveriyi anında gormemizi saglarız*/ } catch(Exception ex) { MessageBox.Show(ex.Message,APP_TITLE,MessageBoxButtons.OK,MessageBoxIcon.Error); } } 7-BitmapDizi fonksiyonunu oluşturalım protected static byte[] BitmapDizi(string dosyaadi) { using(Bitmap image = new Bitmap(dosyaadi)) { MemoryStream stream = new MemoryStream(); image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); return stream.ToArray(); /*geriye return olarak dizi bir degisken doneriz artık resmimiz binary bir veridir.*/ } } 8-veritabanınagonder Fonksiyonunu oluşturuyoruz protected static void veritabanınagonder(byte[] icerik) { SqlConnection con = Connection; con.Open(); try { SqlCommand insert = new SqlCommand("insert into Images ([stream]) values (@image)",con); SqlParameter imageParameter = insert.Parameters.Add("@image", SqlDbType.Binary); imageParameter.Value = icerik; imageParameter.Size = icerik.Length; insert.ExecuteNonQuery(); } finally { con.Close(); } } 9-Yukarıdaki İşlemlerden sonra veritabanımıza resmimizi binary olarak gömmüş oluruz.şimdi veritabanı üzerinde bulunan binary formdaki bir resmi nasıl geri resim olarak göstereceğimize bakacağız. Projemize eklemiş olduğumuz 2. formu resmi göstermek amacıyla kullancağız.ve üzerine bir adet pictureBox koyacağız. Form1 uzerindeki goster butonuna çift tıklayalım private void goster_Click(object sender, System.EventArgs e) { if (cm == null) { return; } if(cm.Current.GetType() != typeof(DataRowView)) { return; } try { /*DataGrid uzerindeki secili resmi almamı sagladım*/ /*currencyManager nesnesi (cm) dataset uzerindeki konumu tutar*/ DataRowView drv = (DataRowView) cm.Current; byte[] icerik = (byte[])drv["stream"]; MemoryStream stream = new MemoryStream(icerik); Bitmap resim = new Bitmap(stream); Form2 ac = new Form2(); ac.PictureBox1.Image = resim; f.ShowDialog(this); } catch(Exception ex) { MessageBox.Show(ex.Message,“HATA”, MessageBoxButtons.OK, MessageBoxIcon.Error); } } Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.