XmlDataSource Kullanımı ve Xml Oluşturucu

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,726
Bakanlık kuzey koreye özeneli beri bizde iyiden iyiye özgürleşebilmek adına alternatif çözümler üretmeye başladık. Asp.net kullananlar için xml datasourceler kullanmak bakanlığın dayattığı xml leri kullanmada bize kolaylıklar sağlayacaktır. Bu kod yapısını kullanabilmeniz için en az temel düzeyde asp.net bilgisine sahip olmalısınız.

Kod:
CREATE TABLE `tduyurular` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `baslik` varchar(100) COLLATE utf8_turkish_ci DEFAULT NULL,
  `mansetResmi` varchar(50) COLLATE utf8_turkish_ci DEFAULT NULL,
  `giris` longtext COLLATE utf8_turkish_ci,
  `haber` longtext COLLATE utf8_turkish_ci,
  `ekleyen` varchar(50) COLLATE utf8_turkish_ci DEFAULT NULL,
  `tarih` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `okunma` int(11) DEFAULT '0',
  `onay` tinyint(1) DEFAULT '0',
  `sirano` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=397 DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci

Yukarıda ki şekilde tablomuzu mysql de oluşturduğumuzu düşünelim. Buradaki örneğimde 3 katman yazılım mimarisinin kullanarak Gerek Stored Procedurelerle gerekse Xml Oluşturma işlemleri ile bir xmldatasource u nasıl kullanacağımızı göreceğiz.

İlk olarak duyurular.cs sınıfımız. Sınıfımız biraz detaylı buradaki amacımız tek bir stored procedure kullanarak bunu pek çok yöntemde kullanabilmek mesela sira numarası ile dilenirse bazı haberler sabit olarak ekranda kalması sağlanabilir. Başlama ve bitiş tarihi haberin gösterimde kalacağı süreleri belirtiyor. Uygulamamız gayet detaylı olacak.

Kod:
public class Duyurular
{
	public Duyurular()
	{
		//
		// TODO: Add constructor logic here
		//
	}
    public Duyurular(int duyuruId)
	{
        this._id = duyuruId;
    }
    #region "duyurular değişkenleri"
    private int _id = -1;
    private string _baslik = string.Empty;
    private string _mansetResmi = string.Empty;
    private string _giris = string.Empty;
    private string _haber = string.Empty;
    private string _ekleyen = string.Empty;
    private DateTime _tarih = DateTime.Now;
    private int _okunma = 0;
    private int _satir = 0;
    private int? _siraNo = -1;
    private DateTime _bitistarihi;
    private DateTime _baslamatarihi;
    #endregion

    #region "Public özellikleri"
    //Duyuru için unique id
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }
    //Duyuru Başlığı
    public string Baslik
    {
        get { return _baslik; }
        set { _baslik = value; }
    }
    public string MansetResmi
    {
        get { return _mansetResmi; }
        set { _mansetResmi = value; }
    }
    public string Giris
    {
        get { return _giris; }
        set { _giris = value; }
    }
    public string Haber
    {
        get { return _haber; }
        set { _haber = value; }
    }
    public string Ekleyen
    {
        get { return _ekleyen; }
        set { _ekleyen = value; }
    }
    public DateTime Tarih
    {
        get { return _tarih; }
        set { _tarih = value; }
    }
    public DateTime baslamatarihi
    {
        get { return _baslamatarihi; }
        set { _baslamatarihi = value; }
    }

    public DateTime bitistarihi
    {
        get { return _bitistarihi; }
        set { _bitistarihi = value; }
    }
    public int Okunma
    {
        get { return _okunma; }
        set { _okunma = value; }
    }
    public int Satir
    {
        get { return _satir; }
        set { _satir = value; }
    }
    public int? SiraNo
    {
        get { return _siraNo; }
        set { _siraNo = value; }
    }
    #endregion
}

Şimdi gelelim ilgili Stored Proceduremizi MySql’de oluşturalım.

Kod:
DELIMITER//
CREATE DEFINER=`mysqlkullaniciadi`@`%` PROCEDURE `GetDuyurular`(`paramkey` int,`parambaslangic` int,`parambitis` int,`parammanset` int,`paramekleyen` varchar(50),`paramfiltre` varchar(150))
BEGIN
if (paramkey>0) THEN
	SELECT td.*,@satir := @satir + 1 AS satir FROM tduyurular td,(SELECT @satir:=0) s Where id=paramkey;
ELSEIF(parambitis>0) THEN
	if(parammanset=1) THEN
		set @sorgu = "select * from (select td.*,@satir := @satir + 1 as satir, CASE WHEN SiraNo IS NULL THEN
                          (SELECT     CASE WHEN Max(SiraNo) IS NULL THEN 0 ELSE Max(SiraNo) + 1 END
                            FROM          tduyurular) END AS sira from tduyurular td,(SELECT @satir:=0) s Where LENGTH(mansetresmi)>0) tduyurular ORDER BY sira asc,id DESC LIMIT ?,?";
	else
		set @sorgu = "select * from (select td.*,@satir := @satir + 1 as satir, CASE WHEN SiraNo IS NULL THEN
                          (SELECT     CASE WHEN Max(SiraNo) IS NULL THEN 0 ELSE Max(SiraNo) + 1 END
                            FROM          tduyurular) END AS sira from tduyurular td,(SELECT @satir:=0) s Where LENGTH(mansetresmi)=0) tduyurular ORDER BY sira asc,id DESC LIMIT ?,?";
	end if;
	PREPARE stmt FROM @sorgu;
	set @bas = parambaslangic;
	set @son = parambitis;
	EXECUTE stmt USING @bas,@son;	
ELSEIF (LENGTH(paramekleyen)>0) THEN
	SELECT td.*,@satir := @satir + 1 as satir FROM tduyurular td,(Select @satir:=0) s WHERE ekleyen=paramekleyen ORDER BY id desc;
ELSE
		if (LENGTH(paramfiltre)>0) then
			set @sorgu="SELECT td.*,@satir := @satir + 1 as satir FROM tduyurular td,(Select @satir:=0) s where ";
			set @sorgu=CONCAT(@sorgu,paramfiltre);
			PREPARE stmt from @sorgu;
			EXECUTE stmt;
	else
		SELECT td.*,@satir := @satir + 1 as satir FROM tduyurular td,(Select @satir:=0) s ORDER BY id desc;
	end if;
end if;
if (paramkey>0 and LENGTH(paramfiltre)=0) then
	update tduyurular set okunma=okunma+1 where id=paramkey;
end if;
END//
DELIMITER;

Görüldüğü gibi stored proceduremizde epey detaylı pek çok işlemde bunu kullanabiliriz ve sql server taraflı çalıştığından kodlar daha hızlı çalışacaktır. Ayrıca 3 katman yazılım mimarisinin 1 temel ayağı olan veri katmanında tüm işlerimizi saklı yordamlarla (Stored Procedurelerle) yürütürüz. Yukarıda gördüğünüz Prepare komutu sql ifadeyi çalıştırılabilir bir sorguya çeviriyor ve execute komutuda ms sql serverdaki exec(‘sql ifadesi’) komutunun karşılığı.
İlk olarak web.config de connectionstringimizi tanımlayalım.
Kod:
<connectionStrings>
    <add name="conn" connectionString="server=serveradresi;user id=kullaniciadi;password=sifre;database=f1000vR3cs9GD3242;pooling=false; charset=latin5;" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>

Gelelim verileri işleyeceğimiz islem.cs adlı sınıfımıza.
Kod:
public static MySqlConnection Baglanti
    {
        get
        {
            return new MySqlConnection(WebConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        }
    }

//Seçim işlemlerinin yapılacağı method
[DataObjectMethod(DataObjectMethodType.Select)]
    public static List<Duyurular> GetDuyurular(int DataKey, int Baslangic, int Bitis,
        int Manset, string Ekleyen)
    {
        MySqlCommand cmd = new MySqlCommand("GetDuyurular", veritabani_islemleri.Baglanti);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new MySqlParameter("?paramkey", DataKey));
        cmd.Parameters.Add(new MySqlParameter("?parambaslangic", Baslangic));
        cmd.Parameters.Add(new MySqlParameter("?parambitis", Bitis));
        cmd.Parameters.Add(new MySqlParameter("?parammanset", Manset));
        cmd.Parameters.Add(new MySqlParameter("?paramekleyen", Ekleyen));
        cmd.Parameters.Add(new MySqlParameter("?paramfiltre", string.Empty));
        cmd.Connection.Open();
        MySqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        List<Duyurular> DuyuruListesi = new List<Duyurular>();
        while (dr.Read())
        {
            Duyurular duyuru = new Duyurular();
            duyuru.Id = Convert.ToInt32(dr["id"].ToString());
            duyuru.Baslik = dr["baslik"].ToString();
            duyuru.MansetResmi = dr["mansetresmi"].ToString();
            duyuru.Giris = dr["giris"].ToString();
            duyuru.Haber = dr["haber"].ToString();
            duyuru.Ekleyen = dr["ekleyen"].ToString();
            duyuru.Tarih = Convert.ToDateTime(dr["tarih"].ToString());
            duyuru.Okunma = Convert.ToInt32(dr["okunma"].ToString());
            duyuru.Satir = Convert.ToInt32(dr["satir"].ToString());
            if (dr["sirano"] == DBNull.Value)
                duyuru.SiraNo = null;
            else
                duyuru.SiraNo = Convert.ToInt32(dr["sirano"].ToString());
            DuyuruListesi.Add(duyuru);
        }
        dr.Close();
        return DuyuruListesi;
    }
Bakanlığın olmasını bize şart koştuğu xml klasöründeki haberler.xml e bir bakalım.
Kod:
<?xml version="1.0" encoding="utf-8"?>
<slideshow gecisHizi="4" efektHizi="1">
  <haber>
    <yol>/Uploads/Duyurular/Pictures/asegmez/fotoGaleri_2mytht2ja6.jpg</yol>
    <baslik>O Köy Bizim Köyümüzdür!</baslik>
    <aciklama>Rehber &amp;ouml;ğretmenler tarafından merkez k&amp;ouml;y ilk&amp;ouml;ğretim okullarında seminer d&amp;uuml;zenlenecek.</aciklama>
    <url>/Haberler/396/o-koy-bizim-koyumuzdur.html</url>
    <tarih>13.02.2012</tarih>
  </haber>
  <haber>
    <yol>/Uploads/Duyurular/Pictures/asegmez/fotoGaleri_8ktfg5jlm7.jpg</yol>
    <baslik>Kendi Enerjisini Üretiyor!</baslik>
    <aciklama>&lt;p style="text-align: center;"&gt;&lt;span&gt;G&amp;ouml;nen Teknik  ve End&amp;uuml;stri Meslek Lisesi Kendi Enerjisini Kendi &amp;uuml;retecek.. &lt;/span&gt;&lt;/p&gt;</aciklama>
    <url>/Haberler/395/kendi-enerjisini-uretiyor.html</url>
    <tarih>13.02.2012</tarih>
  </haber>
  <haber>
    <yol>/Uploads/Duyurular/Pictures/asegmez/fotoGaleri_pftoy1cer9.jpg</yol>
    <baslik>Halk Oyunları Kursu Açıldı. </baslik>
    <aciklama>&lt;span style="font-size: 10pt; line-height: 115%; font-family: times new roman,serif;"&gt;Kepsut Halk Eğitimi Merkezi M&amp;uuml;d&amp;uuml;rl&amp;uuml;ğ&amp;uuml; Tarafından&amp;nbsp; Halk Oyunları Kursu a&amp;ccedil;ıldı. &lt;/span&gt;</aciklama>
    <url>/Haberler/394/halk-oyunlari-kursu-acildi.html</url>
    <tarih>13.02.2012</tarih>
  </haber>
  <haber>
    <yol>/Uploads/Duyurular/Pictures/asegmez/fotoGaleri_8ef4gnmkk9.jpg</yol>
    <baslik>Bilim ve Sanat Merkezi Sınavı</baslik>
    <aciklama>İlk&amp;ouml;ğretim Okulları 3. Sınıf&amp;nbsp; Gurup Tarama Sınavı Yapılacaktır.</aciklama>
    <url>/Haberler/393/bilim-ve-sanat-merkezi-sinavi.html</url>
    <tarih>13.02.2012</tarih>
  </haber>
  <haber>
    <yol>/Uploads/Duyurular/Pictures/asegmez/fotoGaleri_0og2b80n7s.jpg</yol>
    <baslik>Özel Eğitim Toplantıları</baslik>
    <aciklama>2011-2012 Eğitim&amp;nbsp; &amp;Ouml;ğretim Yılı 2. D&amp;ouml;nem &amp;Ouml;zel Eğitim Konularında,
Rehberlik Araştırma Merkezi M&amp;uuml;d&amp;uuml;rl&amp;uuml;ğ&amp;uuml;nde Toplantılar D&amp;uuml;zenlenecektir.</aciklama>
    <url>/Haberler/392/ozel-egitim-toplantilari.html</url>
    <tarih>13.02.2012</tarih>
  </haber>
</slideshow>

Emir demirden keskin olunca bizde kendi xml oluşturucumuzu yazalım.
Gelelim XmlOluşturucu Sınıfımıza
Kod:
#region Haberler
    public static void Haberler()
    {
        string dosya = HttpContext.Current.Server.MapPath("../xml/haberler.xml");
        XmlTextWriter textWriter = new XmlTextWriter(dosya, System.Text.Encoding.UTF8);
        textWriter.Formatting = Formatting.Indented;

        //string stilDosyasi = "type=\"text/xsl\" href=\"sitemap.xsl\"";
        textWriter.WriteStartDocument();
        //textWriter.WriteProcessingInstruction("xml-stylesheet", stilDosyasi);

        textWriter.WriteStartElement("slideshow");
        textWriter.WriteAttributeString("gecisHizi", "4");//Alt Menuye Özellik ekleniyor
        textWriter.WriteAttributeString("efektHizi", "1");//Alt Menuye Özellik ekleniyor

        XmlElementStringsHaberler(textWriter);
        textWriter.WriteEndElement();//slideshow bitişi

        textWriter.Flush();
        textWriter.Close();
    }

    private static void XmlElementStringsHaberler(XmlTextWriter textWriter)
    {
        List<Duyurular> DuyuruListesi = veritabani_islemleri.GetDuyurular(0, 0, 5, 1, string.Empty);
        foreach (Duyurular duyuru in DuyuruListesi)
        {
            textWriter.WriteStartElement("haber");//haber başlangıcı

            textWriter.WriteElementString("yol", "/Uploads/Duyurular/Pictures/" + duyuru.MansetResmi);
            textWriter.WriteElementString("baslik", duyuru.Baslik);
            textWriter.WriteElementString("aciklama", duyuru.Giris);
            textWriter.WriteElementString("url", 
                "haberler.aspx?haberno=” + duyuru.Id.ToString());
            textWriter.WriteElementString("tarih", duyuru.Tarih.ToShortDateString());

            textWriter.WriteEndElement();//haber bitişi
        }
    }
    #endregion

Şimdi gelelim xml datasource olayına neden bunu kullanacağız. Bakanlık index için bir html hazırlamış ve bu hazırlanan xml leride javascriptlerle içine yazdırtsa da mesela haberler kısmında ki resimlere alt değeri eklemek isteyebiliriz. Bu sitemizin indekslenmesinde faydalı olacaktır. Elle müdahale edebiliyor olmak her zaman işe yarayacaktır.
Kod:
<div class="slides">
            <asp:XmlDataSource ID="XmlDataHaberler" runat="server" XPath="slideshow/haber" 
                DataFile="~/xml/haberler.xml"></asp:XmlDataSource>
			<asp:Repeater ID="rpHaberler" runat="server" DataSourceID="XmlDataHaberler">
            <ItemTemplate>
            <div class="icerik"><img src='<%# XPath("yol") %>'  width="432px" height="270px" class="haberResim" alt='<%# XPath("baslik") %>' title='<%# XPath("baslik") %>'/>
			<div class="haberYazi">
					<h1><a href="" title='<%# XPath("baslik") %>'><%# XPath("baslik") %><a></h1>
	<a href='<%# XPath("url") %>' title='<%# XPath("baslik") %>'>
        <%# XPath("aciklama") %>
        <br /><br />
        <span style="font:8pt; color:#999"><%# XPath("tarih")%></span>
    </a></div></div>
            </ItemTemplate>
            </asp:Repeater>
        </div>

DataFile ile xml yolumuzu belirtiyoruz. XPath özelliği ile xml içerisinde hangi taglardan sonra ekrarlayan kayıtların olduğunu giriyoruz. Repeater içinde de kayıtları çağırırken Bind veya Eval yerine XPath kullanıyoruz.
Tüm xml datasource kullanımını sona bıraktım ama burada sql stored procedure oluşturma, mysql ile asp.net birlikteliği ve xml oluşturma, xml datasource kullanımı ile 3 katman (veri – işleme – sunum) mimarisindende örnekler var. Hiç belli olmaz bir gün buradaki 1 satır kod bile işinizi epey kolaylaştırabilir.
 
Geri
Üst