Veritabanı yerine XML!
Veritabanı yerine XML!
Merhabalar
Arkadaşlar, Özellikle .Net ile birlikte gelen yeni özelliklerden bir tane
serialization işlemi, eminimki daha önceden mutlaka bir yerlerde
duymuşsunuzdur okumuşsunuzdur, belkide biliyorsunuzdur ancak ben bu
yazımda seriileştirme işlemini ufak bir tabloda nasıl
kullanabileceğiniz üstünde duracağım. Yani çok az bir veriniz
varsa bu veriyi bir Veritabanı sistemi yerine direk serialization
kullanarak saklamanın yöntemini anlatacağım. Hızlıca
başlayalım hemen yeni bir Windows Uygulaması açın, ismine
de Serialize yazın. Oluşan formun üst tarafına 4 tane button,
alt tarafına ise bir adet DataGrid yerleştirin ve butonların
isimlerini aşağıdaki resime göre düzenleyin.

Şimdi
aslında ilk yapacağımız iş bu DataGrid de
görüntülenecek olan basit şekildeki DataSet i oluşturmak, Dataseti
bir kere oluşturduktan sonra aslında bir daha bu buton a gerek
kalmıyor. Data Set butonua iki kere tıklatın ve açılacak
olan bölüme şu kodları yazın.
Dim dt As DataTable
Private Sub Button1_Click(ByVal
sender As System.Object,_
ByVal e As System.EventArgs) Handles
Button1.Click
dt = New
DataTable("Kullanici")
Dim
dc(2) As DataColumn
dc(0) = New
DataColumn("KullaniciId")
dc(0).DataType =
System.Type.GetType("System.Int16")
dc(0).AutoIncrement = True
dc(0).AutoIncrementSeed = 1
dc(0).AutoIncrementStep = 1
dc(1) = New
DataColumn("AdiVeSoyadi")
dc(1).DataType =
System.Type.GetType("System.String")
dc(2) = New
DataColumn("Yasi")
dc(2).DataType =
System.Type.GetType("System.Int16")
dc(2).DefaultValue = 0
dt.Columns.AddRange(dc)
Dim dr1
As DataRow
dr1 = dt.NewRow
dr1(1) = "Cenk Caglar"
dr1(2) = 25
Dim dr2
As DataRow
dr2 = dt.NewRow
dr2(1) = "Atakan Kesler"
dr2(2) = 27
dt.Rows.Add(dr1)
dt.Rows.Add(dr2)
DataGrid1.DataSource = dt
End Sub
Bu
bölümde yapılan şey sadece bir DataTable oluşturmak,
aslında önemli olan DataGrid de görüntülenecek olan Tablonun şema
(schema) sını oluşturabilmek ve içine varsayılan olarak iki
tane daha data yazıyorum.
Adım
adım neler yaptığımı incelersek, ilk önce Butona
Clicklenme prosedüründende önce bir DataTable türünden dt değişkenini
oluşturuyorum, daha sonra 3 elemanlı bir DataColumn arrayi
oluşturuyorum ilk kolon un adını KullaniciAdi yapıyorum, bu
kolonun veri türünü belirliyorum ve bu kolonun içindeki rakamların tek tek
artması gerektiğini artmaya 1 den başlamaları
gerektiğini ve tek tek artmaları gerektiğini anlatıyorum,
ikinci kolonun adını AdiVeSoyadi yapıyorum ve veritürünün String
olması gerektiğini anlatıyorum, üçüncü kolonun adi ise Yasi,
veritürünü yine Int16 şeklinde olmaını istiyorum ve
varsayılan değerine 0 diyorum, yani kullanıcı eğer
buraya bir değer girmezse bu bölüm boş kalmasın en kötü 0
yazılsın diye. Daha sonra bu kolonları DataTable nin Columns
propertysindeki AddRange metodu ile DataTableye ekliyorum.
Sırada
bu şemasını oluşturduğum tabloya veri eklemeye geldi,
iki tane veri ekliyorum dikkat ederseniz ilk sütüna veri eklemiyorum çünkü
orası otomatik artan veri türünde. Son olarakta bu yeni
oluşturduğum iki satırı DataTable nin Rows özelliğinin
Add metodunu kullanarak DataTableye ekliyorum. En son olarakta bu DataTablenin
DataSet te görüntülenmesini sağlıyorum.
Bu
bölüme kadar sadece DataTable oluşturduk, sırada seriileştirme
işlemi var, seriileştirme işlemi bir formatter
yardımıyla verilerin başka bir biçime dönüştürülmesini
sağlayan yapıdır, aslında seriileştirme işleminde
dikkat edilmesi gereken nokta sadece Public olan alanların
seriileştirildiğidir, şimdi benim amacım aslında bir
Component olan DataSeti seriileştirmek, ilk olarak XML yöntemini
kullanacağım, bir DataSet i XML seriileştirmek demek, DataSet
ile birlikte içindeki bütün yapıların HDD ye bir dosya olarak
yazılması demek, bunu illa bir dosyaya yazmanıza gerek yok
isterseniz başka bir şekildede kullanabilirsiniz (örneğin
Remoting :) XML seriileştirme çok kolaydır, ilk iş olarak iki
tane NameSpace mizi en yukarıya Imports deyimi ile yazın.
Imports System.Xml.Serialization
Imports System.IO
Daha
sonra yapacağınız işlem buton iki ye click işlemine
gitmeniz. Buraya aşağıdaki kodu yazın.
Private Sub Button2_Click(ByVal
sender As System.Object,_
ByVal e As System.EventArgs) Handles
Button2.Click
Dim ds As DataSet = New
DataSet
ds.Tables.Add(DataGrid1.DataSource)
Dim xm As XmlSerializer = New
XmlSerializer(GetType(DataSet))
Dim stw
As TextWriter = New
StreamWriter("db.xml")
xm.Serialize(stw, ds)
stw.Close()
End Sub
Burada
neler yaptığımızı inceleyelim, ilk iş olarak bir
DataSet tanımlıyorum ismi ds, neden DataSet
tanımladığımı hemen belirteyim çünkü DataTable XML
olarak serialize edilemez, peki neden diye soracak olursanız
aşağıdaki resimlere bakmanız yeterli olacaktır.


Gördüğünüz
gibi DataTable türetilirken DataSet gibi IXmlSerializable interface si ile
implement edilmemiş bundan dolayı DataTable XML olarak serialize
edilemez.
Devam
edelim, DataSet e yeni bir Table ekledim ve bu tabloda DataGriddeki o andaki
veriler, bunu yapmamın nedeni, kullanıcı veritabanına bir
veri girince yada bir veri silince tekrar “Diske Yaz” dediğinde o andaki
kullanıcının düzenlediği bilgileri alabilmek,
sonrasında xm isminde bir XmlSerializer tanımlıyorum, bütün
seriileştirme işini yapacak olan Class bu, bu Class ın kurucu
metodu ise hangi türden nesneyi seriileştireceğimi istiyor, bende ona
tür olarak DataSetin türü olduğunu anlatıyorum.
Sonrasında
verileri HDD ye yazmak için bir TextWriter tanılıyorum ve bunun
instancesini oluştururken StreamWriter dan oluşturuyorum,
oluşacak dosyanın adınada “db.xml” diyorum, Seriileştirme
işinin en önemli noktası burası, XmlSerializer türünden
oluşturduğum bu classın içindeki Serialize metodunu kullanarak
bir TextWriter vasıtasıyla ds isimli DataSet nesnemi serialize
ediyorum. Son olarakta demin açtığım TextWriter nesnesini close
ediyorumki bu dosyayı daha sonra kullanabileyim.
Kulllanıcının
DataGrid e girdiği nesneleri Hard Diskte bir dosya oluşturarak yazan
yöntemi oluşturduk, şimdi sırada bu dosyayı geri okuyup,
DataGrid de tekrar göstermeye geldi, bunun için üçüncü butonu
kullanacağız, üçüncü buttona iki kere tıklayın ve
aşağıdaki kodları yazın.
Private Sub Button3_Click(ByVal
sender As System.Object,_
ByVal e As System.EventArgs) Handles
Button3.Click
Try
Dim
xm As XmlSerializer = New
XmlSerializer(GetType(DataSet))
Dim
str As FileStream = New
FileStream("db.xml", FileMode.Open)
Dim
rd As Xml.XmlTextReader = New Xml.XmlTextReader(str)
DataGrid1.DataSource = CType(xm.Deserialize(rd), DataSet).Tables(0)
str.Close()
Catch
ex As Exception
MessageBox.Show("Hata olustu,
Hata MSG si : " & ex.Message)
End Try
End Sub
Bu
bölümde yine ilk olarak XmlSerializer türünde bir değişken
oluşturduk ve deminki mantıkla bu nesnenin türünü DataSet olarak
verdik, sonrasında bir FileStream oluşturdum amacım önceden
seriileştirdiğim bu dosyayı bulup, deserialize etmek, FileStream
ile dosyayı open modda açtığıma dikkat edin.
Sonrasında bir XmlTextReader oluşturup bu deminki FileStram ı
ona parametre olarak veriyorum, artık herşey hazır sadece
deserialize etme işi kaldı, XmlSerializer classının
Deserialize metoduna XmlTextReader imi veriyorum, ama burada şuna dikkat
edin, Deserialize Metodu geriye Object döndürüyor, işlerin daha
hızlı yürümesi adına ben explicit olarak conversation
yapıyorum, CType ile gelen nesneyi DataSet türüne çeviriyorum. Ve bu
DataSet nesnesinin içindeki Tablolardan ilkini göstereceğimi
anlatıyorum.

Son
olarak siz denemelerinizi yaparken DataGrid in gerçekten dolduğuna emin
olun diye DataGrid i temizleyen
butonunda yaptığı işi yazalım.
Private Sub Button4_Click(ByVal
sender As System.Object,_
ByVal e As System.EventArgs) Handles
Button4.Click
DataGrid1.DataSource = Nothing
End Sub
Böylece
Testlerinizi yapabilirsiniz.
Ben
Sadece XML ile seriileştirmesini gösterdim, ancak siz isterseniz buradaki
seriileştirme işlemini Binary de yapabilirsiniz.



Bu yazımızda XML serialization kullanarak çok basit bir tablo için bir veritabanı mantığı kullanmak yerine dosyalarımız XML de tutarak işlemler yaptık.
Kategori: (Programlama) | Yorum (0) | Yorum yaz! | Bağlantı





















