post icon

Ejecutar código VisualBasic .Net en Procedimientos Almacenados de SQL Server

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: " &amp; 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';

Comentarios desde Facebook:

  1. avatar
    JOSE EMILIO SPAIN Mozilla Firefox Windows
    31 octubre 2010 at 09:09 #

    Me acabas de abrir los ojos a otro mundo dentro del .Net
    Te lo gradezco

    • avatar
      GeekZero PARAGUAY Google Chrome Windows
      1 noviembre 2010 at 09:02 #

      Hola Jose, me alegra saberlo..

Trackbacks/Pingbacks

  1. Tweets that mention Ejecutar código VisualBasic .Net en de SQL Server | DevTroce.com -- Topsy.com UNITED STATES - 25 julio 2010

    […] This post was mentioned on Twitter by Ronald Riveros, DevTroce. DevTroce said: Ejecutar código VisualBasic .Net en Procedimientos Almacenados de SQL Server: En los últimos… http://goo.gl/fb/quMa8 […]

Responder