Olvasás angol nyelven

Megosztás a következőn keresztül:


A CLR-integráció első lépései

A következőkre vonatkozik:SQL Server

Ez a cikk áttekintést nyújt az adatbázis-objektumok sql Server-integrációval történő fordításához szükséges névterekről és kódtárakról a .NET-keretrendszer közös nyelvi futtatókörnyezetével (CLR). A cikk azt is bemutatja, hogyan írhat, fordíthat le és futtathat egy kis CLR-ben tárolt, C# és Visual Basic .NET nyelven írt eljárást.

Kötelező névterek

Az alapvető CLR-adatbázis-objektumok fejlesztéséhez szükséges összetevők az SQL Serverrel vannak telepítve. A CLR integrációs funkciói a .NET-keretrendszer részét képező System.Data.dllnevű szerelvényben lesznek közzétéve. Ez a szerelvény a globális szerelvény-gyorsítótárban (GAC) és a .NET-keretrendszer könyvtárában található. A parancssori eszközök és a Visual Studio általában automatikusan hozzáad egy erre a szerelvényre mutató hivatkozást, így nem kell manuálisan hozzáadni.

A System.Data.dll szerelvény a következő névtereket tartalmazza, amelyek a CLR-adatbázisobjektumok összeállításához szükségesek:

  • System.Data
  • System.Data.Sql
  • Microsoft.SqlServer.Server
  • System.Data.SqlTypes

Tipp

A CLR-adatbázisobjektumok Linuxon való betöltése támogatott, de a .NET-keretrendszerrel kell létrehozni őket (az SQL Server CLR-integráció nem támogatja a .NET Core- vagy .NET 5-ös és újabb verziókat). A EXTERNAL_ACCESS vagy UNSAFE engedélykészlettel rendelkező CLR-szerelvények linuxos rendszereken sem támogatottak.

Az "Hello World" tárolt eljárás megírása

Másolja és illessze be a következő C# vagy Visual Basic .NET kódot egy szövegszerkesztőbe, majd mentse egy helloworld.cs vagy helloworld.vbnevű fájlba.

C#
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!";
    }
}

Ez a program egyetlen statikus metódust tartalmaz egy nyilvános osztályon. Ez a metódus két új osztályt használ, SqlContext és SqlPipe, a felügyelt adatbázis-objektumok létrehozásához, hogy rövid szöveges üzenetet jelenítsen meg. A metódus a "Hello world!" sztringet is hozzárendeli egy out paraméter értékeként. Ez a metódus tárolt eljárásként deklarálható az SQL Serverben, majd ugyanúgy futtatható, mint egy Transact-SQL tárolt eljárás.

Fordítsa le ezt a programot könyvtárként, töltse be az SQL Serverbe, és futtassa tárolt eljárásként.

A "Hello World" tárolt eljárás fordítása

Az SQL Server alapértelmezés szerint telepíti a .NET-keretrendszer újraterjesztési fájljait. Ezek a fájlok tartalmazzák a C# és a Visual Basic .NET programok parancssori fordítóit, csc.exe és vbc.exe. A minta fordításához módosítania kell az elérési út változóját, hogy a csc.exe vagy vbc.exetartalmazó könyvtárra mutasson. Az alábbi elérési út a .NET-keretrendszer alapértelmezett telepítési útvonala.

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

A verzió tartalmazza a telepített .NET-keretrendszer verziószámát. Például:

C:\Windows\Microsoft.NET\Framework\v4.8.0

Miután hozzáadta a .NET-keretrendszer könyvtárát az elérési úthoz, a minta tárolt eljárást lefordíthatja egy összeállításba az alábbi paranccsal. A /target opció lehetővé teszi, hogy lefordítsa egy assembly kódba.

C#-forrásfájlok esetén:

csc /target:library helloworld.cs

Visual Basic .NET-forrásfájlok esetén:

vbc /target:library helloworld.vb

Ezek a parancsok elindítják a C# vagy a Visual Basic .NET fordítót a /target beállítással a kódtár DLL-jének létrehozásához.

Töltse be és futtassa a "Hello World" tárolt eljárást az SQL Serveren

A mintaeljárás sikeres fordítása után tesztelheti azt az SQL Serveren. Ehhez nyissa meg az SQL Server Management Studiót, és hozzon létre egy új lekérdezést, és csatlakozzon egy megfelelő tesztadatbázishoz (például a AdventureWorks2022 mintaadatbázishoz).

A közös nyelvi futtatókörnyezeti (CLR) kód végrehajtásának lehetősége alapértelmezés szerint OFF az SQL Serverben. A CLR-kód a sp_configure rendszer által tárolt eljárással engedélyezhető. További információért lásd: Engedélyezze a CLR-integrációt.

Létre kell hoznunk a szerelvényt, hogy hozzáférhessünk a tárolt eljáráshoz. Ebben a példában feltételezzük, hogy a helloworld.dll szerelvényt a C:\ könyvtárban hozta létre. Adja hozzá a következő Transact-SQL utasítást a lekérdezéshez.

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

A szerelvény létrehozása után most már hozzáférhetünk a HelloWorld metódushoz a CREATE PROCEDURE utasítás használatával. A tárolt eljárást hellohívjuk:

SQL
CREATE PROCEDURE hello
(@i NCHAR (25) OUTPUT)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;

Megjegyzés

Az előző példában, ha a HelloWorldProc osztály egy névtérben (más néven MyNS) található, a létrehozási eljárás utasításának utolsó sora EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;lesz.

Az eljárás létrehozása után ugyanúgy futtatható, mint a Transact-SQL-ben írt normál tárolt eljárás. Hajtsa végre a következő parancsot:

SQL
DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;

Itt a várt kimenet.

Output
Hello world!
Hello world!

Távolítsa el a "Hello World" tárolt eljárásmintát

Ha befejezte a minta tárolt eljárás futtatását, eltávolíthatja az eljárást és a szerelvényt a tesztadatbázisból.

Először távolítsa el az eljárást a drop procedure paranccsal.

SQL
IF EXISTS (SELECT name
           FROM sysobjects
           WHERE name = 'hello')
    DROP PROCEDURE hello;

Miután az eljárást elvetették, eltávolíthatja a mintakódot tartalmazó szerelvényt.

SQL
IF EXISTS (SELECT name
           FROM sys.assemblies
           WHERE name = 'helloworld')
    DROP ASSEMBLY helloworld;