viernes, 24 de agosto de 2007

Existe un campo en una tabla

Bueno visitando las news de microsoft.public.es.sqlserver he visto que alguien preguntaba cómo saber si en una tabla existe un determinado campo, para en caso de no existir, añadirlo. Así que me he decidido a responderle y de paso postearlo aquí por si le sirve a alguien más.

IF NOT Exists(SELECT * FROM syscolumns AS sc INNER JOIN sysobjects AS so ON
sc.id=so.id AND
sc.name='NombreCampoNuevo' AND
so.name='NombreTabla')

Aquí pondríais la instrucción ALTER TABLE

GO

domingo, 19 de agosto de 2007

Integración CLR

Para poder usar esta nueva característica de SQL Server 2005 primero debemos habilitarla, para ello tenemos 2 opciones:
1.- Desde la Configuración del área de superficie para características. Desplegamos el nodo Motor de Base de datos, seleccionamos la opción Integración CLR marcando o desmarcando la casilla para habilitar o deshabilitar la característica.
2.- O bien mediante una sentencia T-SQL. Para poder ejecutar con éxito esta sentencia debemos tener permisos de sysadmin y serveradmin. La consulta es esta:
sp_configure ‘clr enabled’, 1
GO
RECONFIGURE
GO
Para deshabilitar la opción sustituiremos el 1 por un 0 (‘clr enabled’, 0)

Una vez ya tenemos activada esta opción pasamos a ver las posibilidades que nos brinda.

1.- Crearemos un nuevo proyecto de tipo Base de datos


2.- Una vez creado añadiremos un elemento nuevo, en este caso vamos a añadir una función definida por el usuario y la llamaremos clrDiaSemana



3.- Agregamos funcionalidad a nuestra función:



La función es muy sencilla y en SQL Server ya existe una función para devolver el día de la semana según una fecha dada (DATEPART, ver los BOL para su uso).

Una vez hecho esto tenemos que compilar el proyecto y una vez compilado lo implementamos (deploy), en SQL Server 2005 que es el servidor que acogerá el código .Net (en forma de ensamblado, en este caso de dll) y lo ejecutará en su interior.
Para comprobar que tenemos el ensamblado .Net que acabamos de implementar en SQL Server 2005, abriremos Sql Management Studio y desplegaremos la subcarpeta Ensamblados de la carpeta Programación de la base de datos que especificamos como conexión.


En la imagen podéis ver la manera de invocar a la función pasándole un parámetro, siempre que queramos hacer uso de la función debemos especificar a que esquema pertenece la función.

Enviar mails desde nuestra aplicación

Esta es una manera sencilla de implementar el envío de correo electrónico desde nuestra aplicación (la aplicación de ejemplo consta sólo de un formulario con un botón).
También podríamos crear un sistema de mailing masivo, implementando un bucle que recorra los destinatarios, de esta manera podríamos enviar noticias a nuestros clientes acerca de nuevos productos en nuestra empresa, sin tener que depender de productos de terceras personas.

Imports System.Net
Imports System.Net.Mail
Public Class Inicio
Private Sub Enviar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Enviar.Click
Try
Dim mensaje As New MailMessage()
Dim cliente As SmtpClient = New SmtpClient("smtp.loquesea.com")
Dim cuerpo As String = "Esto es una prueba de mailing usando Visual Studio 2008, desde un formulario sencillo"

'TODO: Podemos implementar un bucle que procese los registros con emails (podemos obtenerlos de una BD por ejemplo)
With mensaje
.From = New System.Net.Mail.MailAddress("francisco@nospam.com")
'Iremos añadiendo los distintos destinatarios de los mensajes
.To.Add("irma@nospam.com")
.Subject = "Pruebas"
.Body = cuerpo
End With

cliente.Credentials = New System.Net.NetworkCredential("francisco@nospam.com", "1234")
'Añadimos las credenciales
cliente.Credentials = CredentialCache.DefaultNetworkCredentials
cliente.Send(mensaje)
MsgBox("Mensaje enviado con éxito")

'TODO: En esta parte podríamos controlar los distintos tipos de excepciones que se pueden presentar, fallo al enviar,
'correo lleno, ... para ello usaríamos en lugar de exception SmtpFailedRecipientsException y con una variable de tipo
'SmtpStatusCode podríamos recuperar el estado y asignar un mensaje más entendible para el usuario.
Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub
End Class