
Microsoft teknolojilerinin ne kadar icli disli oldugunu biliyorsunuzdur. Ornegin siz bir web uygulamasinin icinde Excel sheet, windows uygulamasinin icinde explorer nesnesini cok da ugrasmadan kullanabilirsiniz. Bu iliskiye benzer bir iliski ile C# veya VB.NET de yazdiginiz bir metodu bir MS SQL Server fonksiyonuna nasil cevirebilirsiniz sorusunu yanitlamaya calisacagim. Bu 3 alt makaleden olusan yazi dizisinin 1.si..
Microsoft SQL 2005 Server'dan itibaren CLR(Common Language Runtime) User defined functions (kullanici tanimli fonksiyonlar) tanimlamamiza izin veriyor. Bu yazimda oncelikli olarak size scalar bir deger donduren bir fonksiyonu sql server'a nasil tanitacagimizi anlatmaya calisacagim.
Oncelikle C# kodumuza bir goz atalim..
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
namespace ArticleCodes
{
public class CLRScalarValuedFunction
{
[SqlFunction(DataAccess=DataAccessKind.Read)]
public static int GetCompanyCount()
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT COUNT(*) AS companyCount FROM Companies", conn);
return (int)cmd.ExecuteScalar();
}
}
}
}
Bir scalar fonksiyon tanimlamak icin oncelikle metodumuzun static bir metod olmasi gerekiyor. Yukaridaki kod kendini anlatiyor diye dusunuyorum. Burada dikkatinizi cekmek istedigim kisim SqlConnection tanimi.. Dikkat ederseniz alisila gelmis connection string'lerden biraz farkli.
SqlConnection conn = new SqlConnection("context connection=true")
Peki neden boyle bir tanim yaptik ve bu tanim bize ne anlatiyor. Oncelikli olarak biz bu metodu SQL Server'a tanitacagiz ve bu bir veritabanina ya da master'a tanimli olacaktir. Dolayisiyla metodu kullanacak olan kisi zaten bir veritabani baglantisi yapacak ve ardindan bizim metodumuzu kullanacaktir. Biz iste bu baglantidaki yetkileri ile bu metodu cagiriyoruz. Dolayisiyla guvenli bir baglanti yapiyoruz. Eger bu metodu cagirma ya da bu veritabanina baglanma ve yahut da veri cekme yetkisi yok ise bu kontrolleri yapmamiza gerek kalmiyor. Context Connection ile ilgili detayli bilgi icin
buraya bi goz atabilirsiniz.
Bunun disinda dikkat etmemiz gereken husus metodumuzun giris parametreleri ve donus degeridir. Bunlarin SQL Server tarafindan desteklenen scalar deger tipleri olmasi gerekiyor. Bu konuda da suraya bi bakin derim.
Simdi gelelim bu yazdigimiz ve derledigimiz metodu nasil SQL Server'a tanitacagimiza..
CREATE ASSEMBLY CLRCodes FROM '<DLL'in tam yolu(full path)>'
Bu T-SQL komutunu metodumuzu tanimlamak istedigimiz veritabanimizda calistiriyoruz. Boylece tanimladigimiz dll artik SQL server tarafindan benimsenmis oluyor. Ardindan yapilacak ikinci iş, metodumuzu tanimlamak..
CREATE FUNCTION GetCompanyCount() RETURNS INT
AS EXTERNAL NAME <assembly adi>.[<namespace>.<class adi>].<method adi>
Yani verdigim ornege gore
CREATE FUNCTION GetCompanyCount() RETURNS INT
AS EXTERNAL NAME CLRCodes.[ArticleCodes.CLRScalarValuedFunction].GetCompanyCount
Bu komutlari calistirdiktan sonra goreceksiniz ki assembly altinda CLRCodes adinda bir dll ve Scalar-Valued functions altinda GetCompanyCount adinda bir metod olusturulmustur. Metodu test etmek icin
SELECT [dbo].[GetCompanyCount]()
querisini calistirabilirsiniz.
Ancak kodu test ettiginizde muhtemelen "CLR not enabled" benzeri bir hata alacaksiniz. Buradan da sunu cikariyoruz; SQL Server default olarak sizin .NET kodunuzu desteklemiyor. Bunu desteklemek icin ise asagidaki kodu calistirabilirsiniz.
EXEC sp_configure 'clr enabled' , '1'
go
reconfigure;
go
Umarim isinize yarar...