Krypton Solid

La última tecnología en raciones de 5 minutos

Tipos definidos por el usuario

Otra característica nueva importante en SQL Server 2005 que está habilitada por la integración de .NET CLR es la capacidad …

para crear verdaderos tipos definidos por el usuario (UDT). Con los UDT, puede ampliar los tipos sin procesar proporcionados por SQL Server y agregar tipos de datos especializados para su aplicación o entorno.

En el siguiente ejemplo, verá cómo crear un UDT que represente un código de género: M para hombre o F para mujer. Si bien puede almacenar estos datos en un campo de caracteres estándar de un byte, el uso de un UDT garantiza que el campo aceptará solo estos dos valores sin necesidad adicional de activadores, restricciones u otras técnicas de validación de datos.

Para crear un UDT con Visual Studio 2005, seleccione Nuevo | Opción de proyecto, asigne un nombre a su proyecto y haga clic en Aceptar para crear el proyecto. Para este proyecto utilicé el nombre de Género para la nueva UDT. Después de nombrar el proyecto y hacer clic en Aceptar, completé el cuadro de diálogo Nueva referencia de base de datos utilizando los valores de conexión necesarios para implementar el proyecto en el sistema y la base de datos de SQL Server adecuados. A continuación, utilicé el Proyecto | La opción Agregar tipo definido por el usuario para mostrar el cuadro de diálogo Agregar nuevo elemento que puede ver en la Figura 3-11.

Figura 3-11
Figura 3-11: Creación de un UDT de .NET SQL Server

Tabla 3-1
Tabla 3-1: Métodos UDT requeridos

Seleccione Tipo definido por el usuario en la lista de plantillas de SQL Server. Ingrese el nombre que desea asignar a la clase y luego haga clic en Abrir para que Visual Studio genere un archivo de proyecto inicial para el UDT. El archivo de proyecto inicial implementa los cuatro métodos que SQL Server 2005 requiere para todos los UDT. Estos métodos son necesarios para cumplir con los requisitos del contrato de SQL Server UDT; depende de usted agregar el código para que el UDT realice acciones significativas. Los cuatro métodos UDT requeridos se enumeran en la Tabla 3-1. Puede ver la clase de género completa que se usa para implementar un UDT para los códigos M (masculino) y F (femenino) en esta lista:

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.IO


  
    _

   
     _
Public Structure Gender
      Implements INullable, IBinarySerialize

      Public Sub Read(ByVal r As BinaryReader) _
            Implements IBinarySerialize.Read
            m_value = r.ReadString.ToString()
End Sub

Public Overrides Function ToString() As String
     If m_value.IsNull = False Then
          Return m_value.Value
     Else
         Return Nothing
     End If
End Function

Public ReadOnly Property IsNull() As Boolean _
     Implements INullable.IsNull
         Get
               If m_value.IsNull = True Then
                      Return True
              Else
                      Return False
              End If
         End Get
End Property

Public Shared ReadOnly Property Null() As Gender
     Get
           Dim h As Gender = New Gender
           h.m_Null = True
           Return h
      End Get
End Property

Public Shared Function Parse(ByVal s As SqlString) As Gender
       If s.IsNull Then
           Return Null
       End If

       Dim u As Gender = New Gender
       u.Value = s
       Return u 
End Function

      ' Create a Value Property
      Public Property Value() As SqlString
            Get
                   Return m_value
            End Get

            Set(ByVal value As SqlString)
                   If (value = "M" Or value = "F") Then
                       m_value = value
                  Else
                       Throw New ArgumentException _
                          ("Gender data type must be M or F")
                  End If
             End Set
        End Property

        ' Private members
        Private m_Null As Boolean
        Private m_value As SqlString
End Structure
   ()>

Para crear un UDT, el código debe cumplir con ciertas convenciones. Los atributos de la clase deben ser serializables, la clase debe implementar la interfaz INullable y el nombre de la clase debe establecerse con el nombre del UDT. Opcionalmente, puede agregar la interfaz IComparable. En este ejemplo, Sexo es el nombre de la clase. Cerca de la parte inferior de la lista, puede ver dónde se declara una variable de cadena privada llamada m_value para contener el valor del tipo de datos.

Al igual que los otros objetos de la base de datos CLR, el atributo juega un papel importante en la construcción del CLR UDT. El atributo UDT de SQL Server acepta los valores de propiedad que se muestran en la Tabla 3-2.

Lo primero que hay que notar en el código es el uso de las interfaces INullable e IBinarySerialize. La interfaz INullable es necesaria para todos los UDT. La interfaz IBinarySerialize es necesaria para los UDT que utilizan el atributo Format.UserDefined. Debido a que este ejemplo usa un tipo de datos String, se requiere el atributo Format.UserDefined, lo que significa que este UDT también necesita código para manejar la serialización del UDT. En términos prácticos, esto significa que la clase debe implementar los métodos de lectura y escritura de IBinarySerialize, que puede ver en la siguiente sección de código.

Al principio puede parecer un poco intimidante usar las interfaces IBinarySerialize, pero como puede ver en las subrutinas de lectura y escritura, en realidad es bastante simple. La subrutina Read simplemente usa el método ReadString para asignar un valor a la variable m_value de UDT (que contiene el valor de UDT). Asimismo, la subrutina Write utiliza el método Write para serializar el contenido de la variable m_value.

Tabla 3-2
Tabla 3-2: Propiedades de los atributos de UDT

El método ToString comprueba si el contenido de la variable m_value es nulo. Si es así, se devuelve la cadena «nulo». De lo contrario, el método ToString de m_value devuelve el valor de cadena del contenido.

La siguiente sección de código define la propiedad IsNull. El método get de esta propiedad verifica el contenido de la variable m_value y devuelve el valor verdadero si m_value es nulo. De lo contrario, el método get devuelve el valor falso. A continuación, puede ver el método Null, que fue generado por la plantilla para cumplir con el requisito de nulabilidad de UDT.

El método Parse acepta un argumento de cadena, que almacena en la propiedad Value del objeto. Puede ver la definición de la propiedad Value un poco más abajo en el código. El método Parse debe declararse como estático o, si está utilizando VB.NET, debe ser una propiedad compartida.

La propiedad Value es específica de esta implementación. En este ejemplo, la propiedad Value se usa para almacenar y recuperar el valor del UDT. También es responsable de editar los valores permitidos. En el método de configuración, puede ver que solo se permiten los valores de M o F. Si intenta utilizar cualquier otro valor, se generará una excepción que informa a la persona que llama que el «tipo de datos de género debe ser M o F».

Implementar el UDT

De manera muy similar a una función o procedimiento almacenado CLR, el UDT se compila en una DLL después de que se completa el código. Luego, esa DLL se importa como un ensamblado de SQL Server utilizando las instrucciones CREATE ASSEMBLY y CREATE TYPE o simplemente utilizando la opción Visual Studio 2005 Deploy. Puede ver el código T-SQL para crear manualmente CLR UDT en la siguiente lista:

create assembly Gender
from 'C:tempGender.dll'
go

CREATE TYPE Gender
EXTERNAL NAME Gender.[Gender.Gender]
go

Esta lista asume que gender.dll se ha copiado en el c: temp que está en el sistema SQL Server. Una cosa a tener en cuenta en la declaración CREATE TYPE es el parámetro de clase. Como en los ejemplos de CLR anteriores, la primera parte de la cláusula de nombre externo especifica el ensamblado que se utilizará. En el caso de un UDT, la segunda parte del nombre identifica el espacio de nombres y la clase. En el ejemplo de género, el espacio de nombres era género y la clase de UDT también se llama género.

Usando el UDT

Una vez que se crea el UDT, puede usarlo en T-SQL de manera muy similar a los tipos de datos nativos de SQL Server. Sin embargo, dado que los UDT contienen métodos y propiedades, existen diferencias. El siguiente ejemplo muestra cómo se puede utilizar la UDT de género como una variable y cómo se puede acceder a su propiedad Value:

DECLARE @mf Gender
SET @mf="N"
PRINT @mf.Value

En este listado, la variable UDT se declara utilizando la instrucción DECLARE de T-SQL estándar, y la instrucción SET se usa para intentar asignar el valor de N a la propiedad Value de UDT. Debido a que N no es un valor válido, se genera el siguiente error:

.Net SqlClient Data Provider: Msg 6522, Level 16, State 1, Line 2
A CLR error occurred during execution of 'Gender':
System.ArgumentException: Gender data type must be M or F
at Gender.set_Value(SqlString value)

Así como los UDT se pueden usar como variables, también se pueden usar para crear columnas. La siguiente lista ilustra la creación de una tabla que usa el UDT de género:

CREATE TABLE MyContacts
(ContactID int,
FirstName varchar(25),
LastName varchar(25),
MaleFemale Gender)

Si bien la creación de columnas con el tipo UDT es igual que cuando se usa un tipo de datos nativo, la asignación de valores al UDT es un poco diferente a la asignación de columna estándar. Los UDT complejos pueden contener varios valores. En ese caso, debe asignar los valores a los miembros de la UDT. Puede acceder a los miembros de la UDT prefijándolos con el símbolo (.). En este caso, dado que el UDT usa un valor simple, puede asignarle valores exactamente como puede con cualquiera de los tipos de datos integrados. Este ejemplo muestra cómo insertar una fila en la tabla MyContacts de ejemplo que contiene el UDT de género:

INSERT INTO MyContacts VALUES(1, 'Michael', 'Otey', 'M')

Para recuperar el contenido del UDT usando la instrucción SELECT, necesita usar la notación UDT.Member como se muestra aquí cuando se hace referencia a una columna UDT:

SELECT ContactID, LastName, MaleFemale.Value FROM MyContacts

Para ver los UDT que se han creado para una base de datos, puede consultar la vista sys.Types como se muestra aquí:

SELECT * FROM sys.Types

El consejo anterior es de «Desarrollo de objetos de base de datos CLR: 10 consejos en 10 minutos», extraído del capítulo 3 del libro «Microsoft SQL Server 2005: Guía del desarrollador» escrito por Michael Otey y Denielle Otey, cortesía de McGraw-Hill Publishing.


Desarrollar objetos de base de datos CLR


Inicio: Introducción

Consejo 1: arquitectura CLR

Consejo 2: ensamblados CLR en SQL Server 2005

Consejo 3: creación de objetos de base de datos CLR

Consejo 4: procedimientos almacenados de CLR

Consejo 5: funciones definidas por el usuario

Consejo 6: disparadores CLR

Consejo 7:
Tipos definidos por el usuario

Consejo 8: agregados CLR

Consejo 9: depurar objetos de base de datos CLR

Consejo 10: seguridad del objeto de la base de datos .NET

Deja un comentario

También te puede interesar...

Oracle Sun Day crea un nuevo mundo empresarial

de Oracle Acuerdo de compra de Sun por $ 7.4 mil millones es en gran parte inesperado y cambia por completo el juego. Casi todos los aspectos del acuerdo son discutibles: ¿qué pasará con la

Nokia Lumia es perfecto para 20 algo

El hecho de que Nokia haya proporcionado exactamente lo que necesita para poder vender muchos teléfonos con Windows en todas partes, excepto en los EE. UU.) Y, aparte de una pista intrigante sobre los servicios

Definición de comp.

¿Qué son los Comp? El término comps, abreviatura de comparable, tiene diferentes significados según la industria y el contexto, pero generalmente implica una comparación de parámetros financieros y otros factores para cuantificar el rendimiento o

Definición de bienes fungibles

¿Qué son los bienes fungibles? Las setas se refieren a valores u otros elementos que son equivalentes o constan de muchas partes idénticas, de modo que, a efectos prácticos, son intercambiables. Los elementos tangibles, valores

Definición de quiebra involuntaria

¿Qué es una quiebra involuntaria? La quiebra no intencional es un procedimiento legal por el cual los acreedores solicitan que una persona o una empresa quiebre. Los acreedores pueden solicitar la quiebra involuntaria si sienten

Cómo poner nombre a un álbum en Facebook

Navega a través de tus fotos Facebook ¿Habéis notado que hay muchos álbumes mal entendidos? ¿Te gustaría arreglarlo cambiándole el nombre, pero no sabes cómo hacerlo? No te preocupes, has venido al blog correcto en

Solución de problemas de rendimiento de microservicios

El uso de microservicios para crear aplicaciones puede mejorar significativamente la productividad del desarrollador, la agilidad del proyecto y … reutilización de código. Sin embargo, la arquitectura resultante es más compleja, lo que dificulta mucho

Descarga gratuita: 100 elementos florales de acuarela

Descarga gratuita: 100 elementos florales de acuarela Agregue un toque floral realmente delicado a cualquier proyecto en el que esté trabajando con este increíble conjunto de elementos de acuarela de Estudio Junik. ¡Perfecto para crear

Nokia N86 incluye una potente cámara digital

Hay una nueva adición a lista de los mejores teléfonos con cámara en el mercado: el Nokia N86. Lanzado esta semana, el teléfono inteligente de 5.2 onzas cuenta con una cámara de 8 megapíxeles, una

Windows 7: bloqueo de información

Microsoft mantiene un manto de silencio en torno a su próxima versión principal de Windows. El editor en jefe de ZDNet, Larry Dignan, habla con su colega bloguera Mary Jo Foley, editora de All About