CLR tümleştirmesi ile çalışmaya başlama
Bu makalede, .NET Framework ortak dil çalışma zamanı (CLR) ile SQL Server tümleştirmesini kullanarak veritabanı nesnelerini derlemek için gereken ad alanları ve kitaplıklara genel bir bakış sağlanmaktadır. Makalede ayrıca C# ve Visual Basic .NET'te yazılmış küçük bir CLR saklı yordamını yazma, derleme ve çalıştırma işlemleri de gösterilir.
Gerekli ad alanları
Temel CLR veritabanı nesneleri geliştirmek için gereken bileşenler SQL Server ile yüklenir. CLR tümleştirme işlevselliği, .NET Framework'ün bir parçası olan System.Data.dll
adlı bir derlemede kullanıma sunulur. Bu derleme Genel Derleme Önbelleği'nde (GAC) ve .NET Framework dizininde bulunabilir. Genellikle, bu derlemeye yapılan bir başvuru hem komut satırı araçları hem de Visual Studio tarafından otomatik olarak eklenir, bu nedenle el ile eklemeniz gerekmez.
System.Data.dll
derlemesi, CLR veritabanı nesnelerini derlemek için gereken aşağıdaki ad alanlarını içerir:
System.Data
System.Data.Sql
Microsoft.SqlServer.Server
System.Data.SqlTypes
Bahşiş
Linux'ta CLR veritabanı nesnelerinin yüklenmesi desteklenir, ancak .NET Framework ile derlenmeleri gerekir (SQL Server CLR tümleştirmesi .NET Core veya .NET 5 ve sonraki sürümleri desteklemez). Ayrıca, EXTERNAL_ACCESS
veya UNSAFE
izin kümesine sahip CLR derlemeleri Linux'ta desteklenmez.
"Merhaba Dünya" saklı yordamı yazın
Aşağıdaki C# veya Visual Basic .NET kodunu kopyalayıp bir metin düzenleyicisine yapıştırın ve helloworld.cs
veya helloworld.vb
adlı bir dosyaya kaydedin.
using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
public class HelloWorldProc
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void HelloWorld(out string text)
{
SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);
text = "Hello world!";
}
}
Bu program, ortak bir sınıfta tek bir statik yöntem içerir. Bu yöntem, kısa bir metin iletisi çıktısı almak üzere yönetilen veritabanı nesneleri oluşturmak için SqlContext out
parametresinin değeri olarak "Hello world!" dizesini atar. Bu yöntem SQL Server'da saklı yordam olarak bildirilebilir ve ardından Transact-SQL saklı yordamıyla aynı şekilde çalıştırılabilir.
Bu programı kitaplık olarak derleyin, SQL Server'a yükleyin ve saklı yordam olarak çalıştırın.
"Hello World" saklı yordamını derleme
SQL Server varsayılan olarak .NET Framework yeniden dağıtım dosyalarını yükler. Bu dosyalar csc.exe
ve vbc.exe
, C# ve Visual Basic .NET programları için komut satırı derleyicilerini içerir. Örneğimizi derlemek için yol değişkeninizi csc.exe
veya vbc.exe
içeren dizine işaret eden şekilde değiştirmeniz gerekir. Aşağıdaki yol, .NET Framework'ün varsayılan yükleme yoludur.
C:\Windows\Microsoft.NET\Framework\(version)
Sürüm, yüklü .NET Framework'ün sürüm numarasını içerir. Mesela:
C:\Windows\Microsoft.NET\Framework\v4.8.0
.NET Framework dizinini yolunuza ekledikten sonra, aşağıdaki komutla örnek depolanmış yordamı bir derlemeye dönüştürebilirsiniz.
/target
seçeneği bunu bir derlemede derlemenize olanak tanır.
C# kaynak dosyaları için:
csc /target:library helloworld.cs
Visual Basic .NET kaynak dosyaları için:
vbc /target:library helloworld.vb
Bu komutlar, kitaplık DLL'si oluşturmayı belirtmek için /target
seçeneğini kullanarak C# veya Visual Basic .NET derleyicisini başlatır.
SQL Server'da "Hello World" saklı yordamını yükleme ve çalıştırma
Örnek yordam başarıyla derlendiğinde SQL Server'da test edebilirsiniz. Bunu yapmak için SQL Server Management Studio'yu açın ve uygun bir test veritabanına (örneğin, AdventureWorks2022
örnek veritabanı) bağlanarak yeni bir sorgu oluşturun.
Ortak dil çalışma zamanı (CLR) kodu yürütme özelliği SQL Server'da varsayılan olarak OFF
olarak ayarlanır. CLR kodu, sp_configure
sistem saklı yordamı kullanılarak etkinleştirilebilir. Daha fazla bilgi için bkz. CLR tümleştirmesini etkinleştirme
Saklı yordama erişebilmek için derlemeyi oluşturmamız gerekir. Bu örnekte, C:\
dizininde helloworld.dll
derlemesini oluşturduğunuz varsayılır. Sorgunuza aşağıdaki Transact-SQL deyimini ekleyin.
CREATE ASSEMBLY helloworld from 'C:\helloworld.dll' WITH PERMISSION_SET = SAFE
Derleme oluşturulduktan sonra artık CREATE PROCEDURE
deyimini kullanarak HelloWorld yöntemimize erişebiliriz. Saklı prosedürümüzü hello
olarak adlandırıyoruz:
CREATE PROCEDURE hello
(@i NCHAR (25) OUTPUT)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;
Not
Önceki örnekte, HelloWorldProc
sınıfı bir ad alanı içindeyse (MyNS
olarak adlandırılır), create yordam deyimindeki son satır EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;
olacaktır.
Yordam oluşturulduktan sonra, Transact-SQL'de yazılmış normal bir saklı yordam gibi çalıştırılabilir. Aşağıdaki komutu yürütür:
DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;
İşte beklenen çıktı.
Hello world!
Hello world!
"Hello World" saklı yordam örneğini kaldırma
Örnek saklı yordamı çalıştırmayı bitirdiğinizde, yordamı ve derlemeyi test veritabanınızdan kaldırabilirsiniz.
İlk olarak, drop procedure komutunu kullanarak yordamı kaldırın.
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'hello')
DROP PROCEDURE hello;
Prosedür sonlandırıldıktan sonra, örnek kodunuzu içeren derlemeyi kaldırabilirsiniz.
IF EXISTS (SELECT name
FROM sys.assemblies
WHERE name = 'helloworld')
DROP ASSEMBLY helloworld;
İlgili içerik
- CLR saklı yordamlarını
- SQL Server'da ADO.NET için işlem içi özel uzantılar
- CLR veritabanı nesne hatalarını ayıklama
- CLR tümleştirme güvenliği