Microsoft firmasının access ismini verdiği veritabanı uygulaması ile projeler geliştiren arkadaşların bildiği gibi ado bileşeninin recordset sınıfı bize uygulamalarımızda bir çok kolaylık sağlamaktadır. Bunlardan birisi de bir sql sorgusu çalıştırdığımızda recordset nesnesine ulaşarak etkilenmiş kayıt sayısını alabiliyoruz.Ancak bahsettiğimiz recordset sınıfı mySQL ile çalışırken bir takım problemler çıkarmaktadır. Mesela recordcount metodu çalışmamaktadır. Hal böyle olunca mySQL ile toplam kayıt sayısına erişemeyeceğimiz kanısına kapılmamız normaldir. Ancak durum öyle değil. Kayıt sayısına erişmek için mySQL’in de 1’den fazla yöntemimiz bulunuyor. Şimdi sırasıyla bu yöntemlere bakalım.İlk yöntem SQL sorgulama dilinin imkanlarından faydalanarak toplam kayıt sayısını döndürmektir. Örnekleri ASP dili üzerinden vereceğim. Ancak örnek içinde göreceğiniz SQL kısmı tüm programlama dillerinden aynı sonucu verecektir.set kayitlar = conn.Execute(“Select Count(*) as Toplam from tabloismi where sehir=’İZMİR’ “)response.write kayitlar(“Toplam”)
“conn” isimli değişken bizim mySQL bağlantımızı sağlamış bir nesnedir ve yukarıdaki örnekten daha önce tanımlamış olmanız gerekmektedir. Ancak burada şuna dikkat etmelisiniz. mySQL veritabanı count fonksiyonunu desteklemekle birlikte aynı sorgu içinde min, max, group gibi deyimleri kullanmanızı şart koşmuştur. Aksi halde hata alırsınız ve programınız çalışmaz. Bu kez group min max gibi fonksiyonların etkileri istediğiniz sonuçları bozabilecektir. Bu da istenmeyen bir durumdur. Bu durumlar için önerebileceğim 2 yöntem bulunuyor.set kayitlar = conn.Execute(“Select Count(*),sehir,id as Toplam from tabloismi where sehir=’İZMİR’ group by id “)response.write kayitlar(“Toplam”)
Bu örnekte mySQL’in bir isteğini “id” sûtununu gruplandırarak sağladık. id alanını otomatik artan sayılar olarak düzelemiş olmanız gerekmektedir. Biz sehir sûtununu gruplandırmış olsaydık bu kez kaç adet izmir ile ilgili kayıt olduğu bilgisini kaçıracaktık zira group deyimi bütün izmir ile ilgili kayıtları yok edecek sadece 1 tanesini döndürecekti. Oysa id alanında hiçbir veri birbirine benzemediğinden dönecek kayıt sayısı gruplandırılmamış ama mySQL’in isteği yerine getirilmiş oluyor. Ama yine de bir yorucu tarafı var ki, count deyiminden sonra tuttuğu verilere ihtiyacımız olan sütun isimlerini de ard arda yazmamız gerekmektedir. Gerçi bunu performans için normalde de yapmamız gerekir ama yapmadığımızda hata vermezdi. Count kullandığımız zaman gerekli sütunların yazmazsak bu kez hata alacağımız belirtmeliyim.Bir diğer yöntem aynı sorguyu iki kez çalıştırmaktır.set N = conn.Execute(“Select * from tabloismi where sehir=’İZMİR'”)set K = conn.Execute(“Select Count(*) as Toplam from tabloismi where sehir=’İZMİR'”)response.write K(“Toplam”)response.write N(“Sehir”)
Gördüğünüz gibi hiçte pratik değil. Üstelik aynı işi iki kez yaptırmak performansı katledecektir. Ama bu da bir çözümdür. Pratik ve geçerli olmasa bile..Son çözüm yolu da şudur; mySQL’de bir özellik bulunmaktadır. Bu özellik çalıştırılan her sorgu sonucunda etkilenen, yani o sorguyla ilgili kayıtların sayısını tutması özelliğidir. Ama tahmin edeceğiniz gibi varsayılan olarak kapalıdır. Çünkü her sorgu ile kayıt sayısını takip etmenin bir performans maliyeti bulunmaktadır. Kayıt sayısı bize lazım olduğunda sorgumuzu şu şekilde oluşturmalıyız.set Kayitlar = conn.Execute(“Select SQL_CALC_FOUND_ROWS * from tabloismi where sehir=’İZMİR'”)Set Toplam = conn.Execute(“SELECT FOUND_ROWS() as kayit”)response.write Kayitlar(“sehir”)response.write Toplam(“kayit”)
Bu yöntem de pek pratik değil ancak bir süre önce yazdığım bir makalemde sorgu işlerimizi kolaylaştıran bir ASP sınıfı yazmıştım. Yukarıdaki örneği çok daha pratik bir halde uygulayabilirsiniz. Örneğe dönecek olursak şunu belirteyim ki, sorgumuz 2 ayrı sorgu gibi görünse de performans açısından iki sorgu etkisi değil tek sorgu etkisi sağlamaktadır. Gördüğünüz gibi ilk sorgumuzda SQL_CALC_FOUND_ROWS fonksiyonunu kullanarak mySQL’in kayıt sayısını takip eden ajanını aktif hale getirmiş olduk. Sorgumuzun çalıştırılması bittiğinde mySQL etkilenmiş kayıt sayısını özel bir değişkeninde saklıyor olacak. FOUND_ROWS() fonksiyonu ile tutulan değeri sorgu içinde tanımladığımız “kayit” isimli değişkene aktarmış oluyoruz.Verdiğimiz örnekler içinde en performanslısı son örnekteki yöntemdir. Biraz kalabalık bir kodlama gerektirmesi canınızı sıkabilecektir ancak belirttiğim makaleme bakarak bu kalabalıklığı da gidermeniz mümkündür.Eh artık mySQL’in de kayıt sayısı döndürebildiğini gördüğümüze göre, ve ücretsiz olduğunu da hatırlayacağımız üzere, access yerine SUN firmasının desteklediği bu güzide veritabanını kullanmamanız için br neden yok.———————————Göz atmak isteyebileceğiniz diğer yazılarım# Metin Şeklinde URL Kullanma (ASP & IIS 6.0)# ASP’de Esnek Fonksiyonlar Üretmek# ASP ile gruplandırma algoritmaları üzerine# ASP’de mySQL İşlemlerini Otomatiğe Bağlayın!..