ASP.NET'de Linq ve Linq-to-Sql Classes ile veritabanına binary data kaydetmek ve okumak

ASP.NET ve Sql Server kullanıyorsak veritabanına binary data kaydetmeyi ve okumayı Linq ve linq-to-Sql ikilisi kullarak yapmak kolaylığı açısından en mantıklı seçim olur diyebilirim. Visual Studio veya Visual Web Developer 2008 Express Edition programını açıp Linq ile veritabanı işlemlerine başlayalım.
Menüden File -> Web Site sekmesini seçip ASP.NET Web Site projemizi C# dilini seçerek projemizi yaratılım. Default.aspx sayfasından binary data kaydetmek için bir tane FileUpload kontrolü ekleyelim. Default.aspx sayfasının içeriği:
<form id="form1" runat="server">
    <asp:FileUpload ID="FileUpload1" runat="server" />
	<asp:Button ID="Button1" runat="server" Text="upload" onclick="Button1_Click" />
</form>
Button kontrolüne onclick="Button1_Click" yordamı ile tıklama olayını ekledik. C# dosyamızda Button1_Click fonksiyonunu daha sonra yazacağız. Buttona tıkladığımızda seçtiğimiz dosyayı veritabanına kaydetmek ve Linq ve Linq-to-Sql Classes kullanacağımız için önce bir veritabanı oluşturmamız daha sonra Linq-to-Sql Classes oluşturmamız gerekiyor. Veritabanını oluşturmak için Solution Explorer penceresinden projemizin ana dizinine sağ tıklayarak Add New Item seçeneğini, açılan pencereden Sql Server Database'i seçip veritabanına bir isim verelim ve projeye veritabanı ekleme işlemini tamamlayalım. Şimdi veritabanında binary data kaydetmek için bir tablo oluşturmamız gerek. Yine Solution Explorer penceresinden veritabanına sağ tıklayıp Open sekmesini seçelim. Açılan yeni pencereden "Tables" klasörüne sağ tıklayıp Add New Table seçeneğini seçelim ve tablonun özelliklerini aşağıdaki gibi ayarlayalım.

linq-binary-data-linq-to-sql-classes-asp.net-veritabani-table

Kırmızı renkte olan kısımları ayarlamayı unutmayalım. Şimdi Linq ile veritabanı işlemleri yapmak için Linq-to-Sql Classes oluşturalım:

Adım 1 (İsmini MyDataClassesDataContext seçtim):

linq-binary-data-linq-to-sql-classes-asp.net-veritabani-context

Adım 2 (Tabloyu seçip sürükleyerek sağdaki pencereye bırakıyoruz) :

linq-binary-data-linq-to-sql-classes-asp.net-veritabani-table-context

Projemizin dosyaları bu işlemlerden sonra şuna benzer bir şekilde olmalı:

linq-binary-data-linq-to-sql-classes-proje

MyDataClassesDataContext isimli Linq-to-Sql Classes dosyalarımızı oluşturduktan sonra artık Linq ile veritabanı işlemlerini rahatlıkla yapabiliriz. Oluşturduğumuz Linq-to-Sql Classes sayesinde veritabanına bağlantı kontrolü, insert, delete, select ve update işlemleri büyük ölçüde kolaylaşıyor.

MyDataClassesDataContext (Linq-to-Sql Classes) ve Linq ile veritabanına binary data kaydetme işlemi

Sıra Default.aspx.cs sayfasını kodlamaya geldi. Default.aspx sayfasına eklediğimiz FileUpload kontrolünü kullanmak için upload button'a click olayını eklemiştik. Şimdi Button1_Click fonksiyonunu aşağıdaki gibi kodlayalım:
protected void Button1_Click(object sender, EventArgs e)
  {
    // gönderilen dosyayı değişkene byte olarak kaydediyoruz
    var uploaded_file_bytes =  FileUpload1.FileBytes;
    // Linq-to-Sql Classes nesnemizi oluşturuyoruz 
    MyDataClassesDataContext mydatacontext = new MyDataClassesDataContext();
    // Tablodaki file sütunu (alanı) temsil eden file class'ına gönderilen dosyay
	// parametre olarak yollayarak yeni bir file nesnesi oluşturuyoruz.
    file file = new file(){  file_bytes = uploaded_file_bytes };
    // Yarattığımız yeni dosyayı DataContext'imize insert ediyoruz.
    mydatacontext.files.InsertOnSubmit(file);
    // Yapılan değişiklikleri kalıcı yapıyoruz.
    mydatacontext.SubmitChanges();
  }
Web Site Projemizi Run edip Default.aspx sayfasından dosyları veritabanına bir kaç dosya upload edelim (Ben resim eklemeyi tercih ettim):

linq-binary-data-linq-to-sql-classes-asp.net-veritabani-dosya-yukleme

MyDataClassesDataContext (Linq-to-Sql Classes) ve Linq ile veritabanına binary data okuma işlemi

Veritabınına biraz binary data kaydettikten sonra okuma işlemine geçelim: Linq ile binary data okumak oldukça basit. Default.aspx.cs dosyamızda Page_Load fonksiyonuna aşağıdaki kodları ekleyelim:
 protected void Page_Load(object sender, EventArgs e)
 {
	// Linq-to-Sql Classes nesnemizi oluşturuyoruz 
    MyDataClassesDataContext mydatacontext = new MyDataClassesDataContext();
    // Linq ile Files tablosundan select işlemi gerçekleştiriyoruz.
    // Fisrt ile tablonun ilk elamanın alıyoruz.
    // Dolayısıyla sadece bir tane dosya seçmiş oluyoruz
    var binarydata = (from d in mydatacontext.files
                          select d).First();
    // İstemciye yollanacak verinin tipini ayarlıyoruz. 
    Response.ContentType = "image/png";
    // BinaryWrite fonksiyonu ile istemciye resmi byte olarak yolluyoruz.
    // ToArray fonksiyonunu byte dizisine çevirmek için kullandık
    Response.BinaryWrite(binarydata.file_bytes.ToArray());
  }	
 
Kodumuzu çalıştırdığımızda tarayıcıdan yüklediğimiz resmi görebiliriz:

linq-binary-data-linq-to-sql-classes-asp.net-veritabani-okuma

Gördüğünüz gibi Linq ve Linq-to-Sql Classes ile veritabanına binary data kaydetme ve okuma işini ASP.NET ortamında yapmış olduk. Bir sonraki kısım GridView kontrolüyle birlikte Linq, binary data ve linq-to-sql Classes kullanmayla alakalı olacak.

GridView konrolü kullanarak MyDataClassesDataContext (Linq-to-Sql Classes) ve Linq ile resimleri görüntülemek

Linq ve Linq-to-Sql Classes ile ASP.NET'de binary data kaydetme ve okuma işlemlerini şekilde halletmiş olduk. Şimdi binary data okuma işlemibi biraz geliştirelim. Default.aspx sayfamıza aşağıdaki gibi bir GridView kontrolü ekleyelim. Kontrolde veritabanına girdiğiniz binary data'yı (resimleri) göstereceğiz. Bunun için GridView kontrolüne ImageField ekleyeceğiz. Ve resmin DataImageUrlField 'sine değişken bir QueryString (sorgu katarı) yazacağız. (Default.aspx?id=1 gibi).
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true">
    <Columns>
        <asp:ImageField DataImageUrlField="id" 
            DataImageUrlFormatString="Default.aspx?id={0}" HeaderText="image">
        </asp:ImageField>
    </Columns>     
</asp:GridView>
 
DataImageUrlFormatString kısmına yazdığımız ifade GridView kontrolüne bağlanan verilere göre her satırda değişecek. (Default.aspx?id=1, Default.aspx?id=2 ... gibi) Hangi alanın (sütunun) id olduğunu DataImageUrlField ifadesinde ayarlıyoruz. GridView resimleri göstermek için Default.aspx sayfasına her resim için istekte bulunacak. Bu yüzden biz de Default.aspx sayfasının buna göre if kontrüyle id değişkinin set edilip edilmediğini kontrol edeceğiz ve edilmiş ise daha öncekine benzer bir şekilde resmin binary data'sını istemciye yollayacağız. Default.aspx sayfasında yapacağımız değişiklik:
 protected void Page_Load(object sender, EventArgs e)
 {
        // Bu kısımda GridView Kontrolüne tablodaki verileri bağlıyoruz.

        // Linq-to-Sql Classes nesnemizi oluşturuyoruz 
        MyDataClassesDataContext mydatacontext = new MyDataClassesDataContext();

        // Tüm resimleri linq ile veritabanından seçiyoruz.
        var binarydata = (from d in mydatacontext.files
                          select d);
        // GridView kontrlüne verileri bağlıyoruz.
        GridView1.DataSource = binarydata;
        GridView1.DataBind();


        // Bu kısım GridView kontrolünün yaptığı istekler (Default.aspx?id=1 gibi) 
        // için cevap verecek

        // id değişkenin olup olmadığını kontrol ediyoruz.
        if (Request.QueryString["id"] != null)
        {
            // id değerini okuyoruz
            int id = Convert.ToInt32(Request.QueryString["id"]);
            // id değerine göre linq sorgusu yapıyoruz.
            var data = (from d in mydatacontext.files
                        where d.id == id
                        select d.file_bytes);
            // İstemciye cevabı yoluyoruz
            Response.ContentType = "image/png";
            Response.BinaryWrite(data.Single().ToArray());
        }
  }	
 
Bir kaç resim girdikten sonra çıkan sonuç:

linq-binary-data-linq-to-sql-classes-asp.net-veritabani-gridview-okuma

yazan Zülküf Küçüközer tarih   7th September 2009
primary key words  Linq | Linq-to-sql | Veritabanı | Binary data okunma  13461
secondary key words  Veritabanı işlemleri | Asp.net | Gridview
Bu yazı hakkında yorum yapılmamış.