Makale Özeti

Makalemiz boyunca Okul database kısmındaki öğrenci tablomuz içerisindeki verilerimizi alıp bu verilerimizi xml olarak belirlediğimiz yere saklayacağız .

Makale

Sql tarafındaki verilerimizi c# kullanarak xml olarak dosya oluşturma işlemleri .

Makalemiz boyunca Okul database kısmındaki öğrenci tablomuz içerisindeki verilerimizi alıp bu verilerimizi xml olarak belirlediğimiz yere saklayacağız .

Okul database imiz için gerekli olan database yapısı aşağıdaki gibidir .

create database Okul

use Okul

create table Ogrenciler

(

id int identity(1,1),

Ad nvarchar(20),

Soyad nvarchar(20),

Adres nvarchar(70),

VeliAdi nvarchar(20),

TelefonNumara nvarchar(20),

EDiplomaNot int,

constraint PK_Ogrenciid primary key(id)

)

Yukarıdaki tanımlamalarda SQL server tarafında örnek database ve tablomuzu oluşturduk . Simdi c# tarafında işlemlerimizi gerçekleştirelim.

App.config

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<connectionStrings>

<add name="Baglan" connectionString="data source=.; initial catalog = Okul; integrated security = true"/>

</connectionStrings>

</configuration>

Yukarıdaki tanımlamada app.config dosyası oluşturarak database bağlantı yolumuzu belirledik .

C# içerisinde bu bağlantımızı kullanmak için Add Referance… kısmından System.Configuration uygulamamıza implement etmemiz gerekir .

Simdi Ogrenci.cs kısmını oluşturalım . bu class olusturmamızın nedeni sql tarafından gelen verileri list<> generic bir koleksiyona atarken list<> koleksiyonun tipini belirlemek içindir.

namespace OgrenciSerilestir

{

[Serializable ]

public class Ogrenci

Ogrenci class ımıza başlamadan önce Ogrenci class ımızı public olarak belirlememiz ve

[Serializable] seklinde bildirmemiz gerekir.

Ogrenci.cs

string _ad, _soyad, _adres, _veliadi, _telno;

int _diplomanot;

public string Ad

{

get{return this._ad;}

set{this._ad = value;}

}

public string Soyad

{

get { return this._soyad; }

set { this._soyad = value; }

}

public string Adres

{

get { return this._adres; }

set { this._adres = value; }

}

public string VeliAdi

{

get { return this._veliadi; }

set { this._veliadi = value; }

}

public string TelefonNumarasi

{

get { return this._telno; }

set { this._telno = value; }

}

public int DiplomaNot

{

get { return this._diplomanot; }

set { this._diplomanot = value; }

}

Yukarıdaki tanımlamalarda kapsülleme kullanarak değişkenlerimiz ve veri akışı kısmını kapsül ledik. Bunu yapmamızın nedeni ilerde verinin burada bir şekilde kontrol edilme istegine cevap vermek adına ileriye yönelik bir çalışmadır .

public Ogrenci()

{

}

public Ogrenci(string ad, string soyad, string adres , string veliad, string telno, int Dnot)

{

this.Ad = ad; this.Soyad = soyad; this.Adres = adres; this.VeliAdi = veliad; this.TelefonNumarasi = telno; this.DiplomaNot = Dnot;

}

İki adet yapıcı metot tanımlaması gerçekleştirdik. ilk yapıcı metodumuz bos olarak belirledik bunun nedeni xml olarak serileştireceğimiz zaman bir adet boş yapıcı metot a ihtiyaç duymasıdır. Bu kısım çok önemlidir. Tüm kodlarımız doğru bile olsa eğer boş bir yapıcı metot tanımlamadı isek yordamımız çalışmayacaktır.

Ardından normal yapıcı metodumuzu oluşturarak tipimize gelen verilerimizi property tanımlamalarımızı kullanarak aktardık.

public override string ToString()

{

return string.Format("Adı : {0} Soyadi : {1} Adres {2} Veli Adi {3} Telefon Numarasi {4} Diploma notu {5}", Ad, Soyad, Adres, VeliAdi, TelefonNumarasi, DiplomaNot);

}

ToString () metodunu ezdik buradaki amacımız ise ToString() gibi hazır bir metodumuz var diye düşünüp bu metodu bilgi ver seklinde kullanma isteğimizdir.

Yardimci.cs : bu class ımız bağlantı işlemlerimiz verileri aktarma ve xml ile işleme kısmının bulunduğu kısımdır.

Kullandığımız isim alanları ve açıklamaları.

using System.Data.SqlClient; -- Database ile işlemler yapmak için

using System.Configuration; -- Olusturduğumuz app.config bağlantı ayar dosyamızı connectionString olarak tanımlamak için

using System.IO; -- Xml dosya olusturmak icin vericegimiz yol tanımını almak ve olusturmak için kısacası dosyalama işlemleri için .

using System.Xml.Serialization; -- Adından da anlaşılacağı gibi xml olarak serilestirme işlemi icin gerekli olan kısım

SqlConnection con;

SqlCommand cmd;

Tanımlamamızda namespace kısmında SqlConnection ve SqlCommand tipinde iki adet değişken olurduk tüm class içinde ihtiyaç duyduğumuz an çağırmak için en tepede yani namespace kısmında belirledik .

public Yardimci()

{

con = new SqlConnection(ConfigurationManager.ConnectionStrings["Baglan"].ConnectionString);

}

Yardimci Kullan = new Yardimci () seklinde bir örnekleme kısmı olduğu zaman yukarıdaki yapıcı metot çalışacaktır ve bağlantı yolumuzu köprülenecektir.

Bağlantı tanımlamamızda kullandığımız ConfigurationManager.ConnectionStrings["Baglan"].ConnectionString tanımlamasında Syste.Configuration namespace ini en basta using ile uygulamamıza belirttiğimiz için direk olarak eristik app.config kısmında tanımladığımız yol tanımını string olarak belirlememizi sağladı bunun amacı pek çok yerde yol bağlantı ayarlarını almak ve kullanmak zorunda isek bu şekilde app.config içerisine tanımlama yapılarak connection name(ConnectionStrings["Baglan"] ) ismi ile çağrılabilinir bu şekilde herhangi bir değişim olduğu zaman merkezi olarak yönetilebilirliği sağlamak amacı ile yapılmıştır.

void BaglantiYonetimi()

{

if (con.State == System.Data.ConnectionState.Open)

{

con.Close();

}

else

{

con.Open();

}

}

Yordamımız içerisinde bağlantımızı pek çok kez açmak ve kapamak isteyebiliriz ve doğal olarak en son bağlantımızı nasıl bıraktığımızı hatırlamak için kodumuzun ilgili yerine bakmak zorunda kalırız . Bunu önlemek amacı ile BaglantiYonetimi adında bir private metot kullanarak bağlantı durumunu if yapısını kullanarak kontrol ettirip acık ise kapatılmasını kapalı ise açılmasını metot olarak yazmak bize çalışma zamanında rahat bir yapı kazandıracaktır. Burada bağlantının durumları Open ve Close ile sınırlı değildir. Bir çok durum için bu yapıyı daha da dallandırarak kullanabiliriz.

public List<Ogrenci> OgrencileriAl()

{

List<Ogrenci> ogrencilerim = new List<Ogrenci>();

cmd = new SqlCommand("select Ad,Soyad,Adres,VeliAdi,TelefonNumara,EDiplomaNot from Ogrenciler", con);

BaglantiYonetimi();

SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())

{

ogrencilerim.Add(new Ogrenci(dr["Ad"].ToString(), dr["Soyad"].ToString(), dr["Adres"].ToString(), dr["VeliAdi"].ToString(), dr["TelefonNumara"].ToString(), (int)dr["EDiplomaNot"]));

}

BaglantiYonetimi();

return ogrencilerim;

}

OgrencileriAl metodumuzu kullanarak database ilgili tabloya bağlanıp verilerimizi çekeriz ve bunları daha önceden oluşturduğumuz ogrenci tipine koleksiyona değer olarak belirterek içerisine aktarırız List<ogrenci> seklinde .

Simdi metodumuzu biraz açıklayalım …

1 . List<Ogrenci> ogrencilerim = new List<Ogrenci>(); şeklinde bir list<> generic koleksiyon oluşturduk ve bu list generic koleksiyonumuzun sadece öğrenci tipi veya bu tip den türetilmiş tipleri kabul etmesini istediğimizi belirledik ama biz bu uygulamada herhangi bir kalıtım kullanmadığımız için burada öğrenci tipi için geçerlidir.

2. cmd = new SqlCommand("select Ad,Soyad,Adres,VeliAdi,TelefonNumara,EDiplomaNot from Ogrenciler", con);

BaglantiYonetimi();

Cmd sqlcommand içerisine tsql komutumuzu yazdık normal şartlarda bu şekilde tsql kodun uygulama içerisine yazılması önerilmez bunun yerine ogrencilerilistele adında bir procedure SQL tarafında oluşturulur ve bu procedure nin geri dönüş değerlerine göre yakalanıp uygulamaya aktarılır ama bizim amacımız burada xml olarak serileştirme işlemini anlatmak bir başka makalemde bu kısma detaylı olarak değineceğiz derinlemesine araştıracağız!

BaglantiYonetimi metodumuzu kullanarak bağlantımızı kontrol ettik bu durumda bağlantımızı hiç open etmediğimiz için bağlantımız açılacaktır.

3 . SqlDataReader dr = cmd.ExecuteReader();

SqlDataReader tipinden dr adında bir değişken belirledik ve cmd sqlcommand mızı execute.read() komutunu vererek sql sorgumuzun tüm sonucunu dr attık . SqlDataReader kamyon gibi düşüne bilirsiniz tüm verileri yüklendi ama bu verileri bir baksa yere boşaltmadan kullanamayız SqlDataReader sadece verileri gider alır gelir. Bağlantımızı köprü SqlDataReader ımızıda kamyon gibi düşünün .

4 . while (dr.Read())

{

ogrencilerim.Add(new Ogrenci(dr["Ad"].ToString(), dr["Soyad"].ToString(), dr["Adres"].ToString(), dr["VeliAdi"].ToString(), dr["TelefonNumara"].ToString(), (int)dr["EDiplomaNot"]));

}

BaglantiYonetimi();

return ogrencilerim;

}

While döngüsünü kullanarak Sqldatareader tipindeki dr değişkenimizin son satırına kadar döngümüzü çalışmasını sağladık .

Şimdi kamyonumuzdaki ( SqldataReader ) içerisindeki verilerimizi List<ogrenci> tipindeki öğrencilerim koleksiyonuna ekleme sırası geldi ve öğrencilerim.add( dr[“Ad”].toString() seklinde tüm kolonlarımızı yazarak koleksiyonumuza ekledik ve daha sonra bağlantı yönetimi metodumuzu kullanarak bağlantımızı kapattık .

Burada önemli olan tek kural bağlantıyı ihtiyacımız olduğu zaman açmak işimiz bittiği zaman kapatmak olacaktır . bu şekilde çalışır isek yordamımız için daha fazla güç harcanmaz.

Return ogrencilerim ile metodumuz dışına koleksiyonumuzu aktardık.

5 . public void XmlSerilestir(List<Ogrenci> GelenOgrenciler, string Path)

{

XmlSerializer seriliazer = new XmlSerializer(typeof(List<Ogrenci>));

FileStream YolTanimi = new FileStream(Path, FileMode.Create);

seriliazer.Serialize(YolTanimi, GelenOgrenciler);

YolTanimi.Close();

Console.WriteLine("Basarili Oldu");

}

Ve xml serileştirme metodumuz. metodumuz bizden List<ogrenci> tipinden GelenOgrenciler ve string tipinden Path tanımı istemektedir.

XmlSerializer seriliazer = new XmlSerializer(typeof(List<Ogrenci>)); kısmında örneklememizi yaptık .

FileStream YolTanimi = new FileStream(Path, FileMode.Create); filestream ile bir kanal açtık ve Path tanımına gelen c:\ogrenci.xml adı için filemode.create kısmında adı verilen yola adı verilen dosyayı açma kısmını tanımladık .

seriliazer.Serialize(YolTanimi, GelenOgrenciler); bölümünde xml çevirme işlemimiz tamamlanmıştır. Artık tek yapmamız gereken

YolTanimi.Close();

İle kanalımızı kapatmak tır.

Makalemiz boyunca sql server tarafında bir tabloya bağlanarak bilgileri alıp xml e çevirme işlemi anlatılmıştır .

Umarım yararı olmuştur .

Ornek Kod