Öncelikle Asp.Net 2,0’daki veri erişim kontrollerinden ve Ado.Net’ten biraz bahsedeyim. Asp.Net 2 ile birlikte tanımlanan birçok DataSource kontrolü vardır. Bu kontroller sayesinde de verilerimizin iletişimini sağlayabilir. Ancak verilerimizin yönetimi konusunda Ado. Net’in bizlere sağladığı avantajlardan yararlanmamız gerekmektedir. DataSource nesneleri her ne kadar bize verilerle tümleşik olarak çalışma imkânı verse de, Asp.Net içerisinden direkt olarak verilerimizi kullanmak için Ado.Net nesnelerini kullanmamız gerekecektir. Ado.Net 2, geçmiş sürümüne göre bize çok daha gelişmiş imkânlar sunuyor. Özellikle verilerle uğraşmak bir keyif haline geliyor ve çok daha başarılı, hatasız ve performansı yüksek uygulamalar yapılabiliniyor.
Ado.Net geliştiricileri, yeni sürümünün diğer sürüme göre tam bir devrim olmadığını ancak işlevselliğini arttıracak birçok yeni özellik eklendiğini belirtiyorlar. (tech-ed 2004 ado.net 2 presentation) Bu yeni sürümün geçmişe olan uyumunun elbette %100 olduğu belirtiliyor ve eski tarzda yazılan kodlara aynen devam edilebildiği gibi, yeni sürümün işlevsellik kazandıracak kontrolleri de eklenebiliniyor.
Ado.Net, Asp.Net’in tekelinde bulunan bir teknoloji değildir. Başlı başına bir makale ya da kitap gerektiren büyük ve önemli bir teknolojidir. İşin en güzel tarafı Ado.Net, birçok uygulmada(web ya da windows gibi) tek satır değiştirmeden bile kullanılabilinen bir teknolojidir. Daha öncede söylediğim gibi, Asp.Net 2,0’da, Ado.Net’in hiçbir sınıfına başvurmadan DataSource nesneleri ile verilere ulaşabiliyorduk. Ancak makalemizin genel konusu olan yeni Ado.Net sürümünde kullanabileceğimiz nesneleri, önce eski kontrollerden feyz alarak küçük bir uygulamayla beraber öğrenmeye başlayalım.
Bu makalemde visual studio.net 2005 ve sql server 2005 kullandım. VB.Net ile kodlarımı yazdım...
Tüm kodlarımın açıklamaları, kod aralıklarında bulunmaktadır.
Veritabanımın ismi aspnet2. 2 adet tablo bulunmakta bunlar SICIL ve Departman isimlerine sahip.
Üstteki resim SICIL tablosuna, alttaki resim ise Departman tablosuna ait.
Bu tabloların kullanacağı içerikleri de şu şekilde belirledim.
Kişilerin bilgileri tamamen düzmecedir. Yazarın hayal gücünün en iyi belirtisidir. İzinsiz kullanılabilinir...
Üstteki resim SICIL tablosunun verilerini, alttaki resim Departman tablosunun verilerini gösterir.
Ado.Net Temel Kavramları
Uygulamamızda öncelikle Ado.Net’in temel kavramlarını kısaca inceleyelim. Dataset.aspx isimli bir sayfamız var.
Sayfamızın design kısmındaki kodları şu şekilde;
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="DataSet.aspx.vb" Inherits="_DataSet" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Asp.Net2 & Ado.Net2</title>
</head>
<body bgcolor=LightCyan>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
Sayfamızın code-behind bölümünde ise şu kodları kullanıyoruz.
'veri islemleri yapacagimiz icin
Imports System.Data
Imports System.Data.SqlClient
'cesitli web ayarlarimiz olacagi icin
Imports System.Web.Configuration
Partial Class _DataSet
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'web.config dosyamızdaki baglantı satırımızı tanımlıyoruz
Dim con As String = WebConfigurationManager.ConnectionStrings("AppConnectionString1").ConnectionString
'SICIL isimli tablomuza ulasıyoruz
Dim da As New SqlDataAdapter("SELECT * FROM SICIL", con)
'datasetimizi tanımlıyoruz
Dim ds As New DataSet
'data adapter yardımıyla cektigimiz verileri datasetimize dolduruyoruz
da.Fill(ds, "metin")
'gridview'imizin veri kaynagını dataset olarak gosterıyoruz
GridView1.DataSource = ds
'gridview'imize verileri dolduruyoruz
GridView1.DataBind()
End Sub
End Class
web.config dosyamızdaki kodlarımızda bağlantımızı tanımladık.
<connectionStrings>
<add name="AppConnectionString1" connectionString="Data Source=Yagiz;Initial Catalog=aspnet2;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
Projemizi çalıştırdığımızda görüntü şu şekilde oluşacaktır.
Buraya kadar kullandığımız terimleri kısaca açıklayacak olursam;
ConnectionString, bağlantı satırımızı oluşturmaktadır.
SqlDataAdapter, uygulamamızla veri kaynağımız arasında aracılık görevi yapar.
DataSet, veritabanımızı temsil eder.
Şimdi command nesnesini, kullandığımız uygulama üzerinde küçük bir deneme yapıp tanıyalım.
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.Configuration
Partial Class command
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'yine bir baglantı tanımlıyoruz, bu baglantımız web.config dosyamızdaki aynı baglantı yolu
Dim con As String = WebConfigurationManager.ConnectionStrings("AppConnectionString1").ConnectionString
'conn isminde bir baglantı tanımladık ve yol olarak con degiskenını kullanacagini belirttik
Dim conn As New SqlConnection(con)
'baglantimizi actik
conn.Open()
'bir komut tanımladık
Dim komut As New SqlCommand("SELECT * FROM SICIL", conn)
'sayfamızdaki gridview'in verikaynaginin komutumuz yoluyla olusacagini belirttik
GridView1.DataSource = komut.ExecuteReader()
'gridview'imize verilerimizi doldurduk
GridView1.DataBind()
'baglantimizi kapattik
conn.Close()
End Sub
End Class
Projemizi çalıştırdığımızda gördüğünüz gibi daha önceki yaptığımız işlemle hiçbir farkı yoktur. Komutumuz sadece bir ifadedir. Tek başına hiçbirşey ifade etmez. Harekete geçmesi için çeşitli metodlar kullanılır. Eğer veritabanından veriler getiriyorsak SqlCommand’in ExecuteReader() metodunu kullanırız. Eğer veritabanına birşeyler gönderiyorsak ExecuteNonQuery kullanırız. Bu çalıştırmada Update, Delete, Insert gibi SQL deyimleri için geçerlidir.
Şimdi ise eski kontrollerimizde sonuncusu olan SqlDataReader’ı yine aynı örneğimiz üzerinde inceleyelim.
Projeme Datareader.aspx isminde bir sayfa daha ekliyorum. Sayfama bir gridview koyuyorum ve şu kodları yazıyorum;
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.Configuration
Partial Class Datareader
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'baglanti cumlemizi webconfig dosyamızla butunlestırıyoruz
Dim con As String = WebConfigurationManager.ConnectionStrings("AppConnectionString1").ConnectionString
'baglanti nesnemizi, baglanti cumlemıze atıyoruz
Dim conn As New SqlConnection(con)
'baglantimizi acıyoruz
conn.Open()
'bir komut nesnesi olusturuyoruz
Dim komut As New SqlCommand("SELECT * FROM SICIL", conn)
'bir datareader nesnesi olusturuyoruz
Dim dr As SqlDataReader
'komutnesnemizin vericekme metoduyla datareaderimizi butunlestırıyoruz
dr = komut.ExecuteReader()
'datareaderımız her veriyi okuyusunda
While dr.Read()
'sayfamıza sadece ADI ve SOYADI alanını getırıyoruz
Response.Write(dr("ADI").ToString + " " + dr("SOYADI").ToString + "<br>")
End While
'baglantımızı kapıyoruz
conn.Close()
End Sub
End Class
Çalıştırdığınızda şunu göreceksiniz;
Kayıtları elde etmek için datareader’ımızın read() metodu kullanılır. Read metodu, datareader nesnesindeki ilk kaydı getirir. Dr(“ADI”) diyerek getirmek istediğimiz kaydın alan ismini yazdık, istersek alan numarasını da verebilirdik dr(1) gibi. DataReader nesnemizle verileri istediğimiz formatta getirebilir ve gösterebiliriz. Böylelikle Connection, Command, DataAdapter, DataSet ve DataReader nesnelerini tekrardan tanımış olduk. Artık Ado.Net 2 ile gelen yeni özellikleri tanımaya başlayalım. İşte mevcut Ado.Net yapımızı zenginleştirmeye yönelik yeni özellikler ve işleyişleri...
Ado.Net 2 Yenilikleri
DataTable: Ado.Net’in eski sürümünde de bulunan DataTable nesnesi, bu sürümde daha farklı olarak kullanılabiliniyor. Buna “doğrudan kullanım” tekniği denilmiş. Bu teknikle, DataSet olmadan verileri kaynağımızdan çekip DataTable’a aktarabiliyoruz. Böylece elimizdeki verileri doldurduğumuz bir tablomuz oluşmuş bulunuyor. Yine var olan projemizde tablom.aspx isimli bir sayfa oluşturuyoruz(Neden her sayfamızı command, datareader vs isimleriyle ekledikte buna farklı bir isim verdik diye düşünüyorsunuzdur sanırım, eğer datatable.aspx ismi verirsek datatable classından yararlanamayız. Bu yüzden isim verirken aynı isme sahip bir class olmadığından emin olmamız gerekmektedir. Ayrıca system.data ve system.data.sqlclient sınıflarını import etmeyi unutmuyoruz.), bir gridview ekliyoruz ve code-behind kısmına şu kodları yazıyoruz;
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'herzamanki gibi baglantimizin web.config kaynaklı oldugunu belırtıyoruz
Dim con As String = WebConfigurationManager.ConnectionStrings("AppConnectionString1").ConnectionString
'bir datatable tanımlıyoruz
Dim veritablom As New DataTable("Tablo")
'baglanti nesnesi tanımlayıp baglantımı acıyorum
Dim conn As New SqlConnection(con)
conn.Open()
'bir command nesnesi olusturup datareader ile verileri cekip gridview'e dolduruyorum
Dim com As New SqlCommand("SELECT * FROM SICIL", conn)
Dim dr As SqlDataReader = com.ExecuteReader
veritablom.Load(dr)
GridView1.DataSource = veritablom
GridView1.DataBind()
conn.Close()
End Sub
Projemizi çalıştırıyoruz ve diğer uygulamalarımızdan farksız bir şekilde çalıştığını görüyoruz. Yukarıdaki ilk görüntü resmimizden farksız bir sonuç vericektir. Tekrar tekrar aynı resmi koyup vakit kaybetmek ve görüntü kalabalığı yapmak istemiyorum, yeni özelliklerle devam ediyorum J
DataTable WriteXml ve ReadXml: .Net ortamında veriyle ilişkisi olan hernesnenin XML ile de ilişkilerini geliştirmek zorundadır. Doğal olarak bu kural, yenilenen DataTable nesnesi içinde geçerlidir. DataTable’ın XML ile ilişkilendirilmesi, DataSet’inki gibidir. DataTable’a ait WriteXml, WriteXmlSchema, ReadXmlSchema, ReadXml gibi yeni metotlar Ado.Net 2’de kazandırılmıştır. Şimdi projemize datatable_xml.aspx isminde bir sayfa ekliyoruz, sayfamıza iki adet button yerleştiriyoruz. Birinin text özelliği “oku”, diğerinin ise “yaz” olacak. “Oku” yazılı buttona tıkladığımızda verileri okuyacak, “Yaz” yazılı buttona tıkladığımızda ise verileri bizlere gösterecek. Tabiki bunun için de sayfamıza gridview eklememiz gerekiyor. Code-behind sayfamıza şunları yazıyoruz;
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim con As String = WebConfigurationManager.ConnectionStrings("AppConnectionString1").ConnectionString
Dim veritablom As New DataTable("tablo")
Dim conn As New SqlConnection(con)
conn.Open()
Dim com As New SqlCommand("SELECT * FROM SICIL", conn)
Dim dr As SqlDataReader = com.ExecuteReader
veritablom.Load(dr)
'datatable'ımızın xmlyazma metoduyla yenı bır xml dokumanı olusturuyoruz
veritablom.WriteXml("c:\veriler\deneme.xml")
'datatable'ımızın xmlşema metoduyla şemamızı da belirliyoruz
veritablom.WriteXmlSchema("c:\veriler\deneme.xsd")
conn.Close()
End Sub
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim veritablom As New DataTable("tablo")
'yukarıdakının tam tersını yapıp once semamızı okuyoruz
veritablom.ReadXmlSchema("c:\veriler\deneme.xsd")
'daha sonrada yazdıgımız veriyi okuyoruz
veritablom.ReadXml("c:\veriler\deneme.xml")
'okudugumuz veriyi gridview'de gosterıyoruz
GridView1.DataSource = veritablom
GridView1.DataBind()
End Sub
Eğer C:’nin içerisinde veriler isimli bir klasör oluşturduysak, oku buttonuna bastığımızdaki işlemler, önce o klasöre veriler.xml ve veriler.xsd isimli 2 dosya oluşturacak. Daha sonra yaz buttonuna basıldığında gridview yardımıyla verilerimiz bize gösterilecektir. Buraya yine görüntü resmini koymuyorum çünkü yukarıda yaptığımız işlemlerden farksız olarak görünecektir uygulama sonucumuz. Dilerseniz deneme.xml’e bakarak xml dosyamızın içeriğini görebilirsiniz. Tıpkı veritabanımızdaki gibi ad,soyad,giriş,çıkış,departman ve semt etiketleriyle oluşan bir xml dosyası göreceksiniz. Bu etiketlerin tekrarlamaları, veri kaynağından gelen verilerin kendilerini ve alan isimlerinin sayısı yani kayıt sayısı kadar devam etmektedir. Böylece xml bilgimizide pekiştirmiş olduk J
Binary Serialization: Serialize’nin kelime anlamı “dizileme, dizilemek, dizi haline getirmek”tir. Serialization ise yazılım terminolojisine göre “nesnelerin verileriyle birlikte saklanması”dır. Tüm nesneler dosya haline saklanır ve bildiğimiz gibi nesneler, class yani sınıflardan türetilir. Burada saklanan yaratılmış nesnenin kendisidir. Peki sınıftan nesne üretilirken, serialization işlemine neden başvuralım diye düşünüyorsunuzdur. Nesneler verileri ile birlikte saklanmaktadır. Eğer bir kullanıcımızın bilgilerini saklamak istiyorsak bu tip bir yöntem kullanabiliriz. Serialization’ı, bir nesneyi firewall’dan geçirmek için bile kullanabiliriz. XML Serialization bu işlemi yapmamızda bize yardımcı olur. Kısaca şöyle söyleyeyim; bir nesneyi içindeki verilerle bir yerden başka bir yere taşımak istiyorsak serialization’ı kullanabiliriz. Özellikle database uygulamalarında son derece kullanışlıdır bu yöntem. Ado.Net’in eski sürümlerinde dataset sayesinde serialization yapabiliyorduk ancak bu xml serialization’du. Yani nesne ve verileri xml formatında saklıyorduk. Ancak bu, fazla dosya boyutu demekti. Yeni sürüm ile birlikte en başta dediğimiz gibi performansı arttırmaya yönelik gelişmelerden biri de, dataset’in serialization seçeneğini belirtebilmesidir.
Şimdi yine küçük bir örnekle bu sistemi tanıyalım. Serialization.aspx isimli bir sayfa ekleyelim projemize. Bu sayfamıza bir button ve bir gridview ekliyoruz. Ekleyeceğim kodların bir kısmı yukarıdaki diğer uygulamalarda defalarca açıkladığım kodlar. Artık neredeyse ezberledik J Code-behind kısmına şu kodları ekliyoruz. Bize farklı gelecek kodların açıklamaları elbette satırların aralıklarında J
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.Configuration
'binary kullanacagımız ıcın
Imports System.Runtime.Serialization.Formatters.Binary
'dosya kullanacagımız ıcın
Imports System.IO
Partial Class serialization
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim con As String = WebConfigurationManager.ConnectionStrings("AppConnectionStrings1").ConnectionString
Dim da As New SqlDataAdapter("SELECT * FROM SICIL", con)
Dim ds As New DataSet
da.Fill(ds, "metin")
GridView1.DataSource = ds
GridView1.DataBind()
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
'gridview'e eklenen verileri tur degisimi yaparak datasete aktarıyoruz
Dim ds As DataSet = CType(GridView1.DataSource, DataSet)
'binary sınıfını kullanarak bir nesne olusturuyoruz
Dim binfor As New BinaryFormatter
'IO sınıfını kullanarak, c'nin icinde serialize isimli klasorun ıcıne serialveri isimli bir dosya olustuyoruz
Dim str As New FileStream("c:\serialize\serialveri.bin", FileMode.CreateNew)
'burada str ismindeki dosyamızı datasetten gelen verilerle beraber serialize edip dolduruyoruz
binfor.Serialize(str, ds)
End Sub
End Class
Çıkan sonucumuza c’nin içindeki serialize klasörünün içinde bulunan serialveri.bin’i notepad ile açarak ulaşabiliriz.
Sonuç aşağıdaki gibi olup, xml formatındadır ve 5 KB’dır. (Benim verilerimi kullandığınızı varsayıyorum. J)
Şimdi ise bu işlemi Ado.Net 2 terminolojisine göre yapalım. Sadece bir satır ekliyoruz.
Buttona’a tıkladığımızda tanımladığımız dataset satırının altına şu kodu ekliyoruz;
ds.RemotingFormat = SerializationFormat.Binary
Ayrıca yolumuzu da şu şekilde değiştirebiliriz, böylece sonucu ayrı bir dosya olarak inceleyebiliriz.
Dim str As New FileStream("c:\serialize\serialveri_binary.bin", FileMode.CreateNew)
Böylece ne tür bir serialization yapacağımızı belirtiyoruz. 2 seçeneğimiz var. Biri yaptığımız binary, diğeri ise XML’dir. Hiçbirşey belirtmezsek default olarak XML’i kabul eder. Bu şekilde uygulamamızı çalıştırırsak serialization klasörümüzüm içine serialveri_binary.bin isminde yeni bir dosyanın geldiğini görürüz. Dosyamızı notepad ile açtığımızda ise çok farklı semboller ve ifadelerle karşılaşırız. Bunlar verilerimizin binary formatına çevrilmiş halidir. Veritabanımızdaki verileri daha fazla şişirerek aradaki performans farkını daha detaylı inceleyebilirsiniz J
Deserialization: Serialize edilen nesneleri tekrar kullanabilir hale getirmeye denir. İşlem oldukça basit işler; burda dikkat etmemiz gereken tek şey nesne nasıl serialize edildiyse o şekilde deserialize etmemiz gerektiğidir. Yani binary ile serialize ettiysek binary ile, XML ile serialize ettiysek XML ile deserialize etmemiz gerekir. Projemize deserialization.aspx isimli bir sayfa ekliyoruz. Gridview ve bir button eklemekten kaçınmıyoruz J Kodlarımız şöyle;
Imports System.Data
Imports System.Data.SqlClient
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO
Partial Class deserialization
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
'bir dataset ve binaryformatter tanımlıyoruz
'filestream nesnemiz ile serialize edilmis olan dosyamızı,
'deserialize edip datasete yukluyoruz
'remotingformat ozellıgıne binary ozellıgını atıyoruz cunku verimiz bu formatte serialize edilmisti
Dim ds As New DataSet
Dim binfor As New BinaryFormatter
ds.RemotingFormat = SerializationFormat.Binary
Dim str As New FileStream("c:\serialize\serialveri_binary.bin", FileMode.Open)
'datasetimizi bir gridview sayesinde goruntuluyoruz
ds = CType(binfor.Deserialize(str), DataSet)
GridView1.DataSource = ds
GridView1.DataBind()
str.Close()
End Sub
End Class
Projemizi çalıştırdığımızda gridview’imizin verileri nasıl yedeklediysek o şekilde gösterdiğini görüyoruz.
Gridview’imiz, deserialize edilmiş dataset nesnemizi verileri ile birlikte tanıyor.
Böylece makalemizin de sonuna geldik. Umarım eski nesneleri pekiştirip yeni nesneleri şöyle basitte olsa öğrenime kolay bir hale getirmişimdir.
Faydalı olacağına inanıyorum. Sorularınızı mail adresime iletebilir, çok kısa sürede yanıt alabilirsiniz :)