En los últimos artículos estábamos escribiendo contenido destrozador sobre SQL Server & .Net, y me hizo pensar por que no hacer un MIX de ambas cosas en un sólo post para no perder la racha
Esto me llevo a crear éste artículo en donde podremos escribir código en Visual Basic o CSharp .Net para ejecutarlo de un modo más integrado.
Los procedimientos CLR nos ofrece algunas ventajas sobre T-SQL:
- Para hacer procesos complejos no necesitamos ser gurús del T-SQL, no es una ventaja en sí pero es más facil éste camino para la mayoría de los programadores.
- Podemos utilizar toda la potencia de la programación orientada a objetos de VB y C#
- Manipulaciones finas, de estructuras, cadenas, criptografia, conexion a otros motores remotos, es más fácil y potente hacerlo con dotNet que T-SQL que para algunas tareas es limitado
- El recolector de basura del CLR es mucho más eficiente y manipulable que el del motor de BD
Las cosas que vamos a necesitar son simple,
- SQL Server 2008 instalado (lo use para el ejemplo, pero también funciona en la versión 2005)
- Framework 2.0 como mínimo instalado con SDK o Visual Studio
Paso 1. Habilitar la integración CLR en SQL Server 2008
Para que esto pueda correr en nuestro servidor de base de datos, primeramente debemos habilitar la ejecución de CLR en el mismo.
1 2 3 4 | SP_CONFIGURE 'CLR ENABLE', 1; GO RECONFIGURE; GO |
Paso 2. Creando y compilando la clase VB
Ahora escribiremos nuestro código VB, lo haremos en cualquier editor de texto (les recomiendo notepad++) o incluso con Visual Studio para usar el IntelliSense, pero no lo compilaremos allí. El método recibirá un parámetro de entrada, más bien al efecto de mostrar como recibir parámetros con ésta técnica más que funcionalidad.
Luego obtenemos la conexión de nuestra BD para reutilizarla y crearemos una simple lectura con SQLReader y lo volcaremos al pipe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Imports System Imports System.Data Imports System.Data.SqlClient Imports Microsoft.SqlServer.Server Imports System.Data.SqlTypes Public Class Troce <Microsoft.SqlServer.Server.SqlProcedure()> _ Public Shared Sub CLRClientes(ByVal nombre As SqlString) SqlContext.Pipe.Send("Devtroce para el mundo! Assembly invocado a las: " & System.DateTime.Now.ToString()) SqlContext.Pipe.Send("Hola " & Convert.ToString(nombre) & ", estos son los clientes que tenemos") Using oConnection As New SqlConnection("context connection=true") Try oConnection.Open() Dim oCommand As New SqlCommand( _ "select * from clientes", oConnection) Dim oReader As SqlDataReader oReader = oCommand.ExecuteReader() SqlContext.Pipe.Send(oReader) Catch ex As Exception SqlContext.Pipe.Send(ex.ToString()) End Try End Using End Sub End Class |
Este fichero lo guardaremos en
1 | C:\Devtroce\Dev.vb |
Aun falta compilar y generar una .dll de ésta clase y lo haremos accediendo a la consola del SDK del framework, si tienen Visual Studio instalado lo pueden encontrar en:
1 | Inicio -> Todos los Programas --> Microsoft Visual Studio 2008 --> Visual Studio Tools --> Símbolo del sistema de Visual Studio 2008 |
o si solo tienen instalado el SDK en
1 | Inicio -> Todos los Programas --> Microsoft .NET Framework SDK v2.o --> SDK Command Prompt |
Una vez que estamos en la consola escribimos la línea de comando correspondiente para compilar nuestra clase:
1 | vbc /t:library C:\Devtroce\Dev.vb |
Paso 3. Registrando el ensamblado en SQL Server
Con esto ya estamos casi listos, nos queda registrar el Ensamblado en la Base de datos
1 2 | CREATE ASSEMBLY Dev from 'c:\Devtroce\Dev.dll' WITH PERMISSION_SET = SAFE; Go |
Con esto ya podremos crear un procedimiento almacenado que hace uso de la .dll, recibirá como entrada un parametros nvarchar, aquí es donde tenemos que cuidar unos aspectos, por cada entrada en la clase VB, debemos crear una entrada T-SQL, y deben estar mapeado en los tipos de datos T-SQL / CLR
es por eso que en la clase de VB coloque como tipo de datos SQLString y no String
Paso 4. Creando procedimientos CLR y ejecutarlos en SQL Server
1 2 3 4 | CREATE PROCedure sp_DevTroce(@nombre as nvarchar(255)) AS EXTERNAL NAME Dev.Troce.CLRClientes Go |
Con esto ya estamos hechos y podemos invocarles como cualquier otro SP
1 | sp_DevTroce 'GeekZero'; |
Articulos Relacionados:










en
en
en
en
Me acabas de abrir los ojos a otro mundo dentro del .Net
Te lo gradezco
Hola Jose, me alegra saberlo..