SQL SERVER 2005'te CLR (Common Language Runtime) Desteği ve T-SQL Entegrasyonu

murat335

New member
SQL SERVER 2005'TE CLR DESTEĞİ

SQL Server 2005’in en dikkat çekici özelliklerinden biri CLR ile birlikte çalışabilmesi. Bu sayede kendinizi en rahat hissettiğiniz .net dili ile veritabanı nesneleri oluşturma, oluşturduğumuz nesneleri yapılandırma ve hatta veritabanı yönetim sistemimizin yönetimini sağlama imkanına kavuşuyoruz. Artık geliştirici T-SQL kullanmadan, istediği dilde (Vb.Net,C#...) veritabanı üzerinde trigger 'lar , stored procedure'ler ya da fonksiyonlar yazabilecek, veritabanlarını oluşturup silebilecek. Bu aynı zamanda herhangi bir veritabanı nesnesi yazarken binlerce ( abartmıyorum :) ) bileşeni sunan .Net Class Library'den faydalanabilme anlamına da geliyor.
Fikir vermesi açısından, aşağıda girilen ID ‘ye göre isim döndüren bir fonksiyon görüyoruz. Bu fonksiyon .net dillerinden VB.NET ile kodlanmasına rağmen SQL Server’ın üzerinde saklanıyor ve çalıştırılıyor.
PHP:
Imports System.Data.Sqlserver 
    Imports System.Data.Sql 
      Public Class Kitaplik 
       <SqlFunction(DataAccess=DataAccessKind.Read)> 
       Public Shared Function YazarDondur() as String 
       Dim cmdSql As Sqlcommand = Sqlcontext.GetCommand() 
       cmdSql.CommandText= _
           "Select Yazar from Kitap where KitapId = @prmKitapId" 
       Dim prmKitapId As SqlParameter = _
                      cmdSql.Parameters.Add("@prmKitapId",SqlDBType.String) 
       prmKitapId.Direction = ParameterDirection.Input 
       prmKitapId.Value="K001" 
       Return Ctype(cmdSql.ExecuteScalar(),String) 
     End Function 
    End Class
Bundan önce kullandığımız ADO.NET kodlarına ne kadar da benziyor değil mi? Gördüğünüz gibi SQL Server 2005 için yazılan bu fonksiyonun kodlarını yorumlamak .net ile haşır neşir olanlar için hiç de zor değil. SQL Server’ ı programlamak için yeni bir dil öğrenmek yerine bildiğimiz dili SQL Server’ın desteklemesi elde edinilen bilginin katlanarak artmasına olanak sağlıyor.
Bu noktada T-SQL’in akibetinin ne olacağı sorusu akıllara geliyor. Sanılanın aksine T-SQL rafa kaldırılmış durumda değil! SQL Server 2005’te T-SQL işlevselliğini, geliştirilmiş ve yeni ekleniş birçok özellikle koruyor. Try/Catch yapısının eklenmesi ya da CLR ile bütünleşmesi için eklenen deyimler bu gelişime örnek verilebilir. Aşağıda Try/Catch yapısına ait bir örnek bulunuyor
PHP:
BEGIN TRY
  BEGIN TRAN
    INSERT INTO tblMusteri (Id,MusteriAdi,Bakiye,Tarih)
    VALUES (@Id, @MusteriAdi, @Bakiye, GETDATE())
  COMMIT TRAN
END TRY

BEGIN CATCH TRAN_ABORT
  ROLLBACK 
  INSERT INTO tblHatalar VALUES ('Hata Oluştu'))
END CATCH
Peki bazı işlemleri hem T-SQL ile hem .Net programlama dillerinden biriyle yapabileceksek T-SQL ve .Net kodu arasında tercihi neye göre belirleyeceğiz? Genel olarak T-SQL'in, veriye erişim ve veri üzerinde toplu işlemler için kullanılması daha uygunken, .net kodlarının veri üzerinde daha karmaşık (ileri düzey matematik ya da katar işlemleri gibi) işlevleri yerine getirirken kullanılması uygun diyebiliriz..
CLR ile bütünleşme beraberinde arttılmış güvenliği (code access security v.b.), bellek yönetimini (garbage collection v.b.) ve çok kanallı (multi threading) programlanabilmeyi de getiriyor. Burada sadece adını andığımız bu başlıkların hepsi başlı başına birer makale konusu. Genel olarak değerlendirdiğimizde ise SQL Server 2005-CLR işbirliği işlevsellik açısından ani bir patlama gibi.
SAKLI YORDAMLARIMIZI .NET İLE KODLAYALIM

SQL Server 2005 getirmeyi vadettiği yeni özellikleri ile veritabanı programlama konusunda bambaşka bir bakış açısı sunuyor. SQL Server 2005’in getirdiği bir çok yeni özelliğin arkasında CLR ile entegrasyonu yatıyor.
.net framework'un çekirdeği olan CLR SQL Server 2005 ile birleştirilmiş durumda. Yani artık veritabanı sunucumuz .net'çe konuşabiliyor. Örneğin C# ile yazdığınız kodları SQL Server 2005 kendi üzerinde çalıştırıbiliyor ve bu kodları VB.NET ile yazdığımız kodlarla hiç bir sıkıntı yaşamadan entegre edebiliyor..
Şu ana kadar yapılagelmiş yöntem iş katmanını bildiğimiz yüksek seviyeli programlama dilleri ile oluşturmak, veri katmanını ise veritabanı sunucumuzun bize sağladığı T-SQL olanaklarıyla oluşturmaktı. Genel problemler için gayet makul olan bu yöntem veri katmanında, veritabanı dışında bazı işler gerçekleştirmek istediğimizde yetersiz kalmaktaydı. Örneğin SQL Server üzerinde oluşan bir hatanın Event Log (Seyir kaydı) olarak yazılmasını T-SQL ile sağlamak pek kolay olmamaktaydı. Genişletilmiş saklı yordamlar (extended stored procedures) ise bunu c++ dili ile mümkün kılmakta, fakat uyulması gereken arayüzler ve kodlama zorluğu bu sorunu pratik olarak çözmemekteydi.
SQL Server 2005 bu tarz işlemleri rahatlıkla yapabilmemize olanak sağlıyor. Peki nasıl mı ? Bu soruyu bir örnek ile cevaplandıralım.

SQL Server 2005 altında .net kodlarını çalıştırabilmek için yapılması gerekenler adım adım şöyledir;

.net kodlarıyla bir sınıf kütüphanesi oluşturun ve derleyin. (SQL Server 2005 .exe uzantılı dosyaları çalıştırmaz. .dll uzantılı derlenmiş kütüphaneleri çalıştırır.) Burada dikkat edilmesi gereken sınıfın public yordamların ise static (vb.net'te shared) olması gerekliliğidir.
Oluşturduğunuz assembly'i SQL Server 2005’e kaydedin
Assembly'i sarmalayacak bir veritabanı nesnesi (stored procedure, user defined function, trigger ..) oluşturun.
Oluşturduğunuz nesnesi istediğiniz yerden kullanın.
Şimdi bu adımları sırasıyla uygulayalım. Önce csYukonOrnek isimli yeni bir class library projesi oluşturun ve otomatik olarak oluşturulan şablon sınıf dosyasının ismini csYukonLibrary.cs olarak değiştirip içine aşağıdaki kodları yazın;


PHP:
using System;
public class csClassYukon
{
      public static int csFunctionCLRToplama(int a, int b)
      {
         return a + b;
      }
}
Bu fonksiyondaki işlemleri T-SQL kullanarak basit bir saklı yordam ile yapabilirdik. Bu örnek için CLR kullanmak pek mantıklı olmasa da yoğun ve karmaşık işlemlerin CLR ile yapılması çoğu iş yükünü ortadan kaldıracaktır.
Derlediğimizde oluşan dll 'i aşağıdaki, SQL Server 2005 Management Studio içine yazacağımız kod ile sunucumuza kaydedelim;

PHP:
CREATE ASSEMBLY asmYukon FROM 'C:\csYukonLibrary.dll' 
-- Oluşturduğunuz dll'in yolunu yazmaya dikkat edin !
Bu sayede assembly artık sunucumuza kaydedilmiş durumdadır. Dll dosyasını silsek bile SQL Server 2005 içinden bu kütüphanenin fonksiyonlarını kullanmaya devam edebiliriz.
Şimdi de oluşturacağımız saklı yordam ile bu assembly'i sarmalayalım;
PHP:
CREATE PROCEDURE [dbo].[spCLRToplama]
@IlkDeger [int],
@IkinciDeger [int]
AS
EXTERNAL NAME [asmYukon].[csClassYukon].[csFunctionCLRToplama]
Bu bölümde dikkat ederseniz T-SQL'e yeni eklenen EXTERNAL NAME deyimi ile oluşturduğumuz assembly'nin mantıksak olarak tam yolunu belirtiyoruz. Dikkat edilmesi gereken nokta .net ile oluşturduğumuz fonksiyon ile stored procedure aynı tip parametreler almak zorundadır. (Bu örnekte her ikisi de integer tipinde iki parametre almaktadır.) Artık bu stored procedure sayesinde .net ile oluşturduğumuz bir fonksiyonu istediğimiz yerde kullanabiliriz.
Buraya kadar yaptığımız işlemler sonucu bir assembly'i (asmYukon) Yukon üzerinde çalışmak üzere kayıt ettik ve onu kullanacak bir stored procedure (spCLRToplama) oluşturduk. Management Studio'dan kontrol ettiğimizde bu nesneleri aşağıdaki gibi görebiliriz ;


1.Resim: Oluşturduğumuz nesneler
PHP:
Son olarak oluştur oluşturduğumuz stored procedure üzerinden .net kodlarımızın çalıştığını kontrol edelim ;

DECLARE @Sonuc INT 
EXECUTE @Sonuc = spCLRToplama 3 , 5
SELECT @Sonuc AS CLRToplama

SONUÇ

Bu şekilde CLR ve T-SQL'i bir arada kullanmış olduk.
 

HTML

Üst