La instrucción Select…Case en Visual Basic

La instrucción Select…Case de Visual Basic tiene un funcionamiento similar al Switch…Case de C: nos permite evaluar el valor de una variable y ejecutar un determinado código según su valor, sin tener que acabar recurriendo a un enorme árbol de estructuras if/else anidadas. La variable se evaluará contra una serie de expresiones por orden descendente, parando en cuanto una de las evaluaciones sea verdadera.

Su sintaxis sería la siguiente:

SELECT mivariable
  CASE expresión1
   'código
  CASE expresión2
    'otro código
  CASE ELSE
    'Código por defecto
END SELECT

La variable mivariable del ejemplo sería la que vamos a evaluar. Puede ser una variable de los siguientes tipos: Boolean, Byte, Char, Date, Double, Decimal, Integer, Long, Object, SByte, Short, Single, String, UInteger, ULong, y UShort.

Tanto expresión1, como expresión2 y demás expresiones que queramos usar será valores o conjuntos de valores numéricos o de texto contra los que se evaluará mivariable. Puede responder a tres formas: un valor solo, una comparación con la sintaxis IS seguido de un operador de comparación (mayor, menor, igual, distinto) o un conjunto de valores, que puede mostrarse de dos formas: un grupo de valores separados por comas o un rango del que daremos el valor inicial y el final unidos por un TO.

Finalmente tenemos el CASE ELSE, esto es opcional y es un código que se ejecutará si el valor de mivariable no ha dado true en ninguna de sus evaluaciones.

Veamos una serie de ejemplos. Primero, veamos un código que asigna un valor de color de fondo a un grupo de usuarios:

SELECT Grupo
  CASE "Dirección"
    colorfondo="verde"
  CASE "Producción"
    colorfondo="gris"
  CASE ELSE
    colorfondo="rojo"
END SELECT

Segundo ejemplo, un código que asigna un grupo poblacional según la edad, evaluando por rangos:

SELECT Edad
  CASE 0 to 14
    grupo="Infantil"
  CASE 15 to 20
    grupo="juvenil"
  CASE 20 to 70
    grupo="adulto"
  CASE ELSE
    grupo="anciano"
END SELECT

Tercer ejemplo, en este caso con grupos de valores por comas. Evaluamos el último número de un código y marcamos si es par o impar (sí, ya se que es más fácil hacerlo con una operación de módulo, pero esto es un simple ejemplo teórico):

SELECT Numero
  CASE 1,3,5,7,9
    impar=True 
  CASE ELSE
    impar=False
END SELECT

Y vamos a cerrar con el cuarto ejemplo, usando una expresión aritmética para la evaluación, en este caso para los pesos de una competición de lucha:

SELECT Peso
  CASE IS < 48
    categoria="minimosca" 
  CASE IS < 51
    categoria="mosca" 
  CASE IS < 54
    categoria="gallo" 
  CASE IS < 57
    categoria="pluma" 
  CASE IS < 60
    categoria="ligero"
  CASE IS < 64
    categoria="superligero" 
  CASE IS < 69
    categoria="wélter" 
  CASE IS < 75
    categoria="mediano" 
  CASE IS < 81
    categoria="semipesado" 
  CASE IS = 91
    categoria="superpesado" 
END SELECT

Eliminar un archivo en Visual Basic .NET

Vamos con un ejemplo de código rápido sobre cómo borrar un archivo usando VB.NET:

Dim ArchivoBorrar As String

ArchivoBorrar = "C:\inetpub\wwwroot\descargas\archivo.doc"

'comprobamos que el archivo existe
If System.IO.File.Exists( ArchivoBorrar ) = True Then
  System.IO.File.Delete( ArchivoBorrar )
End If

Ojito al trabajar con esto que igual os cargáis lo que no debéis.

Usando librerías .dll de .NET en SQL-Server2008

Aunque normalmente no se recomiende tener la lógica de negocio en el lado del servidor de la base de datos, en algunos casos puede resultar interesante el hacerlo. Microsoft, en su empeño (por otra parte loable) de lograr una integración total entre sus servicios, nos permite utilizar nuestras .dll creadas en .NET (sea en VB.NET o en C#.NET o en C++) dentro de nuestra base de datos SQL-Server como “código gestionado”.

Iré construyendo poco a poco un ejemplo para que veáis, paso a paso como se realiza esto. Lo primero es activar clr para que nos permita la integración con .NET tal que así:

USE [basedatosdeejemplo]
go
sp_configure 'clr enabled', 1
go
reconfigure
go

Seleccionamos la base de datos a utilizar, configuramos clr como ‘enabled’ (armado, activado) con el parámetro 1 y ejecutamos reconfigure para que el cambio tenga efecto. Acuérdate de poner el parámetro (en este caso 1) y de ejecutar reconfigure.

El primer paso está realizado. Lo siguiente es crear el ensamblado para la librería, definiendo el esquema y el tipo de permisos.


CREATE ASSEMBLY [Utilidades]
AUTHORIZATION [dbo]
FROM 'C:\LibreriaEjemplo.dll'
WITH PERMISSION_SET = SAFE
GO

Creamos el ensamblado con el nombre “Utilidades” (podemos darle el que queramos mientras no sea una palabra reservada), con el esquema dbo (podríamos haber utilizado cualquiera de los disponibles), en FROM le especificamos la dirección del archivo en disco mediante una cadena de texto con la ruta y finalmente los permisos, en este caso SAFE.

SAFE es el permiso más restrictivo que hay, el más “seguro” para nuestro equipo pues limita mucho lo que pueda hacer la librería. En caso de que uses liberías de terceros es el permiso que te reportará más seguridad. Existe también el permiso EXTERNAL_ACCESS, que permite que el código acceda a ciertos recursos externos (registro, archivos, red) y el permiso UNSAFE, que da control sin restricciones a la librería sobre los recursos de la máquina. Si usas una librería propia puedes usar UNSAFE, pero si usas una de un tercero piensa que pueden entrañar riesgos de seguridad.

Con lo puesto ya tenemos la librería disponible en nuestra base datos. ¿Y ahora qué? Ahora simplemente puedes usar las clases y métodos de dicha librería en tu base. Puedes crear tus tipos de datos propios usando sus objetos, incluir sus métodos en procedimientos o triggers. En este ejemplo vamos a suponer que la librería importada tiene una clase Point que guarda las coordenadas de un eje X y un eje Y junto a un valor booleano, y tiene también una función GetCoordsAsText que muestra un mensaje largo con las coordendas. Vamos a crear un tipo de datos Point, usarlo en una tabla, acceder a los valores y usar el método GetCoordsAsText en una función. Pondré comentarios para ir explicando el proceso

--Creamos el tipo de datos Point como un objeto de la clase Point.
--Para acceder a la clase point tenemos que usar el método external name de SQL-Server
--accediendo a la clase mediante el nombre del assembly que creamos antes y el namespace de la clase (en 
--este caso point)
create type Point
external name Utilidades.Point 
go

--Creamos la tabla

create table dbo.Points
(
	id int identity primary key,
	valor Point
);
go

--Para acceder a los datos de la tabla debemos usar un método que nos devuelva
--los valores almacenados dentro del objeto en forma de texto (en este caso .X para el valor X, .Y para 
--el valor Y o .ToString() para sacar ambos en una columna como texto).

select id,
			valor.X as X,
			valor.Y as Y,
			valor.ToString() as Completo
from dbo.Points

--Si intentáramos acceder al objeto a pelo, como voy a poner debajo, nos devolvería el valor del objeto
--sin convertir (un churrazo con la dirección de memoria del puntero)

select valor from dbo.Points --así nos saldría un churo tipo 0x0000000100020000303000000

--También podríamos usar los métodos de la librería en una función, trigger, función de agregado,
--cursor... En este caso haremos una función que acceda a GetCoordsAsText (que está en la clase 
--UserFunctions)

create function dbo.CoordenadasComoTexto
returns nvarchar(50)
as
    external name Utilidades.UserFunctions.GetCoordsAsText

Y con esto tendríais la función que simplemente ejecuta el método definido en la dll y un tipo de datos igual al objeto. Las posibilidades de esto son muy grandes, así que podéis ir profundizando.