Merhaba arkadaşlar. Bugün yine fire vermeden blogumda yazı paylaşıyorum. paylaştıkça da mutlu oluyorum ve hepinize tavsiye etmeden geçemiyorum. Bugun ki konumuza gelecek olursak bugun ki konumuz Tek sqlcommand nesnesi ile birden fazla sorguyu çalıştırmak. Önceleri bende merak ediyordum böyle bişey var mı diye hatta iki farklı sorgu için iki farklı sqlcommand bile tanımlamıştım. Kodlama kısmına geçecek olursak
SqlCommand cmd = new SqlCommand("select id, MusteriAdi from denemeTable; select MusteriAdi, MusteriSoyadi from Musteriler", cnn);
//İki farklı sorgumuzu aralarına ; işaret koyarak yazıyoruz. burası çok önemli asla unutmamamız gereken bi nokta.
cnn.Open(); // Baglantımızı açıyoruz
SqlDataReader dr = cmd.ExecuteReader(); //çalışan sorgudan dönen sonucu dr nesnemize aktarıyoruz
bool baskasorguvarmi; //sorgu var mı yok mu kontrol etmek için bool türnde değişken tanımlıyoruz
do
{
while (dr.Read())
{
ListBox1.Items.Add(dr[0].ToString() + " - " + dr[1].ToString()); // ilk sorgumuzda ki id ve
MusteriAdi sutunlarını ekliyoruz
}
baskasorguvarmi = dr.NextResult();
//ikinci sorgunun olup olmadığının kontrolünü nextresult() metodu ile yapıyoruz. 2. bi sorgu varsa true, yoksa false dönecektir ve baskasorguvarmi değişkenin değerine göre tekrar while döngüsüne girerek listbox a veri ekleme işlemini yapacaktır
}
while (baskasorguvarmi);
Arkadaşlar yukarıda da görüldüğü gibi iki sorgu arasına ; koymayı unutmuyoruz ve NextResults() metodu ile ikinci sorgu var mı yok mu kontrol ediyoruz. diğer kısımları zaten bildiğinizi varsayıyorum. Sorunlarınıza çözüm olması dileğiyle, hoşçakalın...
Kaynak : http://www.gencayyildiz.com
İSA BAL
Henüz Bilgisayar mühendisliği öğrencisi...
3 Haziran 2013 Pazartesi
2 Haziran 2013 Pazar
C# String Metotları
Merhaba arkadaşlar. Bugün kü yazımda sıkça kullandığımız bize büyük kolaylıklar sağlayan string metotlarını ele alıcaz. Bende yanlış bilgi vermemek için diğer bloglara bakarak ve kodları yazarak sizlerle paylaşmak istedim.
string metin = "isa bal";
bool a = metin.Contains("ı"); //metin stringinde ı harfi yok mu kontrol eder. varsa true yoksa false döndürür.
Console.WriteLine("sonuç : " + a);
bool b = metin.EndsWith("bal"); //metin stringinin içerisinde bal stringi varmı yok mu kontrol eder. varsa true yoksa false döndürür.
Console.WriteLine("sonuc : " + b);
bool c = metin.StartsWith("i"); //metin stringi i harfi ile başlıyomu. başlıyor ise true, başlamıyorsa false döndürür
Console.WriteLine("sonuc : " + c);
metin = metin.Insert(7, "ı"); //metin stringine 7. indexten itibaren ı harfini ekler.
Console.WriteLine("sonuc : " + metin);
Console.WriteLine("sonuç : " + metin.Remove(2)); //2. indexten itibaren karakterleri siler. 2. karakterde dahil
Console.WriteLine("sonuç : " + metin.Remove(1, 1)); //1. indexten itibaren bir karakter siler. yani sadece 1. karakter
Console.WriteLine("sonuc : " + metin.Replace('i','O'));
Console.WriteLine("sonuc : " + metin.Substring(3)); // 3. indexten itibaren tüm karakterleri alır
Console.WriteLine("sonuc : " + metin.Substring(4, 2)); //3. indexten itibaren iki karakter alır
Console.WriteLine("sonuc : " + metin.ToLower()); //tüm harfleri küçük yapar
Console.WriteLine("sonuc : " + metin.ToUpper()); //tüm harfleri büyük yapar
string[] dizim = metin.Split('a'); //metin stringini a harfine göre parçalar ve diziye atar. çıktıdan daha iyi anlayabiliriz.
for (int i = 0; i < dizim.Length; i++)
{
Console.WriteLine(dizim[i]);
}
metin.Trim(); //metin değişkeninin başındaki ve sonundaki boşlukları siler
metin.TrimEnd(); //metin değişkeninin sonundaki boşlukları siler
metin.TrimStart(); //metin değişkeninin başındaki boşlukları siler.
string metin = "isa bal";
bool a = metin.Contains("ı"); //metin stringinde ı harfi yok mu kontrol eder. varsa true yoksa false döndürür.
Console.WriteLine("sonuç : " + a);
bool b = metin.EndsWith("bal"); //metin stringinin içerisinde bal stringi varmı yok mu kontrol eder. varsa true yoksa false döndürür.
Console.WriteLine("sonuc : " + b);
bool c = metin.StartsWith("i"); //metin stringi i harfi ile başlıyomu. başlıyor ise true, başlamıyorsa false döndürür
Console.WriteLine("sonuc : " + c);
metin = metin.Insert(7, "ı"); //metin stringine 7. indexten itibaren ı harfini ekler.
Console.WriteLine("sonuc : " + metin);
Console.WriteLine("sonuç : " + metin.Remove(2)); //2. indexten itibaren karakterleri siler. 2. karakterde dahil
Console.WriteLine("sonuç : " + metin.Remove(1, 1)); //1. indexten itibaren bir karakter siler. yani sadece 1. karakter
Console.WriteLine("sonuc : " + metin.Replace('i','O'));
Console.WriteLine("sonuc : " + metin.Substring(3)); // 3. indexten itibaren tüm karakterleri alır
Console.WriteLine("sonuc : " + metin.Substring(4, 2)); //3. indexten itibaren iki karakter alır
Console.WriteLine("sonuc : " + metin.ToLower()); //tüm harfleri küçük yapar
Console.WriteLine("sonuc : " + metin.ToUpper()); //tüm harfleri büyük yapar
string[] dizim = metin.Split('a'); //metin stringini a harfine göre parçalar ve diziye atar. çıktıdan daha iyi anlayabiliriz.
for (int i = 0; i < dizim.Length; i++)
{
Console.WriteLine(dizim[i]);
}
metin.Trim(); //metin değişkeninin başındaki ve sonundaki boşlukları siler
metin.TrimEnd(); //metin değişkeninin sonundaki boşlukları siler
metin.TrimStart(); //metin değişkeninin başındaki boşlukları siler.
Sonuç ekran çıktıları şekildeki gibi olacaktır. Faydalı olması dileğiyle iyi günler arkadaşlar...
1 Haziran 2013 Cumartesi
Collection Pager sınıfının kullanımı
Merhaba arkadaşlar. blogumda nerdese 1 yıldır bişi paylaşmıyorum, yeni mezun olmanın verdiği psikoloji ile artık bişilerin ucundan tutmak gerektiğini düşündüm ve deneyim ve bilgilerimi paylaşmaya karar verdim.Bugunkü konumuz Colleciton pager dll i. Bu dll ne işe yarar diye sorarsanız şöyle açıklayayım. Bir web sayfası yaptığımızı düşünün ve sayfada onlarca yüzlerce ürün, kayıt vb gösterilecek ve bunları gösterirkende repeater veya datalist gibi nesneler kullanmak isteyebiliriz. Ancak ne yazık ki bu nesnelerimizin gridview gibi sayfalama özelliği yok. Bu üzücü durumda yardımımıza collection pager dll i yetişiyor. Şahsen ben ilk kullandığımda derin bir oh çekmiştim. Öncelikle internetten collection pager dll download dediğimizde rahatlıkla bulup indirebiliriz. Daha sonra toolbox a sağ tıklayıp choose ıtem dedikten sonra açılan pencereden dll in yolunu belirtirsek collection pager nesnesi toolbox a eklenmiş olacaktır..artık Collection pager ı sayfamıza sürükle bırak yöntemi ile kullanabiliriz.
<%@ Register Assembly="CollectionPager" Namespace="SiteUtils" TagPrefix="cc1" %>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<%#Eval("Veri") %>
</ItemTemplate>
</asp:Repeater>
<cc1:CollectionPager ID="CollectionPager1" PageSize="10" runat="server" BackNextLocation="Split" BackText="Geri" FirstText="İlk" LabelText="Sayfa:" LastText="Son" NextText="İleri" QueryStringKey="Sayfa" ResultsFormat="Sayfa {0}-{1} (of {2})"></cc1:CollectioknPager>
yukarıda gördüğümüz gibi kodda collection pager ın özellikleri de belirtilmiş. artık .cs kısmına gelerek collection pager a sayfalayacağı veri kaynağını gösterelim.
CollectionPager1.DataSource = dt(datatable değişkeni olabilir veya veri dizisi )
CollectionPager1.BindToControl = Repeater1;
Repeater1.DataSource = CollectionPager1.DataSourcePaged;
Bu şekilde onlarca verimizi sayfalamış olduk. Gerçekten çok kullanışlı ve işe yarayan bi dll. Sorunlarınıza çözüm getirmesi dileğiyle
<%@ Register Assembly="CollectionPager" Namespace="SiteUtils" TagPrefix="cc1" %>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<%#Eval("Veri") %>
</ItemTemplate>
</asp:Repeater>
<cc1:CollectionPager ID="CollectionPager1" PageSize="10" runat="server" BackNextLocation="Split" BackText="Geri" FirstText="İlk" LabelText="Sayfa:" LastText="Son" NextText="İleri" QueryStringKey="Sayfa" ResultsFormat="Sayfa {0}-{1} (of {2})"></cc1:CollectioknPager>
yukarıda gördüğümüz gibi kodda collection pager ın özellikleri de belirtilmiş. artık .cs kısmına gelerek collection pager a sayfalayacağı veri kaynağını gösterelim.
CollectionPager1.DataSource = dt(datatable değişkeni olabilir veya veri dizisi )
CollectionPager1.BindToControl = Repeater1;
Repeater1.DataSource = CollectionPager1.DataSourcePaged;
Bu şekilde onlarca verimizi sayfalamış olduk. Gerçekten çok kullanışlı ve işe yarayan bi dll. Sorunlarınıza çözüm getirmesi dileğiyle
26 Haziran 2012 Salı
Veriden Geleceğe 2012 (İş Zekası ve Veri Ambarı Eğitimi)
Sektörün önde gelen isimlerinin eğitmen olarak katıldığı program eğitmenlerin düzenlediği oturumlar ile gerçekleştirlecek.
Katılımcı profilinin bilişim sektörü ile ilgili olan üniversite 3. veya 4 sınıf öğrencileri ile yeni mezun olmuş öğrencilerden oluştuğu eğitim 2 hafta sonu boyunca sabah 09:00 – 12:00 ve 13:00- 16:00 aralarında 3 er saatlik seanslar ile gerçekleştirilecek.
Başvuru formunu doldurup info@datawarehouse.gen.tr adresine gönderen katılımcılar arasından ön değerlendirme sonrası kesin kayıt yaptırmaları gerekmektedir. Kesin kayıt yaptırmayan katılımcıların başvuruları iptal edilecek ve yerine yedek listedeki katılımcılar davet edilecektir.
Eğitim sonrası Katılım belgesi verilecek katılımcılar aynı zamanda iş zekası sektöründe çalışan şirketlere tavsiye edileceklerdir.
Eğitim Üsküdar Gençlik Merkezinin ev sahipliğinde gerçekleştirilecektir.
Eğitim ana sponsorumuz Philogica ‘ya sonsuz teşekkürlerimizi sunuyoruz.
BAŞVURU FORMU : Veriden Geleceğe 2012 Başvuru Formu – info@datawarehouse.gen.tr
Ayrıntılı bilgi için : www.datawarehouse.gen.tr iletişim maili info@datawarehouse.gen.tr ye mail gönderiniz.
Etkinliğin Facebook Grubu : DatawarehouseTurkiyeBilisimKurslari
Çok güzel bi etkinlik olacağı kesin. İnş. bende katılma şansı bulurum...
8 Haziran 2012 Cuma
Veritabanı Bağlantısında Store Procedure kullanımı
Merhaba arkadaşlar.Programlamanın en gözde konularından birisi "veritabanı bağlantısını" nın ufak bi örneğini göstereceğim sizlere.Command nesnesinde çoğumuz şimdiye kadar sql cümleciği görmüşüzdür "select *from uyeler" v.b şeklinde.Tabi bu başlangıç sürecinde kullanılan bi yöntem ancak zamanla uzmanlaştıkça store procedure kullanıldığını farketceksiniz ve sizde programlarınızda store procedurlere yer vereceksiniz.Sizlere Store procedure kullanmanın faydasını iki cümle iki izah etmek istiyorum. Store procedurler Sql serverımızda yazdığımız sql fonksiyonları diyebiliriz. Store procedurların en önemli özelliği yazıldıktan sonra bir kez derlenip sonra istediğimiz zaman çağırabiliyo olmamızdır.Zaten asıl önemi de derlenmiş olmasından geliyo.Çünkü programlarımıza hız kazandırıyo. e zaten hız bizim için en önemli kıstaslardan biri değil miydi? O zaman şimdi kodu inceleyelim ve sağındaki açıklamalarını dikkatlice okuyalım.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
namespace deneme
{
public partial class insrt : System.Web.UI.Page
{
SqlConnection cnn = new SqlConnection("server=localhost; Database=abc; uid=sa; pwd=1"); // DB ile bağlantı kurduk ve gerekli parametreleri girdik
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnekle_Click(object sender, EventArgs e)
{
try
{
cnn.Open(); // Öncelikle veriyle işlem yapmak için bağlantımızı açıyoruz.
//cmd nesnesi oluşturmadan bi sonraki basamaktada açabilirdik. sırası çok mühim değil
SqlCommand cmd = new SqlCommand("ekle", cnn); // command nesnesini oluşturduk ve ve ekle isimli store procedure müzü sql cümleciğini yazdığımız yere yazdık.
cmd.CommandType = CommandType.StoredProcedure; // command tipimizi storeprocedure olarak belirttik
cmd.ExecuteNonQuery(); //Sorgumuz geriye sonuç döndürmeyeceğinden cmd nesnemizi executenonquery() ile çalıştırıyoruz
}
catch
{
lbluyari.Text = "bağlantıda sorunvar"; // try bloğu çalışmazsa catch bloğu devreye girecek.
profesyonel programlama hataları gözardı etme ve bunun için gerekli kodlamayı yapar
}
finally
{
cnn.Close(); // son olarak bağlantımızı kapatıyoruz. Kesinlikle açık bırakmayalım.
}
}
}
}
Kodumuzda kullandığımız ekle store proceduru :
create procedure ekle
{
@yazaradi nvarchar(50),
@kitapadi nvarchar(50)
}
as
insert into yazarlar(yazaradi,kitapadi) values(@yazaradi, @kitapadi)
şeklinde olacaktır arkadaşlar. Bir sonraki blogda görüşmek dileğiyle hoşçakalın....
Javascriptle validation örneği
Merhaba arkadaşlar. Uzun bir aradan sonra, yaklaşık 10 gündür bloga yazamadım. İçimde yine yazma hissi oluştu ve buraya kadar geldim... Bu seferki blogumuzda kısa kısa javascript kodlarıyla kullanıcının inputları boş bırakmasını önleyeceğiz. Hani form doldururken 'lütfen * lı alanları boş bırakmayınız' uyarısını alırız, bizde ona benzer bi uygulama yapıcaz. Şimdi kodumuzu yazalım
<head>
<script language="Javascript">
function kontrolet(alan)
{
if(alan.value.length<1) //elementimizin value propertysinin uzunluğuna bakıyoruz. Boş ise
{
alert("Alanı boş bırakma"); // alert metotu ile uyarı penceresi oluşturuyoruz
// ve False değerini döndürüyoruz.
return false;
}
else
{
return true;
}
}
</script>
</head>
Kullanacağımız fonksiyonu head başlık kısmına yazdık.Şimdi body kısmında nasıl kullanacağımızı görelim
<body>
<form action="" method="post" name="formum" >
<input type="text" name="isim" value="" onBlur="kontrolet(this)"> // elementin onBlur propertsinde
// fonksiyonu çağırdık ve this anahtar kelimesi
// ile bulunduğumuz elementi gösterdik. Bu element için this=isim dir.
<input type="text" name="soyisim" value="" onBlur="kontrolet(this)"> //elbette this yerine soyisim de
//yazabiliriz.
</form>
</body>
onBlur ==>Nesneden ayrılma durumunu izah eder. Mesela kullanıcı adını tıkladıktan sonra boş bırakıp fareyi başka yere götürdüğünüzde fonksiyon devreye girer.
Kodumuz bundan ibaret arkadaşlar. Son derece kolay ve kullanışlı. Yakında Jquery uygulamaları gelecek. Bi sonraki blogda görüşmek dileğiyle hoşçakalın...
<head>
<script language="Javascript">
function kontrolet(alan)
{
if(alan.value.length<1) //elementimizin value propertysinin uzunluğuna bakıyoruz. Boş ise
{
alert("Alanı boş bırakma"); // alert metotu ile uyarı penceresi oluşturuyoruz
// ve False değerini döndürüyoruz.
return false;
}
else
{
return true;
}
}
</script>
</head>
Kullanacağımız fonksiyonu head başlık kısmına yazdık.Şimdi body kısmında nasıl kullanacağımızı görelim
<body>
<form action="" method="post" name="formum" >
<input type="text" name="isim" value="" onBlur="kontrolet(this)"> // elementin onBlur propertsinde
// fonksiyonu çağırdık ve this anahtar kelimesi
// ile bulunduğumuz elementi gösterdik. Bu element için this=isim dir.
<input type="text" name="soyisim" value="" onBlur="kontrolet(this)"> //elbette this yerine soyisim de
//yazabiliriz.
</form>
</body>
onBlur ==>Nesneden ayrılma durumunu izah eder. Mesela kullanıcı adını tıkladıktan sonra boş bırakıp fareyi başka yere götürdüğünüzde fonksiyon devreye girer.
Kodumuz bundan ibaret arkadaşlar. Son derece kolay ve kullanışlı. Yakında Jquery uygulamaları gelecek. Bi sonraki blogda görüşmek dileğiyle hoşçakalın...
29 Mayıs 2012 Salı
Javascript'le tarih yazdırma
Merhaba arkadaşlar.1-2 gündür bloga bakmıyodum ara sıra aklıma gelse de sonra bişiler eklerim diyerek geçiştirdim.Ama bu blog bana bi sorumluluk gibi geliyor artık.İnsanın elinde olmadan bişiler ekleme gerekliliğini kendisinde hissediyor. Bu akşam Javascript çalışırken babamın "sende bişiler üret artık" ikazının ardından(fırça yedim aslında) baktığım ve "aa ne güzelmiş kısa ve kolay bi kod " dediğim kod parçasını sizlere açıklayarak anlatacağım. Kod web sayfamızda o an bulunduğumuz ayın gününü(0-30), haftanın gününü 0-6 ve pazar, p.tesi şeklinde ve de saati dk yı saniyeyi yazdıracak. Tabi bunları daha da artırabiliriz.Neyse uzatmadan kodu paylaşmak istiyorum
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>takvim</title>
<script language="javascript">
gunler=new Array("Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi")
aylar=new Array("Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık")
simdi=new Date
</script>
</head>
<body>
<script language="javascript">
document.write("<h2> bugun gunlerden : " +gunler[simdi.getDay()] + " , " +simdi.getDate() + " "+aylar[simdi.getMonth()]+ " saat " +simdi.getHours()+"."+simdi.getMinutes()+"."+simdi.getSeconds()+".</h2>");
</script>
</body>
</html>
Şimdi yavaş yavaş kodumuzu açıklayalım. öncelikle head tagları arasındaki scriptimizde günler ve aylar isimli dizilerimizi oluşturuyoruz. Diğer programlama dillerinde olduğu gibi, tek farkı önünde veri tipi yok.dizilerimizi oluşturduktan sonra body tagları arasındaki scriptimize geliyoruz. Öncelikle document.write() metodu ile sayfaya içerik yazıyoruz.Bunu bilmeliyiz. Bu kodda biliyorum ki en çok merak ettiğiniz getDay(), getMonth(), getDate, metotları ne işe yarıyo. Hemen söylüyorum.
getDay() ==> Haftanın gününü(Pazar=0, Ptesi=1 şeklinde).Yani bize tamsayı değer döndürür.
getDate()==> Ayın içinde bulunduğumuz günü(0-30 arası)
getMonth()=>>İçinde bulunduğumuz ayın index no sunu verir.(Mayıs için 4 mesela)
getHours()==>İçinde bulunulan saat(0-23 arası)
getMinutes()==>İçinde bulunulan dakika(0-59 arası)
getSeconds()==>İçinde bulunulan saniye.
Evet arkadaşlar yukarıda gösterdiğim metotların döndürdüğü değerler dizi değişkenine atanarak dizinin o indekse karşılık gelen değerini yazdırıyoruz.Olay kısaca bundan ibaret.Çok ilginiz çekmeyebilir ama paylaşmadan geçemedim. Başka paylaşımlarla buluşmak dileğiyle. Sağlıcakla kalın...
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>takvim</title>
<script language="javascript">
gunler=new Array("Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi")
aylar=new Array("Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık")
simdi=new Date
</script>
</head>
<body>
<script language="javascript">
document.write("<h2> bugun gunlerden : " +gunler[simdi.getDay()] + " , " +simdi.getDate() + " "+aylar[simdi.getMonth()]+ " saat " +simdi.getHours()+"."+simdi.getMinutes()+"."+simdi.getSeconds()+".</h2>");
</script>
</body>
</html>
Şimdi yavaş yavaş kodumuzu açıklayalım. öncelikle head tagları arasındaki scriptimizde günler ve aylar isimli dizilerimizi oluşturuyoruz. Diğer programlama dillerinde olduğu gibi, tek farkı önünde veri tipi yok.dizilerimizi oluşturduktan sonra body tagları arasındaki scriptimize geliyoruz. Öncelikle document.write() metodu ile sayfaya içerik yazıyoruz.Bunu bilmeliyiz. Bu kodda biliyorum ki en çok merak ettiğiniz getDay(), getMonth(), getDate, metotları ne işe yarıyo. Hemen söylüyorum.
getDay() ==> Haftanın gününü(Pazar=0, Ptesi=1 şeklinde).Yani bize tamsayı değer döndürür.
getDate()==> Ayın içinde bulunduğumuz günü(0-30 arası)
getMonth()=>>İçinde bulunduğumuz ayın index no sunu verir.(Mayıs için 4 mesela)
getHours()==>İçinde bulunulan saat(0-23 arası)
getMinutes()==>İçinde bulunulan dakika(0-59 arası)
getSeconds()==>İçinde bulunulan saniye.
Evet arkadaşlar yukarıda gösterdiğim metotların döndürdüğü değerler dizi değişkenine atanarak dizinin o indekse karşılık gelen değerini yazdırıyoruz.Olay kısaca bundan ibaret.Çok ilginiz çekmeyebilir ama paylaşmadan geçemedim. Başka paylaşımlarla buluşmak dileğiyle. Sağlıcakla kalın...
Kaydol:
Kayıtlar (Atom)