CLR Stored Procedure (Socket)

// 18 Mayıs 2009 // C#, Delphi, Veritabanı

CLR DESTEKLİ STORED PROCEDURE İLE SOCKET HABERLEŞMESİ

SQL Server 2005 ve .Net 2.0 ile birlikte gelen yeniliklerden biriside CLR destekli stored procedurelerdir. Bu özellik; mevcut database sistemleri adına tam anlamıyla bir devrim niteliğindedir. Peki nedir bu devrim biraz açıklayalım;

Bu güne kadar sql server ile yapılabilecekler sadece sql dilinin özellikleri ve sql serverın becerileriyle sınırlı iken, Microsoft amcamız .Net 2.0 teknolojisini kullanarak, Visual Studio 2005 üzerinden (ki biz burada C# kullanacağız), herhangi bir programı yazarken kullandığımız kod yapımızı stored procedure içine gömebilmeyi ve stored procedureleri adeta bir uygulama haline döndürebilmeyi bize sunuyor. Nasıl kafanız biraz karıştımı..!! Uzun bir cümle oldu biliyorum ama sözü daha fazla uzatmadan, başlıkta da belirttiğim gibi bir stored procedure aracılığı ile socket bağlantısını kısa bir örnekleme ile anlatıp olayı detaylandırmaya çalışacağım.

İlk olarak socketi dinleyen ufak bir yazılım yapalım ve forumumuz bir delphi forumu olduğundan bu kısmı onunla yazalım.

Not : Kullanacağımız Port 1453  olsun…

Malzemelerimiz:

1- TMemo (Memo1)
2- TServerSocket(ServerSocket1)

Hazırlanışı:

ServerSocket1 in Port Özelliğine 1453 yazalım ve Active Özelliği true olsun, OnClientRead Event’na Memo1.Lines.Add(Socket.ReceiveText); yazalım.

İşte bu kadar.. programımızı derleyelim ve çalıştıralım.. Bu şimdilik bir kenarda dursun ve biz SQL Server 2005 i açalım.

Öncelikle SQL Server 2005 te kullanacağımız Database imize gidelim ve bir iki balans ayarı yapalım. Object Explorer üzerinde ilgili Database imize gelelim ve üzerinde sağ klik yapıp Özelliklerine (Properties) dalalım. Options kısmında Compatibility Levelimizin SQL Server 2005 (90) olduğunu görelim ve Ok deyip bu ekranı kapatalım. Daha sonra Başlat-Programlar-Microsoft SQL Server 2005-Configuration Tools tan SQL Server 2005 Surface Area Configuration ‘ ı açalım ve Surface Area Configuration For Features’ı tıklayalım. SQL Server ile ilgili genel bazı ayarların yapıldığı ekranımızdayız şimdi. Buradan Database Engine ve ordan CLR Integration Özelliğimizin Enabled ayarını işaretleyelim. Bkz. Şekil 1.1..

clr_enabled
 
Şekil 1.1

Bu Ekranımızıda Apply + Ok deyip burayı tamamen kapatalım. SQL Server 2005 te ilgili Databasemize gelip üzerinde sağ klik ile New Query diyelim ve gelen ekrana,

ALTER DATABASE DBADI SET TRUSTWORTHY ON

yazalım ve F5 ‘ e basıp bunu çalıştıralım. Bu işlem ile birlikte SQL Server ayarlarımız tamamlanmış oldu.

 Şimdi birazda C# kodu ile Stored Procedure yazarak havamızı atalım :)

File-New-Project-Database tıklayalım ve Name kısmına MessageSender yazıp Ok diyelim . İlk olarak Solution Explorer dan projemize tıklayıp Properties penceresinden Permision Leveli External olarak ayarlayalım. Projenin Üzerinde sağ tıklayıp add-Stored Procedure diyelim ve aşağıdaki kodu yazalım.


using System; 
using System.Data; 
using System.Data.Sql; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 
using System.Net; 
using System.Net.Sockets; 
using System.Security.Permissions; 
using System.Security; 
public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void MyProcess(String ClientIP , String SendMessage) 
    { 
        string IPAddr; 
 
        if (ClientIP == null) ClientIP = ""; 
        if ((ClientIP.ToString() == "")) 
            IPAddr = "127.0.0.1"; 
        else IPAddr = ClientIP; 
        TcpClient tcp = new TcpClient(); 
        tcp.Connect(IPAddr, 1453); 
 
        NetworkStream ns = tcp.GetStream(); 
        byte[] bArray = System.Text.Encoding.ASCII.GetBytes(SendMessage); 
        ns.Write(bArray, 0, bArray.Length); 
        ns.Close(); 
        tcp.Close(); 
    } 
}; 

Şimdi bu kodu biraz anlatalım sonra arkamızdan bir yerden kopyalamış yapıştırmış demesinler… :P
[Microsoft.SqlServer.Server.SqlProcedure] bu tag ile beraber C# bundan sonra yazılacak metodun bir stored procedure olduğunu anlıyor. Procedure umuze iki parametre geçiyoruz ClientIP = Mesaj gönderilecek IP numarası ve SendMessage = Gönderilecek mesaj. Eğer Ip geçilmez ise yönlendirmeyi localhost(127.0.0.1) yani Db nin bulunduğu makinaya yapıyoruz. TCPClient sınıfının birden fazla yapılandırıcısı mevcut ancak biz varsayılan yapılandırıcıyı kullanıyoruz. Sizler isterseniz IPEndPoint alan AddressFamily alan yapılandırıcıları da kullanabilirsiniz. TCPClient sınıfımıza bir instance oluşturduktan sonra bu sınıfın Connect metodu ile belirtilen IP adresine bağlanıyoruz. Bundan sonrası kolay. Zaten bu socket bağlanma kodunun benzerine yerleşik Help’den de ulaşabilirsiniz. Benim sizlere belirtmekte yarar gördüğüm bazı hususlar olacak. Bu projeyi yapmak açıkçası pek de kolay olmadı. Beni biraz uğraştırdı. İlk başlarda SQL Server 2005 desteği olmayan bir database’e atmaya çalıştığım için Compatibility ayarları ile ilgili garip hatalar aldım. Bunun üzerine Database’in Compatibility Level’inin SQL Server 2005(90) olması gerektiğini öğrendim ve o değişikliği yaptım. Ancak sorunlar hala devam ediyordu. CLR desteğinin açılması gerektiğini biliyordum onu da yapmıştım ama bu seferde Permissionlarla ilgili bir çok hata aldım. TCPClient nesnesini Create etme türüme göre hatalar sürekli değişiklik gösteriyordu. Bir DNSPermissions hatası alıyordum , bir SocketPermissions.. Artık iyice kızmaya başlamıştım ki internetteki araştırmalarım bu tarz hataların oluşmasının nedeninin SQL Server’ın socket bağlantısı açma hakkının olmadığını , bu hakkı elde edebilmek için database’in TRUSTWORTHY özelliğinin açık olması gerektiğini gördüm ve yukarıda da belirttiğim bu özelliği aktif eden koda ulaştım. Ve Nihayetinde bu makaleyi hazırlayabilecek kadar bilgiyi kazandıktan sonra oturdum ve yazdım. Neyse kaldığımız yerden devam edelim.
Projemizi kaydediyoruz ve Build menüsünden Build ve ardından Deploy yapıyoruz. Bu işlem sonrası SQL Serverda Databaseimizin altında Programibility kısmında Stored Procedure bölümünde MessageSender procedure umüzün oluşmuş olması gerekiyor.

Şayet Delphide yazdığımız uygulama ekranda açık ise SQL Serverda aşağıdaki kodu yazarak testimizi yapabiliriz.

EXEC MessageSender null, ‘Bu kadar İşte’

Biraz daha uğraşmak isterseniz, Delphiye ProgressBar koyun ve Sql deki bir cursor içinden progresi hareket ettirin. Bu sayede kullanıcılara görsel bir bekleme ekranı sunabilirsiniz ne dersiniz.

Hepinize kolay gelsin :)

“CLR Stored Procedure (Socket)” için 6 Yorum

  1. Tuğrul HELVACI diyor ki:

    Eline sağlık olcay, gerçi seneler önce yazdığın bu makaleyi birileri araklamış ama olsun :)

  2. Özkan Danacı diyor ki:

    Evet bunu daha önce biyerlerden okumuştum.
    Demek makalenin asıl sahibi olcay mış.
    Eline sağlık güzel olmuş..

  3. Tuğrul HELVACI diyor ki:

    Okuduğun yer büyük ihtimalle ya delphi.zaxaz dır yada tr.delphipeak ;)

  4. Olcay DAĞLI diyor ki:

    Teşekkür ederim arkadaşlar, birileri bir yerde ismimizi kullanmadan yayınlamışsada sorun değil, Ne demişler iyilik yap denize at, balık bilmese halık bilir ;)

  5. Mustafa Binici diyor ki:

    Hocam şu Stored Procedure’yi Bana Bir Gönderebilirseniz ALLAH Razı Olsun Derim..
    Şimdiden Teşekkür Ederim. ALLAH Razı Olsun

  6. Tuğrul HELVACI diyor ki:

    Allah sizden de razı olsun ama inanın bunun gönderilecek bir tarafı yok. Makaleyi dikkatlice okuduğunuzda yeterli tüm bilgilerin olduğunu görmüş olmalıydınız. Adım adım uygulamaya çalışın bana kalırsa.

Yorum Yazın