Erste Schritte mit der CLR-Integration
Dieses Thema enthält eine Übersicht über die Namespaces und Bibliotheken, die benötigt werden, um Datenbankobjekte mithilfe der Integration von MicrosoftSQL Server in die .NET Framework-CLR (Common Language Runtime) zu kompilieren. In diesem Thema wird außerdem erläutert, wie eine einfache gespeicherte CLR-Prozedur in Microsoft Visual C# geschrieben, kompiliert und ausgeführt wird.
Erforderliche Namespaces
Ab SQL Server 2005 werden die Komponenten, die für die Entwicklung einfacher CLR-Datenbankobjekte erforderlich sind, mit SQL Server installiert. Die CLR-Integrationsfunktionalität wird in einer Assembly mit dem Namen system.data.dll verfügbar gemacht, die Teil von .NET Framework ist. Diese Assembly befindet sich im globalen Assemblycache (GAC) sowie im .NET Framework-Verzeichnis. Ein Verweis auf diese Assembly wird in der Regel sowohl von Befehlszeilentools als auch von Microsoft Visual Studio automatisch hinzugefügt und muss daher nicht manuell hinzugefügt werden.
Die system.data.dll-Assembly enthält die folgenden Namespaces, die zum Kompilieren von CLR-Datenbankobjekten erforderlich sind:
System.Data
System.Data.Sql
Microsoft.SqlServer.Server
System.Data.SqlTypes
Schreiben der einfachen gespeicherten Prozedur "Hello World"
Kopieren Sie den folgenden Visual C#- oder Microsoft Visual Basic-Code, fügen Sie ihn in einen Texteditor ein, und speichern Sie ihn in einer Datei mit dem Namen "helloworld.cs" oder "helloworld.vb".
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!";
}
}
Imports System
Imports System.Data
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.Runtime.InteropServices
Public Class HelloWorldProc
<Microsoft.SqlServer.Server.SqlProcedure> _
Public Shared Sub HelloWorld(<Out()> ByRef text as String)
SqlContext.Pipe.Send("Hello world!" & Environment.NewLine)
text = "Hello world!"
End Sub
End Class
Dieses einfache Programm enthält eine einzelne statische Methode in einer öffentlichen Klasse. Diese Methode enthält die beiden neuen Klassen SqlContext und SqlPipe zum Erstellen von verwalteten Datenbankobjekten für die Ausgabe einer einfachen Textnachricht. Zudem weist die Methode die Zeichenfolge "Hello world!" als Wert eines Ausgabeparameters zu. Diese Methode kann als gespeicherte Prozedur in SQL Server deklariert und anschließend auf dieselbe Weise wie eine gespeicherte Transact-SQL-Prozedur ausgeführt werden.
Dieses Programm wird im Folgenden als Bibliothek kompiliert, in SQL Server geladen und als gespeicherte Prozedur ausgeführt.
Kompilieren der gespeicherten Prozedur "Hello World"
SQL Server installiert die Redistributionsdateien von Microsoft .NET Framework standardmäßig. Zu diesen Dateien zählen die Dateien csc.exe und vbc.exe, die Befehlszeilencompiler für Visual C# sowie Visual Basic-Programme. Zum Kompilieren des Beispiels müssen Sie die Pfadvariable so ändern, dass sie auf das Verzeichnis mit der Datei csc.exe oder mit der Datei vbc.exe zeigt. Der Standardinstallationspfad von .NET Framework lautet wie folgt:
C:\Windows\Microsoft.NET\Framework\(version)
Diese Version enthält die Versionsnummer der installierten Redistributionsdatei von .NET Framework. Beispiel:
C:\Windows\Microsoft.NET\Framework\v2.0.31113
Nach dem Hinzufügen des .NET Framework-Verzeichnises zum Pfad können Sie die gespeicherte Prozedur in diesem Beispiel mit dem folgenden Befehl in eine Assembly kompilieren. Mit der /target-Option können Sie sie in eine Assembly kompilieren.
Für Visual C#-Quelldateien gilt:
csc /target:library helloworld.cs
Für Visual Basic-Quelldateien gilt:
vbc /target:library helloworld.vb
Mit diesen Befehlen wird der Visual C# - bzw. Visual Basic-Compiler unter Angabe der /target-Option aufgerufen, die festlegt, dass eine Bibliotheks-DLL erstellt werden soll.
Laden und Ausführen der gespeicherten Prozedur "Hello World" in SQL Server
Sobald die Beispielprozedur erfolgreich kompiliert wurde, können Sie sie in SQL Server testen. Öffnen Sie hierzu SQL Server Management Studio, und erstellen Sie eine neue Abfrage zum Verbinden einer geeigneten Testdatenbank (z. B. der Beispieldatenbank AdventureWorks).
Die Funktion zum Ausführen von CLR-Code (Common Language Runtime) ist in SQL Server standardmäßig deaktiviert. Der CLR-Code kann durch Ausführen der gespeicherten Systemprozedur sp_configure aktiviert werden. Weitere Informationen finden Sie unter Aktivieren der CLR-Integration.
Sie müssen die Assembly erstellen, um auf die gespeicherte Prozedur zugreifen zu können. Für dieses Beispiel wird vorausgesetzt, dass Sie die helloworld.dll-Assembly im Verzeichnis C:\ erstellt haben. Fügen Sie die folgende Transact-SQL-Anweisung zur Abfrage hinzu:
CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE
Nach dem Erstellen der Assembly können Sie mithilfe der CREATE PROCEDURE-Anweisung auf die HelloWorld-Methode zugreifen. Die gespeicherte Prozedur wird "hello" genannt:
CREATE PROCEDURE hello
@i nchar(25) OUTPUT
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
Nach dem Erstellen der Prozedur kann diese wie eine normale, in Transact-SQL geschriebene gespeicherte Prozedur ausgeführt weden. Führen Sie den folgenden Befehl aus:
DECLARE @J nchar(25)
EXEC hello @J out
PRINT @J
Daraufhin sollte im Meldungsfenster von SQL Server Management Studio folgende Ausgabe angezeigt werden.
Hello world!
Hello world!
Entfernen des Beispiels der gespeicherten Prozedur "Hello World"
Wenn Sie die gespeicherte Beispielprozedur ausgeführt haben, können Sie die Prozedur und die Assembly aus der Testdatenbank entfernen.
Entfernen Sie zuerst die Prozedur. Verwenden Sie hierzu den drop procedure-Befehl.
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'hello')
drop procedure hello
Nach dem Löschen der Prozedur können Sie die Assembly entfernen, die den Beispielcode enthält.
IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'helloworld')
drop assembly helloworld