Fırat Esmer

ANLATILAN SENİN HİKAYENDİR - Karl Marx

DataTable'da Aggregate Fonksiyon Kullanma (Compute Metodu)

ADO.NET'in sunmuş olduğu başka bir güzellikle karşınızdayım. Bu sefer DataTable üzerinden Aggregate Function'ları kullanacağız. Tam olarak hangi işlemleri, nasıl ve neden yapalım? Şimdi öğreneceksiniz.

Senaryo : DataTable nesnesinin Compute metodunda kullanabileceğimiz aggregate fonksiyonları, Northwind veritabanının Products tablosundaki UnitsInStock ve UnitPrice kolonları üzerinde örneklendireceğim.

Bilinmesi Gerekenler :

  • Makaledeki örnek uygulama .NET Framework 4.0 (Windows Form) ve Visual Studio 2010 ile hazırlandı,
  • Makaledeki örnek uygulamada DataTable'ı doldurmak için Northwind'i kullandım. Eğer Northwind veritabanına sahip değilseniz, örnek uygulamanın çalışması için buradan indirebilirsiniz. Northwind veritabanını kullanma sebebim genelde yazılımcılarda mevcut olması. Projeye eklememe sebebim ise indireceğiniz örnek uygulamanın boyutunu küçük tutmak.

Neler Öğreneceksiniz :

  • DataTable nesnesinin Compute metodunu nasıl ve neden kullanmanız gerektiğini.

İlk olarak DataTable'ın Compute metoduyla hangi aggregate fonksiyonları kullanabiliyoruz ona bakalım.

  1. Sum - Toplam değer,
  2. Avg - Ortalama değer,
  3. Min - En küçük değer,
  4. Max - En büyük değer,
  5. Count - Kayıt sayısı,
  6. Var - Varyans değer,
  7. Stdev - Standart sapma değer.

Kullanımına gelirsek, bilmeniz gereken tek şey metot 2 tane parametre alıyor:

public object Compute(string expression, string filter);

İlk parametre kullanmak istediğiniz fonksiyonu, ikincisi ise filtre tanımı. Kullanmak istediğiniz fonksiyonun SQL'deki kullanımından hiçbir farkı yok. Filtre dediğim kısım ise "CategoryID='2'" yazdığımızda ID'si 2 olan verileri getirecektir. Örnek vereyim :

SqlDataAdapter adapter = new SqlDataAdapter("select UnitPrice,CategoryID from Products", "server=.; database=northwind; integrated security=sspi");

DataTable table = new DataTable();

adapter.Fill(table);

string result = table.Compute("SUM(UnitPrice)","CategoryID='2'").ToString();
MessageBox.Show(result);

adapter.Dispose();
table.Dispose();

Yukarıdaki örnekte Products tablosundan UnitPrice ve CategoryID verilerini çektik. Daha sonra CategoryID'si 2 olan verilerin UnitPrice'larını topladık. SQL'e sorgu yazmaktan bir farkı yok ve eğer denemek isterseniz aşağıdaki sonuçla karşılaşıcaksınız. Eğer Northwind veritabanında oynama yapmadıysanız :)

Sonuç

Eğer filtre uygulamak istemiyorsanız yapmanız gereken tek şey metodun ikinci parametresini boş bırakmak. Hepsi bu.

Gelelim ne gibi yerlerde kullanabiliriz? Eğer veritabanının bir tablosunu sayfanın/uygulamanın açılış anında dolduruyorsanız ve bu tablo üzerinden işlem yapıyorsanız bir kereliğe mahsus DataTable nesnesi üzerinde tutarsınız (Sınıf düzeyinde tanımlanmış bir DataTable) bu DataTable nesnesi üzerinden işlemleri gerçekleştirebilirsiniz. Böylece veritabanı ile bağlantı kurmaktan da kurtulursunuz.

Not :

1 - Eğer bilinmeyen bir aggregate fonksiyonu kullanırsanız aşağıdaki gibi hata alırsınız.

Hata

The expression contains undefined call X(). Hatanın Türkçesi : "İfade tanımlanmamış bir işlev çağrısı içeriyor: X()"

2 - Eğer mantıksal hata yaparsanız mesela ProductName kolonu üzerinde SUM gibi toplama fonksiyonu kullanmak isterseniz, hata alırsınız. Sebebi veri tipinin string olması ve toplayamaması. Alacağınız hata da şöyle olacaktır.

Hata

Invalid usage of aggregate function Sum() and Type: String. Hatanın Türkçesi : "Geçersiz Sum() toplam fonksiyonu ve Tür kullanımı: String."

İçerisinde tüm işlemleri barındıran ve filtrenin opsiyonel olduğu örnek uygulamamı indirmek isterseniz buraya tıklayın.

Yorum ekle

Loading