Makale Özeti

DataTable sınıfına ait metodlar yardımıyla, belli bir veri kümesi üzerinde yapılan arama ve filtreleme işlemleri sırasında dikkat etmemiz gereken unsurları incelemeye çalışacağız.

Makale

Arama ve Filtreleme İşlemlerinde Dikkat Edilmesi Gereken Unsurlar

DataTable sınıfına ait metodlar yardımıyla, belli bir veri kümesi üzerinde yapılan arama ve filtreleme işlemleri sırasında dikkat etmemiz gereken unsurları incelemeye çalışacağız. İlk olarak, tek satırlık sonuç döndüren ve primary key alanlar üzerinde arama işlemlerini gerçekleştirmemizi sağlıyan Find metodu ile işe başlayalım. Prototipi aşağıdaki gibi olan Find metodu, bir DataTable nesnesinin DataRowCollection koleksiyonuna uygulanabilir.

public DataRow Find(object);

Bu metodu kullanarak yapılan arama işlemlerinde dikkat edilmesi gereken nokta, object parametresi ile girilen değerin (ki bu aranmak istenen değerdir) tabloya ait primary key alanı(alanları) üzerinden aranacağıdır. Dolayısıyla bu tip arama işlemlerinde DataTable için arama yapılacak alanların primary key olarak belirtilmesi gerekir. Diğer yandan, Find metodu geriye tek satırlık DataRow tipinden nesne döndürür. Belirli bir kritere uyan özellikle unique aramalarda bu metod sıkça kullanılır. Örneğin elimizde aşağıdaki gibi bir tablo olduğunu varsayalım.

Şekil 1 . Kisiler tablosuna ait örnek veriler.

SQL Sunucusunda yer alan bu tabloda KisiID alanı primary key özelliğindedir. Şimdi bu alan üzerinden, belirli bir satır bilgisini elde edebilemek için kullanabileceğimiz arama tekniğini içeren, basit bir kod geliştirelim.

SqlConnection conFriends;
SqlDataAdapter da;
DataTable dtKisiler;

private void Form1_Load(object sender, System.EventArgs e)
{
    conFriends = new SqlConnection("data source=localhost;initial catalog=Friends;integrated security=sspi");
    da=new SqlDataAdapter("SELECT * FROM Kisiler",conFriends);
    dtKisiler=new DataTable();
    da.Fill(dtKisiler);
    dtKisiler.PrimaryKey=new DataColumn[]{dtKisiler.Columns["KisiID"]}; /*Burada DataTable nesnemiz için primary key alanını belirliyoruz. Artık Find metodu ile gerçekleştireceğimiz aramalar bu alan üzerinden gerçekleştirilecek.*/
}

private void btnBul_Click(object sender, System.EventArgs e)
{
    txtSonuclar.Clear();
    DataRow drBulunan=dtKisiler.Rows.Find(txtKisiID.Text); /* Arama işleminin sonucu bir DataRow nesnesidir.*/
    txtSonuclar.Text+=drBulunan["Ad"].ToString()+" "+drBulunan["Soyad"].ToString()+" "+drBulunan["DogumTarihi"].ToString()+" ";
}

Yukarıdaki basit örnekte arama işlemini, tablodaki primary key alanı üzerinden, DataTable sınıfının Rows koleksiyonundaki Find metodu yardımıyla gerçekleştirdik. Şimdi bu primary key tanımlamasını yapmadığımızı göz önüne alalım. Bu durumda "Table does not have a primary key" istisnasını alırız. Dolayısıyla Find metodu üzerinden yapılacak olan arama işlemlerinde, primary key bilgisinin DataTable nesnesine mutlaka geçirilmesine dikkat edilmeliyiz.

Çoğu zaman Find metodunu kullanarak tek satırlık arama işlemleri gereçkleştirmeyiz. Zaman zaman, sonuç kümeleri döndürecek filtreleme işlemleri yaparız. Filtreleme işlemleri için ise DataTable sınıfının aşağıda prototipi verilen, Select metodunu kullanırız.

public DataRow[] Select();

Bu metod dikkat edeceğiniz gibi DataRow türünden bir nesne dizisini geriye döndürür. Select metodu kullanımı itibariyle bir sql cümleciğinde yer alana where ile başlayan kısımlar ile neredeyse aynıdır. Örneğin yukarıdaki tabloyu göz önüne aldığımızda, Meslek alanları Mat.Muh. olan alanları bulmak istediğimizde aşağıdaki kod satırlarını uygularız.

DataRow[] drMeslek=dtKisiler.Select("Meslek="+txtMeslek.Text+"");
foreach(DataRow dr in drMeslek)
{
    txtSonuclar.Text+=dr["Ad"].ToString()+dr["Soyad"].ToString();
}

Burada önemli nokta arama kriteri ifadesinin yazılış şekli ve sonuçların bir DataRow dizisi şeklinde döndürülmesidir. Select ifadesi böylesine kullanışlı olmasına rağmen kullanımında dikkat edilmesi gereken unsurlar vardır. İlk dikkat edilmesi gereken nokta, alan adlarında boşluk karakterlerinin kullanılmasıdır. Söz gelimi Meslek alanının ismini Meslek Bilgisi olarak değiştirelim. Bu durumda yukarıdaki kodları aşağıdaki şekilde değiştirip çalıştıralım.

DataRow[] drMeslek=dtKisiler.Select("Meslek Bilgisi="+txtMeslek.Text+"");
foreach(DataRow dr in drMeslek)
{
    txtSonuclar.Text+=dr["Ad"].ToString()+dr["Soyad"].ToString();
}

Bu durumda "System.Data.SyntaxErrorException" istisnasını alırız. Bunun sebebi Meslek Bilgisi alanının boşluk karakterini içermesidir. Bu sorunun çözümü, bu tip boşluk karakteri içeren alan adlarını [ ] içerisine almaktır. Aynı kodu aşağıdaki şekilde düzeltelim.

DataRow[] drMeslek=dtKisiler.Select("[Meslek Bilgisi]="+txtMeslek.Text+"");
foreach(DataRow dr in drMeslek)
{
    txtSonuclar.Text+=dr["Ad"].ToString()+dr["Soyad"].ToString();
}

Bu durumda sorgulama işleminin başarılı bir şekilde gerçekleştirildiğini görürüz. Select tekniğinde dikkat edilecek bir diğer husus, aranacak verilerin içerisinde işaretinin olmasıdır. Genellikle bazı yabancı isimlerde bu tarz tırnaklar kullanılır. Örneğin OReilly gibi. Veritabanında yer alan bu tipteki alanların Select metodu ile aranması sırasındada dikkatli olunmalıdır. Yukarıdaki tablomuzda aşağıdaki şekilde görülen iki yeni satır ekleyelim. Burada soyadı bilgilerinde işareti yer almaktadır.

Şekil 2. Virgül işareti içeren satırlar.

Şimdi bu soyadını filtreleyecek kodlarımızı yazalım.

DataRow[] drSoyad=dtKisiler.Select("Soyad="+txtSoyad.Text+"");
foreach(DataRow dr in drSoyad)
{
    txtSonuclar.Text+=dr["Ad"].ToString()+dr["Soyad"].ToString();
}

 

Bu kod satırları ile uygulamamızı çalıştırdığımızda yine  "System.Data.SyntaxErrorException" istisnasını alırız. Bunun sebebi, arama kriteri olarak ORen girdiğimizde Select metodunun parametre değerinin aşağıdaki hali almasıdır.

Soyad=ORen

Bu tarz bir durumla karşılaşıldığında ne yapılabilir? Bunun için string fonksiyonlarından olan Replace metodunu kullanarak aranan alan değerin içindeki tek tırnak işaretini iki adet tek tırnak işareti ile değiştirmeliyiz.

string aranan=txtSoyad.Text.Replace("","");
DataRow[] drSoyad=dtKisiler.Select("Soyad="+aranan+"");
foreach(DataRow dr in drSoyad)
{
    txtSonuclar.Text+=dr["Ad"].ToString()+dr["Soyad"].ToString();
}

Yukarıdaki kodda görüldüğü gibi işaretini haline getirdik. Bu kod doğru şekilde çalışacak ve ORen soyismine sahip alanlar elde edilebilecektir. Bu makalemiz ile Find ve Select teknikleri ile ilgili arama işlemlerinde dikkat etmemiz gereken önemli noktaları vurgulamış olduk.Bir sonraki makalemizde görüşmek dileğiyle hepinize mutlu günler dilerim.

Okan Barlas

okan.barlas@netron.com.tr