Freigeben über


Erste Schritte mit der CLR-Integration

Dieses Thema enthält eine Übersicht über die Namespaces und Bibliotheken, die zum Kompilieren von Datenbankobjekten mithilfe der SQL Server-Integration in die Common Language Runtime (CLR) von .NET Framework erforderlich sind. Im Thema erfahren Sie außerdem, wie Sie eine einfache gespeicherte CLR-Prozedur schreiben, kompilieren und ausführen, die in Microsoft Visual C# geschrieben wurde.

Erforderliche Namespaces

Beginnend mit SQL Server. CLR-Integrationsfunktionen werden in einer Assembly namens system.data.dllverfügbar gemacht, die Teil von .NET Framework ist. Diese Assembly befindet sich sowohl im globalen Assemblycache (GAC) als auch im .NET Framework-Verzeichnis. Ein Verweis auf diese Assembly wird in der Regel automatisch von Befehlszeilentools und Microsoft Visual Studio hinzugefügt, sodass es nicht manuell hinzugefügt werden muss.

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 einer einfachen gespeicherten "Hello World"-Prozedur

Kopieren Sie den folgenden Visual C#- oder Microsoft Visual Basic-Code in einen Text-Editor, und speichern Sie ihn in einer Datei namens "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 für eine öffentliche Klasse. Diese Methode verwendet zwei neue Klassen SqlContext und SqlPipezum Erstellen von verwalteten Datenbankobjekten zum Ausgeben einer einfachen Textnachricht. Die Methode weist auch die Zeichenfolge "Hello world!" als Wert eines Out-Parameters zu. Diese Methode kann als gespeicherte Prozedur in Transact-SQL gespeicherten Prozedur deklariert werden.

Dieses Programm wird nun als Bibliothek kompiliert, in SQL Server geladen und als gespeicherte Prozedur ausgeführt.

Kompilieren der gespeicherten "Hello World"-Prozedur

Microsoft .NET Framework-Dateien werden standardmäßig neu verteilt. Zu diesen Dateien gehören csc.exe und vbc.exe, die Befehlszeilencompiler für Visual C#- und Visual Basic-Programme. Um unser Beispiel zu kompilieren, müssen Sie Ihre Pfadvariable so ändern, dass sie auf das Verzeichnis verweist, das csc.exe oder vbc.exeenthält. Nachfolgend sehen Sie den Standardinstallationspfad von .NET Framework.

C:\Windows\Microsoft.NET\Framework\(version)  

Version enthält die Versionsnummer der installierten .NET Framework redistributable. Beispiel:

C:\Windows\Microsoft.NET\Framework\v2.0.31113  

Nachdem Sie das .NET Framework-Verzeichnis zu Ihrem Pfad hinzugefügt haben, können Sie die gespeicherte Beispielprozedur in eine Assembly mit dem folgenden Befehl kompilieren. Mit der /target Option können Sie sie in eine Assembly kompilieren.

Für Visual C#-Quelldateien:

csc /target:library helloworld.cs   

Für Visual Basic-Quelldateien:

vbc /target:library helloworld.vb  

Diese Befehle starten den Visual C#- oder Visual Basic-Compiler mit der Option "/target", um das Erstellen einer Bibliotheks-DLL anzugeben.

Laden und Ausführen der gespeicherten Prozedur "Hello World" in SQL Server

Nachdem das Beispielverfahren erfolgreich kompiliert wurde, können Sie es in SQL Server Management Studio testen und eine neue Abfrage erstellen, die eine Verbindung mit einer geeigneten Testdatenbank herstellt (z. B. die AdventureWorks-Beispieldatenbank).

Die Möglichkeit zum Ausführen von CLR-Code (Common Language Runtime) ist standardmäßig in SQL Server auf OFF festgelegt. Der CLR-Code kann mithilfe der gespeicherten sp_configure Systemprozedur aktiviert werden. Weitere Informationen finden Sie unter Enabling CLR Integration.

Wir müssen die Assembly erstellen, damit wir auf die gespeicherte Prozedur zugreifen können. In diesem Beispiel wird davon ausgegangen, dass Sie die helloworld.dll-Assembly im Verzeichnis C:\ erstellt haben. Fügen Sie ihrer Abfrage die folgende Transact-SQL-Anweisung hinzu.

CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE  

Nachdem die Assembly erstellt wurde, können wir nun mithilfe der Create-Prozedur-Anweisung auf unsere HelloWorld-Methode zugreifen. Wir rufen unsere gespeicherte Prozedur "hello" auf:

  
CREATE PROCEDURE hello  
@i nchar(25) OUTPUT  
AS  
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld  
-- if the HelloWorldProc class is inside a namespace (called MyNS),  
-- the last line in the create procedure statement would be  
-- EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld  

Nachdem die Prozedur erstellt wurde, kann sie genauso wie eine normale gespeicherte Prozedur ausgeführt werden, die in Transact-SQL geschrieben wurde. Führen Sie den folgenden Befehl aus:

DECLARE @J nchar(25)  
EXEC hello @J out  
PRINT @J  

Dies sollte zu der folgenden Ausgabe im Sql Server Management Studio-Nachrichtenfenster führen.

Hello world!  
Hello world!  

Entfernen des Gespeicherten Prozedurbeispiels "Hello World"

Wenn Sie mit der Ausführung der gespeicherten Beispielprozedur fertig sind, können Sie die Prozedur und die Assembly aus der Testdatenbank entfernen.

Entfernen Sie zunächst die Prozedur mithilfe des Drop-Prozedurbefehls.

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'hello')  
   drop procedure hello  

Nachdem die Prozedur gelöscht wurde, können Sie die Assembly entfernen, die Ihren Beispielcode enthält.

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'helloworld')  
   drop assembly helloworld  

Siehe auch

Gespeicherte CLR-Prozeduren
SQL Server In-Process spezifische Erweiterungen für ADO.NET
Debuggen von CLR-Datenbankobjekten
Sicherheit der CLR-Integration