MSSQL ile .Net Kütüphanelerini Kullanmak

  • 22.31.2016
  • tayyipyetis
  • .Net Framework

sql server managementHerkese yeniden merhaba, bu aralar nedense ardarda mssql ile ilgili makaleler yazıyorum, özel bir sebebi yok ama heralde veritabanları ile ilgili öğrendiklerim ilgimi daha çok çekiyor bu sebepten başkalarının da ilgisini çekebileceğini düşünüyorum. bu makalemde gerçekten ilginç ve bir o kadar da faydalı bir bilgiden bahsedeceğim diğer bir çok kaynakta mssql assembly olarak geçen bu konuyu ben mssql ile .net fonksiyonlarını kullanma başlığı altında işledim çünkü bu bana göre daha açıklayıcı bir isim.

Peki neden böyle bir şeye ihtiyaç duyuyoruz ? mssql zaten kendi içinde functions, stored prosedure gibi yapılarla özel işlemler yapmamıza olanak tanıyor ama elbette bu .net kütüphaneleri kadar geniş değil bu sebepten bir takım işlemler için assembly yapısını kullanmamız gerekiyor. bu makalede üzerinden gideceğimiz örnekte ise mssql 2005/2008 versiyonlarında olmayıp 2012 versiyonundan sonra gelen Regular Expression özelliğini sql server 2008’de kullanmak için bir .Net kütüphanesi yani dll dosyası oluşturacağız sonra bu dosyayı sql server’a assemly olarak ekleyeceğiz ve içerisindeki fonksiyonları tanıtacağız ardından standart mssql fonksiyonları gibi kendi fonksiyonlarımızı kullanmaya başlayacağız İşin asıl mantığı ise şöyle; Bilindiği üzere Microsoft .Net Framework çatısı altında tüm bünyesindeki dillerin altyapısını birleştirdi ve hem kendisi hem de biz geliştiriciler için büyük kolaylık sağladı, yani C#, VB.Net, F# ile yazılmış bir programlar temelinde MSIL Assembly (Microsoft Intermediate Language) denilen ortak bir dile dönüştürülüyor bu dil de bir .net framework katmanı olan CLR (Common Language Runtime) ile makina koduna dönüştürülüp çalıştırılıyor buradaki püf nokta yani .net kütüphanelerini mssql tarafında kullanmamızı sağlayan olay MSIL sayesinde iki farklı teknoloji arasında haberleşme sağlanması ile meydana geliyor.

Şimdi artık örneğimize başlayabiliriz. yukarıda bahsettiğim gibi RegExMatch() ve RegExReplace() isminde iki regular expression fonksiyonu oluşturacağız. ilk fonksiyonumuz iki parametre alacak birincisi girilen string ifade ikincisi regex deseni ve eğer uyuşma varsa true yoksa false döndürecek tabii ki bunu SqlBoolean türünden yapacak. ikinci fonksiyonumuz ise aynı şekilde regex karşılaştırması yapıp ücüncü parametrede verilen değer ile eşleşenleri değiştirecek. bunun için öncelikle aşağıdaki gibi bir kütüphane oluşturalım

using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
using System.Data.SqlTypes;

public class RegularExpressions
{
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic=true, IsPrecise=true)]
        public static SqlBoolean RegExMatch(SqlString input, SqlString pattern)
        {
            if (input.IsNull || pattern.IsNull)
                return SqlBoolean.False;
            
            return Regex.IsMatch(input.Value, pattern.Value, RegexOptions.IgnoreCase);
        }

        [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
        public static SqlString RegExReplace(SqlString input, SqlString pattern, SqlString replacement)
        {
            if (input.IsNull || pattern.IsNull || replacement.IsNull)
                return SqlString.Null;

            return new SqlString(Regex.Replace(input.Value, pattern.Value, replacement.Value, RegexOptions.IgnoreCase));
        }
}

Bu kütüphaneyi derleyip dll dosyasını oluşturduktan sonra aşağıdaki gibi sql server üzerinde CLR etkinleştirmeniz gerekir

sp_configure 'clr enabled', 1
RECONFIGURE WITH OVERRIDE

Ve kütüphanemizi ekleyip .net fonksiyonlarımızı aşağıdaki şekilde tanımlayalım

CREATE ASSEMBLY TextFunctions FROM 'C:\kutuphaneyolu\TextFunctions.dll'
GO
CREATE Function RegExMatch(@Input NVARCHAR(512),@Pattern NVARCHAR(127))
RETURNS BIT
EXTERNAL NAME TextFunctions.RegularExpressions.RegExMatch
GO
CREATE Function RegExReplace(@Input NVARCHAR(512),@Pattern NVARCHAR(127), @Replacement NVARCHAR(512))
RETURNS NVARCHAR(512)
EXTERNAL NAME TextFunctions.RegularExpressions.RegExReplace
GO

Not: Create Assembly komutuyla ilgili bir hata alırsanız “Programmability/Assemblies” klasörüne sağ tıklayıp New Assembly komutuyla dll dosyasını manuel olarak ekleyebilirsiniz. bu şekilde sql management studio sizin için otomatik sql komutunu oluşturacaktır.

Bu işlemleri başarı ile yaptıktan sonra artık fonksiyonlarınızı kullanmaya başlayabilirsiniz. bu örnek için aşağıdaki sorgulamaları yapabilirsiniz.

SELECT dbo.RegExMatch('<a> bu bir html elementi </a>','<(.|\n)+?>')

SELECT dbo.RegExReplace('<a> bu bir html elementi </a>', '<(.|\n)+?>', '')

Şimdi başka bir örnek yapalım. Bu örnekte geriye tablo döndürebilen bir fonksiyon yazalım

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Collections;

public class autologin
{
    [SqlFunction(DataAccess = DataAccessKind.Read, FillRowMethodName = "FindInvalidEmails_FillRow", TableDefinition = "CustomerId int, EmailAddress nvarchar(4000)")]
    public static IEnumerable GetEmail()
    {
        ArrayList resultCollection = new ArrayList();
        resultCollection.Add(new EmailResult { CustomerId = 1, EmailAdress = "test@test.com" });
        resultCollection.Add(new EmailResult { CustomerId = 2, EmailAdress = "test2@test2.com" });
        resultCollection.Add(new EmailResult { CustomerId = 3, EmailAdress = "test3@test3.com" });
        return resultCollection;
    }
    public static void FindInvalidEmails_FillRow(object emailResultObj, out SqlInt32 customerId, out SqlString emailAdress)
    {
        EmailResult emailResult = (EmailResult)emailResultObj;
        customerId = emailResult.CustomerId;
        emailAdress = emailResult.EmailAdress;
    }
    private class EmailResult
    {
        public SqlInt32 CustomerId;
        public SqlString EmailAdress;
    }
}

Bu kodu derleyip dll dosyasını oluşturduktan sonra assembly olarak ekleyelim ve aşağıdaki sql ile veritabanı kısmında fonksiyonumuzu tanımlayalım

CREATE Function GetEmail()
RETURNS TABLE (
   CustomerId int,
   EmailAddress nvarchar(4000)
)
EXTERNAL NAME webapplication.class.GetEmail

Örnek kullanım aşağıdaki gibidir

SELECT * FROM dbo.GetEmail()

Bu şekilde .net fonksiyonlarınızı mssql üzerinde çalıştırabilirsiniz. Eklediğiniz assembly’leri Sql Management Studio üzerinde “Programmability/Assemblies” klasörü altından görebilir, silebilirsiniz. Umarım faydalı olmuştur.

Kaynak : http://anastasiosyal.com/POST/200...

Mustafa Tayyip YETİŞ
Yazılım Geliştirme Uzmanı

Yorum Yap