Makale Özeti

Daha önceki makalede assembly ifadelerinin SQL Server 2005 tarafından nasıl ele alındığını, SQL Server 2005 ile birlikte gelen CLR yapısı sayesinde .NET dilleri ile yazılmış kodların nasıl derlenip çalıştırıldığını inceledik. Bu yazıda ise, .NET dillerinden Visual Basic.NET ile yazılmış fonksiyonların assembly yaratılarak SQL Server tarafından çağrılıp, SELECT cümlelerimiz içersinde pratikte nasıl kullanılacağını göreceğiz.

Makale

SQL Server 2005 İçerisinde ASSEMBLY Kullanımı - 2

SQL Server 2005 Assembly kullanımı konulu ilk makalede, assembly adı verilen *.dll uzantılı com objelerimizin SQL Server tarafından nasıl ele alındığını ve belleğe yüklendiğini anlamaya çalıştık. Bugün ise assembly'lerin içerisindeki metotlara SQL Server aracılığıyla nasıl ulaşacağımızı ve kodlarımızda nasıl çağırabileceğimizi inceleyeceğiz.

2005 den önceki SQL Server sürümlerinde, standartları belirlenmiş olan SQL cümlecikleri uygulamalarımız için yeterli olmadığında, veritabanımızda çalışan sorgulara yeni özelliklerle genişletmek için T-SQL adı verilen bir dil kullanıyorduk. Fakat T-SQL, Microsoft SQL Server dışında hiçbir veritabanı yönetim sistemi tarafından tam anlamıyla desteklenmediğinden yazdığımız kodlar taşınabilirlik yeteneğinden çok uzaktı. Ayrıca T-SQL'in yazılım geliştirme konusunda bize sağladıklarının çok sınırlı olması sebebiyle çeşitli com objeleri yaratarak T-SQL ifadelerimizi güçlendirmemiz gerekmekteydi. Bu uygulamaları da Visual Basic 6.0 yada C++ kullanarak kodlamak, daha sonra SQL Server içerisinde standart olarak bulunan sp_OACreate depolanmış yordamı ile veritabanımız içinden kullanılabilir bir obje haline getirmek zorundaydık. Bu durumda da bize tanınan esneklik oldukça sınırlıydı. Örneğin; SQL Server Mail servisinin kullanım zorluğu ve ihtiyaçlarımıza tam olarak cevap vermediği durumlarda, da önceden yazılmış olan COM objelerini sp_OACreate ile yaratıp SQL Server üzerinden mail gönderebiliyorduk. Fakat bu şekilde COM objeleri kullanmak zamanla, bu objeleri VB veya C++ ile kodlayarak geliştirmenin çok karmaşık olması sebebiyle genelde vakit kaybı olacağı düşünüldü herkes tarafından kaçınılan bir yöntem haline geldi. Ve sonunda SQL Server 2005 ile birlikte bu yapı tamamen değiştirilmekte. Bundan sonra sınırlı T-SQL ifadelerinin yerine .NET Framework tarafından desteklenen her türlü yazılım geliştirme dilini veritabanımız içinden kullanabileceğiz. Bu yapıyı bize sağlayan ise, işleyiş mantığı serinin ilk makalesinde anlatılan SQL Server 2005 ile birlikte entegre gelen CLR (Common Languagage Runtime) olmaktadır. Yazının bundan sonraki bölümlerinde assembly metotlarını uygulamamızda nasıl kullanacağımız örneklerle anlamaya çalışalım.

İnternet üzerinden alışveriş yapılan bir sitemiz olduğunu düşünelim. Burada, kullanıcıların alışveriş sepetlerini görüntüledikleri ekrandaki birtakım hesaplamaları assembly kodumuz içinde yapalım ve bir view vasıtasıyla sepetlerini kullanıcılarımıza gösterelim.

Public Class SepetIslemleri

       Public Function NetFiyatHesapla(ByVal urunFiyat As Decimal, ByVal adet As Integer, ByVal kdvOran As Decimal)
               Dim netFiyat As Decimal
               netFiyat = urunFiyat * Adet + ((urunFiyat*kdvOran)/100)
               NetFiyatHesapla = netFiyat
        End Function

        Public Function KargoUcretiHesapla(ByVal urunAgirlik As Double, ByVal urunHacim As Double, ByVal urunAdet As Integer ,ByVal kargoSirketNo As Double)
               Dim bazHesap As String
               Dim katSayi, kargoUcret As Double

               If urunAgirlik > 50 Then
                    bazHesap = "Agirlik"
               Else
                    If urunHacim > 300 Then
                         bazHesap = "Hacim"
                    Else
                         bazHesap = "AgirlikVeHacim"
                    End If
               End If


               If kargoSirketNo = "1" Then
                    katSayi = 4.3
               Else If kargoSirketNo = "2" Then
                    katSayi = 3.9
               Else
                   katSayi = 4.1
               End If

               If bazHesap = "Agirlik" Then
                   kargoUcret = urunAgirlik * katSayi * 10 * urunAdet
               Else If bazHesap = "Hacim" Then                
                   kargoUcret = (urunHacim / 10) * katSayi * urunAdet
               Else
                   kargoUcret = ((urunAgirlik * 5) + (urunHacim / 20))  * katSayi  * urunAdet
               End If

               KargoUcretiHesapla = kargoUcret
        End Function

        Public Function ToplamFiyatHesapla(ByVal netFiyat As Decimal, ByVal kargoUcreti As Integer)
               Dim toplamFiyat As Decimal
               toplamFiyat = netFiyat + kargoUcreti
               ToplamFiyatHesapla= toplamFiyat
        End Function

End Class

Önce, yukarıda içeriği görülen SepetIslemleri sınıfımızın içerisindeki fonksiyonların neler olduğuna bakalım.

  • NetFiyatHesapla : Belirtilen ürün fiyatı için adet ve kdvOran parametrelerini alarak ürün için bir ara toplam değeri oluşturan fonksiyonumuz.

  • KargoUcretiHesapla : Yukarıdaki senaryomuzda, her bir ürün için ürün ile ilgili çeşitli kriterlere bakarak ürün bazlı kargo ücreti hesapladığımız düşündük. Buradaki KargoUcretiHesapla fonksiyonumuz, ağırlık ve hacim gibi bilgilere bakarak ürün ile ilgili kargo şirketine göre bir kargo fiyatı hesapamakta kullanılıyor.

  • ToplamFiyatHesapla : Bu fonksiyonumuz ise; ürün için hesaplanan ara toplam değeri ile kargo ücretinin toplamını bularak ürünün toplam fiyatını bizim için hesaplıyor.

Artık SepetIslemleri sınıfımızı Visual Studio ortamında yazıp derleyebilir ve daha sonra oluşan SepetIslemler.dll adlı assembly dosyamızı SQL Server veritabanımız içersinde rahatlıkla kullanabiliriz. Bunu yapmak için; önce assembly'mizi referans göstererek gerekli fonkisyonları oluşturalım ve sonra vUrunSepetFiyatlar adlı view'ımızı yaratarak sepetlerindeki ürünleri kullanıcılarımıza gösterelim. Konu ile ilgili aşağıdaki kod bloğunu inceleyebilirsiniz.

CREATE ASSEMBLY SepetIslem FROM 'c:\SepetProject\bin\SepetIslemleri.dll'

CREATE FUNCTION NetFiyatHesapla(@urunFiyat FLOAT, @adet INT, @kdvOran INT)
AS
     RETURNS FLOAT
     EXTERNAL NAME
SepetIslem.SepetIslemleri.NetFiyatHesapla

CREATE FUNCTION KargoUcretiHesapla(@urunAgirlik FLOAT, @urunHacim FLOAT, @adet INT, @kargoSirketNo INT)
AS
     RETURNS FLOAT
     EXTERNAL NAME
SepetIslem.SepetIslemleri.KargoUcretiHesapla

CREATE FUNCTION ToplamFiyatHesapla(@netFiyat FLOAT, @kargoUcreti FLOAT)
AS
     RETURNS FLOAT
     EXTERNAL NAME
SepetIslem.SepetIslemleri.ToplamFiyatHesapla

CREATE VIEW vSepetUrunler
AS
     SELECT urunAd, urunFiyat, adet, dbo.NetFiyatHesapla(urunFiyat, adet, kdvOran)  AS netFiyat,
          dbo.KargoUcretiHesapla(urunAgirlik, urunHacim, adetkargoSirketNo) AS kargoUcreti,
          dbo.ToplamFiyatHesapla( dbo.NetFiyatHesapla(urunFiyat, adet, kdvOran) ,         dbo.KargoUcretiHesapla(urunAgirlik, urunHacim, adetkargoSirketNo)) AS toplamFiyat
     FROM tblSepet

vSepetUrunler içeriği ise aşağıdaki gibi olacaktır.

     urunAd              urunFiyat    adet    netFiyat     kargoUcreti     toplamFiyat
-------------------------------------------------------------------------------------------------------------------------------
   SQL Server Kitabı        20             1          23.26            2.24                25.5
   Müzik Albümü             7.5            2          17.7             1.84                19.54
   Dolma Kalem              50             1          59                1.96                60.96

Burada gösterilen hesaplama yapısını T-SQL kullanarak da hazırlamak mümkündü. Ama SQL Server 2005 ' in bize sunduğu bu yeni imkanlarla, hesaplama işleminin T-SQL ifadelerine göre çok daha kolay kullanılır bir şekilde Vİsual Basic dile ile yapılabileceğini gördük. Bu sayede artık çok daha karmaşık sorgu ve kullanıcı tanımlı fonksiyonları, .NET dillerinin bize sunduğu bütün imkanlarla, çok daha hızlı ve performanslı bir yapıyla hazırlayabilme imkanına kavuşmuş oluyoruz.

Daha önceki makalemizde assembly ifadelerinin SQL Server 2005 tarafından nasıl ele alındığını, SQL Server 2005 ile birlikte gelen CLR yapısı sayesinde .NET dilleri ile yazılmış kodların nasıl derlenip çalıştırıldığını inceledik. Bugün ise, .NET dillerinden Visual Basic.NET ile yazılmış fonksiyonların assembly yaratılarak SQL Server tarafından çağrılıp, SELECT cümlelerimiz içersinde pratikte  nasıl kullanılacağını gördük.

Bir sonraki makalede farklı bir konu ile görüşmek ümidiyle...