CSharpNedir.com Forum bölümünde bir arkadaşın sorduğu Sınırsız Kategori sorunsalına çözüm olmak için ufak bir kod yazdım. İlerde bende belki kullanırım ve yardıma ihtiyacı olana yardım edelim diyerek paylaşıyorum.
Sorunumuzu kısaca anlatmak gerekirse, Sınırsız kategorileme yapan bir sistemde bir ürünün hangi kategorilerin altında bulunduğunu haritalamak istiyoruz.
Bunun için ilk önce sınırsız kategori tablosunun yapısını, ürün tablosunun yapısını ve örnekleme için kullanacağımız rasgele değerleri aşağıda görüldüğü gibi işliyoruz.
Kategori Tablo Yapısı :
Ürün Tablo Yapısı :
Kategori Tablosu Örnek Dataları :
Ürün Tablosu Örnek Dataları :
Ve sıra geldi kodlamamıza :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Collections;
namespace WebApplication1
{
public partial class Default : System.Web.UI.Page
{
string BaglantiSatiri = "server=xxxxx.server;database=xxxxx.data;User Id=xxxxx.user;Password=xxxxx.password";
public string BilgiGetir(string Tablo, string IstenenBilgi, string AramaSorgu)
{
string sonuc = "-1";
SqlConnection Baglanti = new SqlConnection(BaglantiSatiri);
SqlCommand SQLCumle = new SqlCommand("SELECT " + IstenenBilgi + " FROM " + Tablo + " WHERE " + AramaSorgu, Baglanti);
SqlDataReader Kayit = null;
Baglanti.Open();
Kayit = SQLCumle.ExecuteReader();
if (Kayit.Read())
{
sonuc = Kayit[0].ToString();
}
if (!Kayit.HasRows) sonuc = null;
Baglanti.Close();
return sonuc;
}
public string KategoriGetir(int UrunID)
{
int TempID = Convert.ToInt32(BilgiGetir("Urun","KatID","ID=" + UrunID.ToString()));
int Temp = 0;
string TempKategoriListesi = "";
List<int> TempDizi = new List<int>();
TempDizi.Add(TempID);
while (TempID != 0)
{
TempDizi.Add(Convert.ToInt32(BilgiGetir("Kategori", "UstID", "ID=" + TempID)));
TempID = TempDizi.Last();
}
Temp = TempDizi.Count;
while (Temp != 0)
{
TempKategoriListesi += BilgiGetir("Kategori", "Name", "ID=" + TempDizi[Temp - 1].ToString()) + " -> ";
Temp = Temp - 1;
}
return TempKategoriListesi.Substring(4, TempKategoriListesi.Length - 4) + BilgiGetir("Urun", "Name", "ID=" + UrunID.ToString());
}
protected void Page_Load(object sender, EventArgs e)
{
Literal1.Text = KategoriGetir(1);
}
}
}
Görüldüğü üzere BilgiGetir(...) adında bir fonksiyonumuz mevcut olup, bu kodu bir çok yerde kullanmışımdır. Tek bir veri okumak gerektiği yerlerde son derece yardımcı olmaktadır. Kodlamayı biraz anlatmak gerekirse yaptığımız işlem, ürünün bağlı olduğu kategoriyi bulup adını almak sonra o kategoriye ait üst kategoriyi bulup adını almak ve bu işlemi en üst kategoriyi bulana kadar tekrarlamak. Kodları az çok incelediğinizde bunu zaten sizde farkedeceksinizdir. Arkadaşa yardımcı olmak için biraz hızlı biraz acemice bir kodlama oldu ama iş görmesi dileği ile. Bu da çalışan kodumuzun ekran çıktısı :