Merhaba arkadaşlar bu örneğimizde sizlerle birlikte DataSet kullanarak veritabanındaki kayıtları daha önce sizlerle paylaştığım örnekte olduğu gibi sayfalar halinde listelerken bu defa istediğimiz herhangi bir kaydın verileri üzerinde silme ve güncelleme işlemleri de yapabileceğiz. Aynı zamanda belirli bir kaydın haricinde gerektiğinde  tüm kayıtları da silme işlemini de uygulamalı olarak yapacağız. Öncelikle şunu belirteyim ki bu işlemleri sene başında sizlerle öğrendiğimiz Visual Studio programındaki nesneleri ve onları özelliklerini kullanarak sihirbazlar yardımıyla neredeyse kod yazmadan yapmak elbette mümkün ki biz bunu atölye çalışmalarında çok defa yaptık. Burada ise temel C#  programlama kodları ile aynı işlemi nasıl yapacağız bunu öğreneceğiz. Sakın unutmayın kodlar gözünü korkutması tekdüze işlemlerin tekrarı sadece bunlar. Kodlamada dikkat edeceğiniz en önemli diğer nokta ise ne yazdığınızın yanında nereye yazdığınızdır ki bunu bu örnekte açık ve net bir biçimde göreceksiniz. Örneğimizde kayıt silme işlemleri sitedeki resim dosyalarına herhangi bir işlem yapmamaktadır. Sizlerden beklentimiz kayıt silme işlemlerine aynı zamanda o kayda ait resim dosyasını silme kodlarını eklemenizdir elbette kabul ederseniz. Kodlardan önce verdiğim açıklama satırlarını mutlaka okuyunuz. Mutlu kodlama günleri dilerim.
         Web sitesini çalıştırdığınızda Şekil-1 deki ekran görüntüsünü alacaksınız. Bu ekranda düzenlemek istediğiniz kaydın en sağ sütununda yer alan düzenle düğmesine bastığınızda ise Şekil-2 de verildiği üzere seçilen kaydın bilgileri ve bu kayıt üzerinde silme ve güncelleme işlemleri yapabileceğiniz düğmeler görüntülenecektir. Silme ve güncelleme işlemleri kullanıcı onayına bağlıdır ama bu işlemler client-pc/istemci bilgisayar tarafında javascript kodlar ile yapılmaktadır. Özetle sadece onay verilen işlemler sunucuya gitmektedir.

-
Şekil-1 Şekil-2

    Bu ekranlarda kullanıcı onayını almak için yazdığım javascript kodlar aşağıdaki gibidir. Burada en çok dikkat edeceğiniz nokta güncelleme ile ilgili size eba üzerinden sorduğum sorunun cevabını burada OleDbDataReader kullanarak değil de DataSet kullanarak yapmış olmamdır. Bundan sonrası size kalmış bunu temel alarak OleDbDataReader nesnesi ile yapılan örneği de siz bu işleri yapabilecek hale getirebilrisiniz. Bu arada derste kullandığımız için yazdığım window.open() yerine location.assign(), location.reload(), location.replace() gibi metodlardan hangilerini kullanabileceğinizi de araştırmayı unutmayın.

<script language="javascript" type="text/javascript">
function onay(id,sayNo,islem) {
var cevap = false;
var adres = "";
if (islem == 1) {
    //guncelleme icin yonlendir
    cevap = confirm(id + " numarali kayit güncellenecek onayliyor musunuz?");
    if (cevap == true) {
        adres = "kayitListlemeDuzenleme.aspx?kid=" + id +"&id=" +sayNo  + "&islem=guncelleme";
        for (var i = 1; i < 5; i++) adres += "&txt" + i + "=" + document.getElementById("txt" + i).value;
        window.open(adres, "_self");    
    }
} else if (islem == 2) {
    //silme icin yonlendir
    cevap = confirm(id + " numarali kayit silinecek onayliyor musunuz?");
    if (cevap == true) window.open("kayitListlemeDuzenleme.aspx?kid=" + id + "&id=" + sayNo + "&islem=silme", "_self");
}
} //end of onay
function silmeOnay() { 
    var cevap = false;
    cevap = confirm("Tüm kayıtlar geri gelmemek üzere silinecektir \n işlemi onaylıyor musunuz?");
    if (cevap == true)
    window.open("kayitListlemeDuzenleme.aspx?islem=temizle","_self");
}//end of silmeOnay
</script>

     C# ile sunucuda yapılacak işlemleri kodlarken proje genelinde ve özellikle listeleme ile güncelleme işlemlerinde kullanacağımız değişkenlerin tanımlamaları aşağıdaki gibidir. Bunları kaynak dosyayı indirdikten sonra projenize eklemeyi unutmayınız.

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.OleDb;
public partial class _Default : System.Web.UI.Page
{
OleDbConnection conn= new OleDbConnection();
OleDbCommand cmd= new OleDbCommand();
OleDbDataAdapter da=new OleDbDataAdapter();
DataSet ds= new DataSet();
//guncelleme ile gelecek bilgilerin saklanacagi dizi degisken 
string[] bilgiler = new string[4];
int topKaySay = 0; //toplam kayit sayisi
//bu degeri degistirerek her sayfada kaç adet kayit listelenecek
//karar verebilirsiniz.
int sayBasKaySay = 3; // sayfa basina kayit sayisi
//buradan itibaren page_load ve diger fonskiyonlar yer alacak :)
... 
}//end of class

   Sayfa ilk defa yüklenirken yapılan ilk işlem sayfaya gelen parametreler varsa onları okumaktır. islem parametresi ile kayıt silme, guncelleme ya da tum kayıtları silme işlemi gerçekleştirilmektedir. Burada dikkat edilecek nokta kodları yazdığım sıraya göre şayet bir kayıt silinirse kayitID gelmiş olsa bile secilenKaydinBilgileriniGetir() fonksiyonunun çalışmamasıdır çünkü kayıt silinmiştir Bu nedenle kayitID kayit silme sonrası boşaltılmaktadır.

protected void Page_Load(object sender, EventArgs e)
{
    int sayfa = 1;
    string sayfaID = Request.QueryString.Get("id");
    string kayitID = Request.QueryString.Get("kid");
    string islem = Request.QueryString.Get("islem");
    //tum kayitlar silinecek
    if (islem == "temizle") kayitSil(0);
    //seilen kayit silinecek
    if (islem == "silme")
    {
        kayitSil(int.Parse(kayitID));
        //silinen kayda ait veriler listelenmeye calisilmasin
        kayitID = "";
    }
    //secilen kayit guncellenecek
    if (islem == "guncelleme")
    {
        //gelen yeni veriler okunuyor
        for (int i = 0; i < 4; i++) bilgiler[i] = Request.QueryString.Get("txt" + (i + 1));
        kayitGuncelle(int.Parse(kayitID));
    }

    //sayfa numarasi gonderilmisse istenen sayfadaki kayitlari
    //gonderilmemisse ilk sayfadaki kayitlari listeliyoruz
    if (!string.IsNullOrEmpty(sayfaID)) sayfa=int.Parse(sayfaID);
    kayitlariListele(sayfa);

    //sayet herhangi bir kayit uzerinde duzenleme yapilmak isteniyorsa o kaydin
    //id bilgisi kayitID degiskenine okunuyor. Herhangi bir kayitID varsa o kayda
    //ait bilgileri metin kutularinda goruntuluyoruz.
    if(!string.IsNullOrEmpty(kayitID))secilenKaydinBilgileriniGetir(int.Parse(kayitID),sayfa);
}

        Gelelim ilk temel işlem olan tüm kayıtların sayfalar halinde görüntülenmesine; bu amaçla aşağıda verdiğim kayitlariListele() fonksiyonunu yazdm ki siz buna bir önceki hafta verdiğim atölye çalışmasından aşinasınız. Önemli olan nokta burada listelenmek istenen safyanın kendisine gönderilmesidir. Bu kod bir önceki hatfa verilen koddan birazcık farklı çünkü buna listeleme düğmelerinin bittiği yere tüm kayıtları silmesi için bir Tüm kayıtları sil düğmesini eklemiş olmamdır.

void kayitlariListele(int sayfaNo) {
////////////////////////////////////////////////////////////////////////////////////////
// Kodlama          : Bilal SERT
// Amaç             : Bir tablo verilerini sayfalayaral listelemek
// Giriş/Çıkış      : sayfaNo listelenmek istenen sayfa / yok.
// Tarih|Saat       : 20.04.2020 | 08:20
//Çağrıldığı yer    : Page_Load
////////////////////////////////////////////////////////////////////////////////////////
int baslangic = 0, bitis = 0;
conn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" +
				Server.MapPath("~/ data.mdb");
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM ogrenciler ORDER BY id DESC";
try
{
conn.Open();
da.SelectCommand = cmd;
// buraya dikkat edin lutfen
ds.Clear();
da.Fill(ds, "ogrenciler");

if (ds.Tables["ogrenciler"].Rows.Count  >  0)
{
// sayet kayit varsa
topKaySay = ds.Tables["ogrenciler"].Rows.Count;
// sayet tek sayfada goruntulenmek istenenden fazla kayıt varsa
if (topKaySay  >  sayBasKaySay) {
	// safa sayimizi hesapliyoruz
	int sayfaSay=0;
	int kalan = topKaySay % sayBasKaySay;
	if (kalan != 0) sayfaSay = ((topKaySay-kalan) /  sayBasKaySay)+1;
	else sayfaSay = topKaySay /  sayBasKaySay;
	// koprulerimizi olusturuyoruz
	veriler.InnerHtml = "< div class='yerTutucu' id='sayfaKopruleri' > ";
	for (int i = 1; i < = sayfaSay; i++)
	{
		if(i !=sayfaNo)
			veriler.InnerHtml + =  "< A href='kayitListlemeDuzenleme.aspx?id=" + i.ToString() + 
			"' target='_self' > " + i.ToString() + "< / a > ";
		else
			veriler.InnerHtml + =  "< A class='aktif' href='kayitListlemeDuzenleme.aspx?id=" +
			i.ToString() + "' target='_self' > " + i.ToString() + "< / a > ";
	}
	/ / tuk kayitlari silmek ici bir dugme ekliyoruz
	veriler.InnerHtml + =  "< input style='width:auto; margin-left:5px; height:35px' type='button' 
	                      id='btnTemizle' class='btn3' value='Tüm kayitlari sil' onclick='silmeOnay();' /  > ";
	veriler.InnerHtml+ = "< / div > ";
	veriler.InnerHtml + =  "< br /  > < br /  > ";
		
	// listeleme yapilacak kayit araligi belirleniyor
	// burada dikkat edilmesi gereken nokta son sayfadaki kayit sayisidir
	// sayet son sayfada listelenmek istenenden daha az kayit kalirsa ne olacak?
	// Misal: 20 kayit için her sayfada 3  kayit olursa bu durumda son sayfada 2 kayit olacaktir. 
	baslangic = (sayfaNo - 1) * sayBasKaySay;
	if ((topKaySay - baslangic)  >  sayBasKaySay) bitis = baslangic + sayBasKaySay;
	else bitis = topKaySay;
	
}
// simdi verileri listeliyoruz
veriler.InnerHtml + =  "< div class='yerTutucu' > < table id='liste' > ";
for (int i =baslangic ; i <  bitis; i++)
{

	veriler.InnerHtml + =  "< tr > ";
	for (int j = 0; j <  ds.Tables["ogrenciler"].Rows[i].ItemArray.Length; j++)
	{
		veriler.InnerHtml + =  "< td class='veri' > ";
		// foto sutunundaki verileri < img etiketi icerisine aliyoruz ki fotograflar web sayfasinda goruntulensin
		if (j == 5)
			veriler.InnerHtml + =  "< img src='" + ds.Tables["ogrenciler"].Rows[i][j].ToString().Substring(2) + "' /  > ";
		else
			veriler.InnerHtml + =  ds.Tables["ogrenciler"].Rows[i][j].ToString();
		veriler.InnerHtml + =  "< / td > ";
	}
	// Duzenlemek istedigimiz kaydin ID sini ve bu kaydin bulundugu sayfa numarasini
	// iceren bir kopru olusturuyoruz. Boylece sayfa sunucuya gittginde hangi kaydin
	// duzenlenmek istendigini anlayabilecegiz
	veriler.InnerHtml + =  "< td class='veri' > ";
	veriler.InnerHtml + =  "< A style='width:auto; margin-right:10px;padding-right:5px' href='kayitListlemeDuzenleme.aspx?kid=" + ds.Tables["ogrenciler"].Rows[i][0].ToString() +
	   "&id=" + sayfaNo +"' target='_self' > Düzenle< / A >";
	veriler.InnerHtml + =  "< / td > ";

	veriler.InnerHtml + =  "< / tr > ";
}
veriler.InnerHtml + =  "< / table > < / div > ";
}
else{
// kayit yoksa
veriler.InnerHtml = "< span class='hata' > Upps! Kayıt bulunamadı< / span > ";}
}
catch (Exception ex){
veriler.InnerHtml = "< div class='hata' > ";
veriler.InnerHtml + =  "Hata! (Kayit listeleme modulu) < br /  > ";
veriler.InnerHtml + =  ex.Message.ToString() + "< br /  > ";
veriler.InnerHtml + =  "< / div > ";}
finally{
if (conn.State == ConnectionState.Open) conn.Close();}        
}// end of kayitlariListele

        Seçilen bir kayda ait verileri web kontrollerine yüklemek için seçilenKaydinBilgileriniGetir() fonksiyonunu yazdım. Buna ait kodlar ise aşağıda verdiğim gibidir. Bu kodda ilgili kaydı silme ve güncelleme düğmeleri HTML elemanı olarak eklenmiştir bunlar birer aspx nesnesi değiller. Bu kodların çalışması tamamen yukarıda verdiğim JavaScript koda bağlıdır.

void secilenKaydinBilgileriniGetir(int kayitNo,int sayNo) {
////////////////////////////////////////////////////////////////////////////////////////
// Kodlama          : Bilal SERT
// Amaç             : Istenen kayda ait bilgileri web kontrollerinde goruntelemek
// Giriş/Çıkış      : sayfaNo listelenmek istenen sayfa / yok.
// Tarih|Saat       : 28.04.2020 | 09:30
//Çağrıldığı yer    : Page_Load
////////////////////////////////////////////////////////////////////////////////////////
conn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" +
					Server.MapPath("~/ data.mdb");
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM ogrenciler WHERE id=" +kayitNo ;
try
{
conn.Open();
da.SelectCommand = cmd;
// buraya dikkat edin lutfen
ds.Clear();
da.Fill(ds, "ogrenciler");
if (ds.Tables["ogrenciler"].Rows.Count  > 0)
{
// sayet kayit varsa
// 1. yontem tum satirlari ve sutunlari dongu ile okumak
secilen.InnerHtml + = "< div class=\"veriAlani\" >";
secilen.InnerHtml + = "< table cellpadding='0' cellspacing='5' style='width:100%'  >";
secilen.InnerHtml + = "    < tr >";
secilen.InnerHtml + = "        < td colspan='3' class='baslik' >";
secilen.InnerHtml + = "            Kayıt detayları< / td >";
secilen.InnerHtml + = "     < / tr >";
secilen.InnerHtml + = "    < tr >";
secilen.InnerHtml + = "        < td class='etiketler' >Adı< / td >";
secilen.InnerHtml + = "        < td class='secilen' >";
secilen.InnerHtml + = "< input id='txt1' type='text' value='" + ds.Tables["ogrenciler"].Rows[0][1].ToString() + "' /  >";            
secilen.InnerHtml + = "         < / td >";
secilen.InnerHtml + = "         < td rowspan='4' align='center' valign='middle' >";
secilen.InnerHtml + = "< img src='" + ds.Tables["ogrenciler"].Rows[0][5].ToString().Substring(2) + "' /  >";
secilen.InnerHtml + = "        < / td >";
secilen.InnerHtml + = "    < / tr >";

secilen.InnerHtml + = "    < tr >";
secilen.InnerHtml + = "        < td class='etiketler' >Soyadı< / td >";                    
secilen.InnerHtml + = "        < td class='secilen' >";
secilen.InnerHtml + = "< input id='txt2' type='text' value='" +  ds.Tables["ogrenciler"].Rows[0][2].ToString() + "' /  >";             
secilen.InnerHtml + = "        < / td >";
secilen.InnerHtml + = "    < / tr >";

secilen.InnerHtml + = "    < tr >";
secilen.InnerHtml + = "        < td class='etiketler' >Sınıfı< / td >";                    
secilen.InnerHtml + = "        < td class='secilen' >";
secilen.InnerHtml + = "< input id='txt4' type='text' value='" +  ds.Tables["ogrenciler"].Rows[0][4].ToString() + "' /  >";        
secilen.InnerHtml + = "        < / td >";
secilen.InnerHtml + = "    < / tr >";

secilen.InnerHtml + = "    < tr >";
secilen.InnerHtml + = "        < td class='etiketler' >Numarası< / td >";             
secilen.InnerHtml + = "        < td class='secilen' >";
secilen.InnerHtml + = "< input id='txt3' type='text' value='" +  ds.Tables["ogrenciler"].Rows[0][3].ToString() + "' /  >";           
secilen.InnerHtml + = "        < / td >";
secilen.InnerHtml + = "    < / tr >";
secilen.InnerHtml + = "    < tr >";
secilen.InnerHtml + = "        < td > < / td >";
secilen.InnerHtml + = "        < td >";
secilen.InnerHtml + = "< input type='button' id='btnGuncelle' class='btn1' value='Güncelle'onclick='onay(" +  ds.Tables["ogrenciler"].Rows[0][0].ToString() +","+ sayNo + ",1);' /  >";
secilen.InnerHtml + = "< input type='button' id='btnSil' class='btn3' value='Sil' onclick='onay(" +  ds.Tables["ogrenciler"].Rows[0][0].ToString() +","+sayNo + ",2);' /  >";
secilen.InnerHtml + = "        < / td >";
secilen.InnerHtml + = "        < td align='center' >";
secilen.InnerHtml + = "          ";
secilen.InnerHtml + = "        < / td >";
secilen.InnerHtml + = "    < / tr >";
secilen.InnerHtml + = "< / table >";     
secilen.InnerHtml + = "< / div >";
}else{// kayit yoksa kullaniciya bilgi verilebilir.}
}
}catch (Exception ex){
secilen.InnerHtml = "< div class='hata' >";
secilen.InnerHtml + = "Hata! (Secilen kaydı goruntuleme modulu) < br /  >";
secilen.InnerHtml + = ex.Message.ToString() + "< br /  >";
secilen.InnerHtml + = "< / div >";
}finally{
if (conn.State == ConnectionState.Open) conn.Close();}   
}// end of secilenKaydinBilgileriniGetir


        Herhangi bir kaydı ya da tüm kayıtları silmek için ise kayitSil() fonksiyonunu yazıdım. Bu fonksiyon duruma göre, yani kayitNo 0 ise tüm kayıtları aksi durumda ise sadece ilgili kaydı siliyor. Burada dikkati çeken tek yer SQL cümlesi gençler çünkü silmede kullanılan cümle değişince yapılan işlem de değişiyor.

void kayitSil(int kayitNo){
////////////////////////////////////////////////////////////////////////////////////////
// Kodlama          : Bilal SERT
// Amaç             : id si verilen kaydi silmek
// Giriş/Çıkış      : kayitNo 
// Tarih|Saat       : 28.04.2020 | 10:30
//Çağrıldığı yer    : Page_Load
////////////////////////////////////////////////////////////////////////////////////////
int sonuc = 0;
// Dikkat: kayitNo=0 ise tum kayitlar silinecek
conn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" +
				Server.MapPath("~/ data.mdb");
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
if(kayitNo!=0)
 cmd.CommandText = "DELETE * FROM ogrenciler WHERE id=" + kayitNo;
else
 cmd.CommandText = "DELETE * FROM ogrenciler";
try{
conn.Open();
sonuc = cmd.ExecuteNonQuery();
if (sonuc == 1){
secilen.InnerHtml = "< div class='hata' > ";
secilen.InnerHtml + =  "Kayıt silme işlemi başarı ile tamamlandı< br /  > < br /  > ";
secilen.InnerHtml + =  "< / div > ";}
}catch (Exception ex){
secilen.InnerHtml = "< div class='hata' > ";
secilen.InnerHtml + =  "Hata! (Kayit silme modulu) < br /  > ";
secilen.InnerHtml + =  ex.Message.ToString() + "< br /  > ";
secilen.InnerHtml + =  "< / div > ";
}finally{
if (conn.State == ConnectionState.Open) conn.Close();}
}// end of kayitSil


       Seçilen kaydı güncelleyebilmek için ise kayitGuncelle() fonksiyonunu yazdım. Bu fonksiyonun çalışabilmesi için sayfa başında verilen JavaScript kodun görevini doğru yapması gerekmektedir. Çünkü güncelleme işlemi için yeni değerlerin sunucuya gönderilmesi gerekmektedir ki ben de bunu javascript kodda gerçekleştirdim. İlerleyen zamanlarda session() kullanımını öğrendiğinizde bunların hiçbirine gerek kalmayacak o güne kadar bu biçimde kodlamak zorundasınız

void kayitGuncelle(int kayitNo){
////////////////////////////////////////////////////////////////////////////////////////
// Kodlama          : Bilal SERT
// Amaç             : id si verilen kaydin verilerini guncellemek
// Giriş/Çıkış      : kayitNo 
// Tarih|Saat       : 28.04.2020 | 10:40
//Çağrıldığı yer    : Page_Load
////////////////////////////////////////////////////////////////////////////////////////
int sonuc = 0;
conn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" +
					Server.MapPath("~/ data.mdb");
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@p1", bilgiler[0]);
cmd.Parameters.AddWithValue("@p2", bilgiler[1]);
cmd.Parameters.AddWithValue("@p3", bilgiler[2]);
cmd.Parameters.AddWithValue("@p4", bilgiler[3]);

cmd.CommandText = "UPDATE ogrenciler SET adi=@p1,soyadi=@p2,numarasi=@p3,sinifi=@p4 WHERE id=" +  kayitNo;
try{
conn.Open();
sonuc = cmd.ExecuteNonQuery();
}catch (Exception ex){
secilen.InnerHtml = "< div class='hata' > ";
secilen.InnerHtml + =  "Hata! (Kayit guncelleme modulu) < br /  > ";
secilen.InnerHtml + =  ex.Message.ToString() + "< br /  > ";
secilen.InnerHtml + =  "< / div > ";
}finally{
if (conn.State == ConnectionState.Open) conn.Close();}
}/ / end of kayitGuncelle