You are on page 1of 7

1

Utilizando Cdigo .NET en SQL SERVER 2008

UTILIZANDO CODIGO .NET EN SQL SERVER 2008


Con SQL Server 7.0, Microsoft introdujo la idea de procesos complejos en forma de Procedimientos Almacenados Extendidos. Estos objetos son DDLs escritas en C++ en la mayora de los casos, que se utilizan para extender la funcionalidad de SQL Server. Sin embargo, el desarrollo de estos componentes resulta demasiado difcil para la mayora de los usuarios, debido a que al escribir el cdigo para este tipo de objetos, debemos tener en cuenta temas como la gestin de memoria, seguridad, etc. SQL Server 2008 introduce el desarrollo de objetos complejos con lenguajes .NET, debido a su integracin con el Common Language Runtime (CLR). A partir de ahora, podemos desarrollar con lenguajes .NET, objetos como procedimientos almacenados, funciones definidas por el usuario, tipos definidos por el usuario o desencadenadores. Integracin CLR El Common Language Runtime es el motor en tiempo de Ejecucin del .NET Framework. Es el componente encargado de gestionar toda la Ejecucin del cdigo escrito en cualquier lenguaje .NET. las aplicaciones en .NET se organizan en unidades llamadas ensamblados. Cuando escribimos un componente con el lenguaje .NET y compilamos el cdigo, el resultado de la Compilacin es un ensamblado, normalmente con extensin .dll, que contiene un cdigo llamado MSIL. Este es el acrnimo de Microsoft Intermediate Language. Cuando ejecutamos una aplicacin escrita en .NET, en realidad ejecutamos un ensamblado, que es el componente que contiene el cdigo de la aplicacin. Al ejecutar el ensamblado, el CLR compila MSIL contenido dentro del ensamblado a cdigo nativo, (a este proceso se le conoce como Compilacin Just In Time), y despus ejecuta la aplicacin. Habilitar la Integracin Antes de poder utilizar los objetos CLR, debemos habilitar su uso en la base de datos. Esto lo haremos accediendo al men SQL Server, y dentro de las herramientas de configuracin, abriremos la Herramienta de Configuracin de Superficie. En esta ventana, debemos hacer clic sobre la opcin de Configuracin de Superficie para caractersticas. Luego desplegaremos el rbol que corresponde a nuestro servidor, desplegaremos el nodo Motor de base de datos, y seleccionaremos el elemento Integracin CLR. Y Luego el botn Aceptar. Tambin podemos utilizar las herramientas de TSQL para lo cual escribiremos: -- Habilitar la integracion con el CLR exec sp_configure 'clr_enabled',1 go RECONFIGURE go

Visual Studio 2008 La integracin entre SQL Server y Visual Studio 2008 es profunda en muchos aspectos. De hecho, SQL Server 2008 instala una versin reducida de Visual Studio 2008 llamada

PROFESOR: LIN RODRGUEZ, Julio Csar

Pgina 1

Utilizando Cdigo .NET en SQL SERVER 2008


Business Intelligence Development Studio. Cuando en una misma maquina tenemos instalado Visual Studio 2008 y SQL Server 2008, el entorno de desarrollo de .NET tendr a su disposicin una plantilla especial para crear proyectos para SQL Server 2008 donde podamos desarrollar cualquiera de los cinco objetos SQL que tenemos a nuestra disposicin desde Visual Studio 2008. Para comprobar esto abriremos el Visual Studio 2008, elegiremos la opcin de creer un nuevo proyecto, seleccionaremos el lenguaje de nuestra eleccin, y dentro de el escogeremos el proyecto de base de datos SQL Server.

Al crear el proyecto, Visual Studio nos pedir que seleccionemos una referencia a una conexin de base de datos. Debido a que Visual Studio proporciona implementacin automatizada de los ensamblados en SQL Server, debe asociar una conexin a un servidor de base de datos determinado.

PROFESOR: LIN RODRGUEZ, Julio Csar

Pgina 2

Utilizando Cdigo .NET en SQL SERVER 2008

Seleccionaremos la conexin con la Base de datos BDTRABAJO. Luego agregaremos un nuevo elemento de tipo Stored Procedure.

Al cual le pondremos como nombre ListarProductos.vb Digitaremos lo siguiente: Imports System

PROFESOR: LIN RODRGUEZ, Julio Csar

Pgina 3

Utilizando Cdigo .NET en SQL SERVER 2008


Imports Imports Imports Imports System.Data System.Data.SqlClient System.Data.SqlTypes Microsoft.SqlServer.Server

Partial Public Class StoredProcedures <Microsoft.SqlServer.Server.SqlProcedure()> _ Public Shared Sub ListarProductos() ' Creamos la Conexion utilizando el contexto actual Dim cnx As New SqlConnection("context connection=true") ' Creamos el comando que contiene la consulta Dim cmd As New SqlCommand("Select Cod_Prod,Nom_Prod,Pre_Prod From Productos", cnx) ' Abrimos la conexion cnx.Open() ' Ejecutamos el comando y devolvemos las filas en el formato de SqlDataReader Dim lector As SqlDataReader = cmd.ExecuteReader ' Enviamos los resultados al Servidor SqlContext.Pipe.Send(lector) lector.Close() cnx.Close() End Sub End Class Y en un archivo de consulta podremos ejecutar: use BDTRABAJO go Exec dbo.ListarProductos go

Crearemos ahora un nuevo archivo de tipo Procedimiento almacenado al cual denominaremos: ListarClientesPais.vb

PROFESOR: LIN RODRGUEZ, Julio Csar

Pgina 4

Utilizando Cdigo .NET en SQL SERVER 2008

Este archivo nos permitir listar los distintos clientes de acuerdo al nombre de un Pas enviado como parmetro. Todo el cdigo del archivo muestra a continuacin: Imports Imports Imports Imports Imports Imports System System.Data.Sql System.Data System.Data.SqlClient System.Data.SqlTypes Microsoft.SqlServer.Server

Partial Public Class StoredProcedures <Microsoft.SqlServer.Server.SqlProcedure()> _ Public Shared Sub ListarClientesPais(ByVal NomPais As String) ' Creamos la Conexion utilizando el contexto actual Dim cnx As New SqlConnection("context connection=true") ' Creamos el comando que contiene la consulta Dim cmd As New SqlCommand("Select Cod_Cli,Nom_Cli,Pais From Clientes Where Pais=@NomPais", cnx) ' Creamos el parametro que necesita cmd.Parameters.Add("@NomPais", SqlDbType.VarChar, 20).Value = NomPais ' Abrimos la conexion cnx.Open() ' Ejecutamos el comando y devolvemos las filas en el formato de SqlDataReader Dim lector As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ' Enviamos los resultados al Servidor SqlContext.Pipe.Send("Se ejecut el Proc. Almacenado <ListaClientesPais>") SqlContext.Pipe.Send(lector) lector.Close() End Sub End Class

PROFESOR: LIN RODRGUEZ, Julio Csar

Pgina 5

Utilizando Cdigo .NET en SQL SERVER 2008

Agregaremos un Nuevo archive de tipo Desencadenador (Trigger) al cual nombraremos: TR_NO_INSERTA_CLIENTES.vb

Digitaremos el siguiente codigo: Imports Imports Imports Imports Imports System System.Data System.Data.SqlClient System.Data.SqlTypes Microsoft.SqlServer.Server

Partial Public Class Triggers ' Introduzca la tabla o vista existente del destino y elimine la marca de comentario de la lnea de atributos ' <Microsoft.SqlServer.Server.SqlTrigger(Name:="TR_NO_INSERTA_CLIENTES", Target:="Table1", Event:="FOR UPDATE")> _ Public Shared Sub TR_NO_INSERTA_CLIENTES() Dim cnx As New SqlConnection("context connection=true") Dim cadsql As String = "Select count(*) From Inserted" Dim cmd As New SqlCommand(cadsql, cnx) cnx.Open() Dim num As Integer = Convert.ToInt32(cmd.ExecuteScalar) If num > 0 Then Dim p As SqlPipe = SqlContext.Pipe cmd.CommandText = "RAISERROR('No se Permite Insertar Nuevos Registros',14,1)" 'Enviando el Error Try p.ExecuteAndSend(cmd) Catch ex As Exception End Try 'Cancelando la Operacion System.Transactions.Transaction.Current.Rollback() End If End Sub End Class

PROFESOR: LIN RODRGUEZ, Julio Csar

Pgina 6

Utilizando Cdigo .NET en SQL SERVER 2008


Luego de haber creado el trigger CLR, deberemos crear el Trigger de SQL Server enlazado con el DLL creado en el paso anterior, para lo cual en una ventana de consulta digitaremos: USE BDTRABAJO GO CREATE TRIGGER TR_NO_INSERTA_CLIENTES ON DBO.CLIENTES AFTER INSERT AS EXTERNAL NAME SqlServerProjectCLR1.[SqlServerProjectCLR1.Triggers].TR_NO_INSERTA_CLIENTE S GO Demostrando la ejecucion del Trigger, si intentamos insertar un nuevo cliente, el Trigger creado a traves de Visual Studio .NET 2008, nos lo impediria. INSERT INTO CLIENTES(COD_CLI,NOM_CLI,PAIS,ESTADO) VALUES('NEW20','NEO CLIENTE 20 ','PERU',1) GO

PROFESOR: LIN RODRGUEZ, Julio Csar

Pgina 7

You might also like