miércoles, 30 de abril de 2008

Serie de webcasts sobre SQL Server 2008

Si estas subscrito a los boletines de Microsoft, habrás recibido un correo en el que te informan de una serie de webcasts gratuitos sobre el nuevo SQL Server 2008.

Solid Quality Mentors ha sido la elegida para realizar estos webcasts donde repasaremos todas las novedades tanto en el motor relacional, como en el ámbito de la inteligencia de negocio. Son sesiones altamente recomendables en las que vas a poder prepararte para la nueva oleada de aplicaciones de acceso a datos, viéndola desde el lado del servidor de base de datos. Aprenderás a cómo conseguir un rendimiento predecible del motor, a cómo realizar DataWarehouses de alto rendimiento, cómo diseñar aplicaciones de nueva generación, cómo administrar de forma eficiente grupos de servidores,...

Aqui teneis la agenda de los próximos webcasts:


Para más información, visita la web oficial sobre las jornadas pinchando aqui.

Por cierto, yo mismo voy a impartir los webcasts de "Declarative Management Framework", "Aplicaciones de Nueva Generación" y "Novedades para Desarrolladores".

NOTA: Rubén Garrigós ya realizó la semana pasada el webcast sobre novedades para DBA´s en SQL Server 2008. Puedes descargarte la documentación y el propio vídeo desde aquí

GUSENET: SQL Server 2008

El siguiente evento previsto para el grupo de usuarios GUSENET va a volver a estar dedicado a la plataforma de datos. Por un lado, yo mismo voy a dar una sesión sobre las novedades en SQL Server 2008 enfocadas a los administradores de bases de datos, mientras que Eladio Rincón va a hablar sobre la detección de problemas de rendimiento en SQL Server 2005.

Ambas sesiones son bastante recomendables, la primera porque con la profesión que hemos elegido viene intrínseca la necesidad de saber siempre cosas nuevas…y la segunda es todavía más recomendable puesto que nos mostrará un mundo nuevo dentro de SQL Server 2005 con el que aprenderemos a comunicarnos con el motor de BBDD y a decirle que nos hable sobre sus dolencias y como resolverlas ;)

Aquí os dejo la agenda del evento:

16:00 - 16:30  Bienvenida y registro

16:30 - 17:45  Novedades en SQL Server 2008 para administradores
                     (Enrique Catala)

17:45 - 18:15  Descanso

18:15 - 19:30  Detección de problemas de rendimiento en SQL Server 2005    
                     (Eladio Rincón)

Para más información: www.gusenet.com

Aquí os pongo el link de registro: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032378512&Culture=es-ES

Office Visio 2007 Professional SQL Server Add-in

Microsoft acaba de publicar un addin imprescindible para los DBA´s de SQL Server. Hoy me ha dado una alegria al ver lo facil que nos lo han puesto los chicos de Microsoft a los que nos dedicamos a esto de las bases de datos ;)

Con este addin, podemos generar facilmente y con la ayuda de un asistente, topologias complejas de SQL Server. Incluye incluso la posibilidad de plantear topologias con los nuevos SQL Server 2008 (todavia en CTP6) y Windows Server 2008 hyper-v (recientemente liberado)

En la zona de descarga (link) podemos tanto instalarnos el addin, como descargarnos un documento donde nos explica paso a paso como utilizarlo.

Tan solo os dejo dos imágenes para abrir boca

Untitled

y una muestra de informe resultado

Untitled

Visual Studio 2008 Express Editions ya disponibles

Microsoft ha hecho por fin oficial el lanzamiento de las versiones express de Visual Studio 2008, incluido en castellano. Nos dan la posibilidad de realizar instalacion web, offline, bajarnos el conjunto completo (incluido SQL Server 2005 express), versión de MSDN Express, documentación variada...

Sin duda una buena noticia para todos aquellos que quieren iniciarse con Visual Studio 2008 y no sabian por donde empezar ;)

https://www.microsoft.com/express/

Untitled

martes, 29 de abril de 2008

Convertir valores hexadecimales a uniqueidentifier

Es un problema poco frecuente, pero sí posible (mas adelante explicaré un caso real), que necesitemos convertir un valor hexadecimal a su representación uniqueidentifier.

Pongamos por caso, que disponemos del siguiente valor hexadecimal: 0xAF410B348743A84395FA5F37A3C32C8A. Si queremos obtener su representación uniqueidentifier, lo que tenemos que hacer es un simple cast de esta forma:

select convert(uniqueidentifier,0xAF410B348743A84395FA5F37A3C32C8A)

El valor uniqueidentifier que lo representa, dado al resolver la consulta, es el siguiente: 340B41AF-4387-43A8-95FA-5F37A3C32C8A

Como vemos, no hay problema alguno en realizar la conversión...salvo que el valor que estamos convirtiendo es un valor hexadecimal que puede que no tengamos almacenado en formato binario, sino como cadena de texto. Si el valor hexadecimal lo tenemos almacenado en una variable de tipo varchar, ya no es tan sencillo hacer la conversión:

Ejecutar la sentencia

select convert(uniqueidentifier,'0xAF410B348743A84395FA5F37A3C32C8A')

Nos lanzará este fantástico error:

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

Podemos pensar (como es lógico), que lo suyo es convertir el valor primero a un tipo de datos binario (varbinary), y de este ya a su representación uniqueidentifier con el cast correpondiente.

Si lanzamos entonces la sentencia:

select convert(varbinary,'0xAF410B348743A84395FA5F37A3C32C8A')

Nos damos cuenta que el resultado no se parece en nada al valor que teníamos, y por tanto la conversión de este a uniqueidentifier no será válida:

select convert(uniqueidentifier,convert(varbinary,'0xAF410B348743A84395FA5F37A3C32C8A'))

Su resultado es 46417830-3134-4230-3334-383734334138, que no se parece ni de casualidad al valor correcto 340B41AF-4387-43A8-95FA-5F37A3C32C8A.

El proceso pues, requiere que transformemos "a manita" el valor hexadecimal almacenado en la cadena de texto, a su representación varbinary.

Para ello lo que debemos hacer es crearnos una función para tal fin, como puede ser esta:

 
ALTER FUNCTION [dbo].[HexStrToVarBin](@hexstr varchar(8000))
RETURNS varbinary(8000)
AS
BEGIN
DECLARE @hex char(2), @i int, @count int, @b varbinary(8000)
SET @count = LEN(@hexstr)
SET @b = CAST('' as varbinary(1))
IF SUBSTRING(@hexstr, 1, 2) = '0x'
SET @i = 3
ELSE
SET @i = 1
WHILE (@i <= @count)
BEGIN
SET @hex = SUBSTRING(@hexstr, @i, 2)
SET @b = @b +
CAST(CASE WHEN SUBSTRING(@hex, 1, 1) LIKE '[0-9]'
THEN CAST(SUBSTRING(@hex, 1, 1) as int)
ELSE CAST(ASCII(UPPER(SUBSTRING(@hex, 1, 1)))-55 as int)
END * 16 +
CASE WHEN SUBSTRING(@hex, 2, 1) LIKE '[0-9]'
THEN CAST(SUBSTRING(@hex, 2, 1) as int)
ELSE CAST(ASCII(UPPER(SUBSTRING(@hex, 2, 1)))-55 as int)
END as binary(1))
SET @i = @i + 2
END
RETURN @b
END


Una vez teniendo la función, ya podremos realizar la conversión tranquilamente:

select convert(uniqueidentifier,dbo.HexStrToVarBin '0xAF410B348743A84395FA5F37A3C32C8A'))

Por otro lado, el proceso contrario, es decir, convertir de varbinary a valor hexadecimal como cadena de texto lo podemos hacer con la función no documentada fn_varbintohexstr() que espera como argumento de entrada un valor hexadecimal (varbinary) y devuelve su misma representación, pero como cadena de texto.


SELECT master.dbo.fn_varbintohexstr(0xAF410B348743A84395FA5F37A3C32C8A)

El caso real del que os hablaba al principio es el de que querais realizar un join de la información proveniente de sysprocesses con tablas de información de jobs como por ejemplo sysjobs. En ese caso no tendreis mas remedio que realizar estas conversiones dado que en sysprocesses los identificadores de los jobs se encuentran en valor hexadecimal, mientras que los identificadores de las tablas de sysjobs (y sucesivas) se encuentran como uniqueidentifier.

domingo, 27 de abril de 2008

Seminario "Maximice el potencial de su servidor SQL Server"

Los pasados dias 23 y 24 de Abril, realizamos dos seminarios en las oficinas de Microsoft Barcelona y Microsoft Ibérica en Madrid en la que hablábamos de las características que podemos aprovechar para exprimir a tope nuestro motor de base de datos preferido...SQL Server ;)

Nos centramos principalmente en características avanzadas como vistas indexadas, mirroring asíncrono + instantaneas de bases de datos, las ventajas de la indexación con columnas incluidas, particionado de datos y escalabilidad y rendimiento en inteligencia de negocio.

Las presentaciones las hemos subido a esta web para que los asistentes puedan disponer de ellos tal y como se anunció:

lunes, 14 de abril de 2008

Liberar el espacio ocupado por la instalacion del SP1 de Windows vista

Seguro que una vez has instalado el SP1 de Windows Vista decides ya no volverlo a desinstalar. Puesto que este va a ser el caso, te recomiendo que lances el ejecutable vsp1cln.exe.

vistacleanup

Una vez lanzado, se habran liberado mas de 1.5Gb de archivos de desinstalación del service pack, ahorrándote espacio valioso de tu disco duro.

Entre otras cosas, notarás que si usas un portatil se ha deshabilitado la opción de hibernar. Para poder volver a tener la opción activa has de hacer dos cosas:

  1. Abrir un cmd.exe como administrador y teclear "powercfg -h on"
  2. Desactivar la suspensión hibrida: Opciones de energia->cambiar configuracion delplan->cambiar config avanzada

Dicho esto, volverás a disponer de tu valioso botoncito de "hibernar".

miércoles, 9 de abril de 2008

Trabajar con SQL Server 2008 desde Visual Studio 2008

Por defecto, si intentamos crear una conexión desde Visual Studio 2008 hacia SQL Server 2008, nos da un error avisándonos de que "La versión del servidor no es compatible. Se admiten sólo servidores hasta Microsoft SQL Server 2005".

Microsoft ha publicado el siguiente parche CTP para que podamos probar las características nuevas de SQL Server 2008 desde Visual Studio 2008 con sus drivers nativos. En ese caso lo que tendreis que hacer es bajaros el siguiente parche: http://support.microsoft.com/kb/945855

NOTA: Para poder conectar desde Visual Studio 2005 tambien existe un parche CTP para probar: http://www.microsoft.com/downloads/details.aspx?FamilyID=e1109aef-1aa2-408d-aa0f-9df094f993bf&displaylang=en

martes, 8 de abril de 2008

Novedades en SQL Server 2008

Hola a todos, solo comentaros que vamos a dar un compañero de Solid Quality Learning y yo dos presentaciones en el grupo de usuarios de .net GUSENET.

La agenda es la siguiente:

16:00 - 16:30 Bienvenida y registro
16:30 - 17:45 LINQ to SQL avanzado (Ruben Garrigos)
17:45 - 18:15 Descanso
18:15 - 19:45 Novedades SQL Server 2008 (Enrique Catala)

La ubicación del mismo: Aula 1.01 de la Facultad de Informatica del Campus de Espinardo de la Universidad de Murcia.

Para registraros en el evento, lo podeis hacer a traves del siguiente enlace: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032375941&Culture=es-ES 

Para mas información, dirigiros a la web del grupo de usuarios: www.gusenet.com donde encontrareis toda la información al respecto.

[DSL] Agregar un menú personalizado en VS2008

La forma en la que se añade un menú personalizado ha variado en la nueva versión de Visual Studio 2008. El SDK de extensibilidad de Visual Studio 2008 ha variado la forma en la que se generan menús y comandos de forma que ya no se utilizan los “antiguos” ficheros de configuración .ctc.

Como pequeña introducción, os digo que en la nueva versión se ha optado por un nuevo sistema de configuración más acorde a los tiempos que corren basado en XML. Dicho sistema de configuración está completa y exquisitamente explicado en el siguiente enlace (no apto para lectura al final del dia;).

Dicho esto, os aviso de antemano que la documentación que viene con la propia descarga del ejecutable SDK Extensibility 1.0 para Visual Studio 2008 es errónea y hace referencia al antiguo sistema de configuración (por lo menos en lo que nos atañe que son los menús en DSL). El antiguo sistema de agregación de menús personalizados en nuestros lenguajes de dominio está explicado bastante bien en el blog de “El Bruno” o en la propia documentación que viene con el descargable de extensibilidad que he mencionado.

Vamos a ponernos manos a la obra. Para ello parto de que tienes ya tu proyecto de lenguaje de especificación de dominio creado…

image

Tal cual está, podemos crear nuestro menú de una forma bastante más sencilla que antes siguiendo los siguientes pasos:

1. En el “Solution Explorer”, desplegar el proyecto DslPackage y editar el archivo Commands.vsct

image

En dicho archivo es donde vamos a tener que añadir los elementos del menú que queremos. En nuestro caso vamos a crearnos un botoncito que nos diga la figura que hemos clickeado.

La forma de crear nodos dentro del archivo está “explicada” muy por encima en los documentos de ayuda de mdsn (por lo menos ahora cuando escribo este post) por lo que seguramente acabarás antes viéndolo desde aquí ;)

Básicamente lo que vamos a hacer es definirnos un botón y una identificación del mismo. Importante a tener en cuenta son los nodos <Commands/> y <Symbols/> (no quiero liaros con el nodo <Extern/> que no vamos a tocar ahora)

2. Dentro del nodo <Commands/> introducir un nodo con la descripción del botón que quereis crear

<Buttons>
<Button guid="cmdDimeNombreFiguraGUID" id="cmdDimeNombreFiguraID type="Button">
<Parent guid="guidCmdSet" id="grpidContextMain"/>
<Strings>
<CanonicalName>cmdDimeNombreFigura</CanonicalName>
<ButtonText>Nombre figura</ButtonText>
<ToolTipText>Dice el nombre de la figura seleccionadaToolTipText>
</Strings>
</Button>
</Buttons>

3. Fuera del nodo <Commands/> y al mismo nivel que él, declaramos el nodo <Symbols/> de la siguiente forma

<Symbols>
<GuidSymbol name="cmdDimeNombreFiguraGUID" value="{D5A40ECA-BA87-4a92-B6A7-A36C27C858AE}">
<IDSymbol name="cmdDimeNombreFiguraID" value="1"/>
</GuidSymbol>
</Symbols>

El valor del GuidSymbol ha sido generado mediante la aplicación guidgen.exe
El valor del IDSymbol puede ser decimal o hexadecimal (por ejemplo, valores 0x104 pueden darse) y podemos darle el que queramos.

4. Estado del fichero Commands.vsct

Una vez realizado esto, el fichero queda de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable xmlns:xs="http://www.w3.org/2001/XMLSchema>
<!-- -->
<!-- This file contains custom command definitions. -->
<!-- -->
<!-- NOTE: Each time commands are added or changed, the "version" parameter to the -->
<!-- ProvideMenuResource attribute in Shell\Package.tt should be incremented. -->
<!-- This causes Visual Studio to re-merge the menu definitions for the package. -->
<!-- Otherwise, changes won't take effect until the next time devenv /setup is run. -->
<!-- -->
<Extern href="stdidcmd.h"/>
<Extern href="vsshlids.h"/>
<Extern href="msobtnid.h"/>
<Extern href="virtkeys.h"/>
<Extern href="DSLToolsCmdID.h"/>
<Include href="GeneratedCode\GeneratedVsct.vsct"/>
<Commands package="guidPkg">
<Buttons>
<Button guid="cmdDimeNombreFiguraGUID" id="cmdDimeNombreFiguraID" type="Button">
<Parent guid="guidCmdSet" id="grpidContextMain"/>
<Strings>
<CanonicalName>cmdDimeNombreFigura</CanonicalName>
<ButtonText>Nombre figura</ButtonText>
<ToolTipText>Dice el nombre de la figura seleccionada</ToolTipText>
</Strings>
</Button>
</Buttons>
</Commands>
<Symbols>
<GuidSymbol name="cmdDimeNombreFiguraGUID" value="{D5A40ECA-BA87-4a92-B6A7-A36C27C858AE}">
<IDSymbol name="cmdDimeNombreFiguraID" value="1"/>
</GuidSymbol>
</Symbols>
</CommandTable>

5. Ahora, siguiendo lo que dice en los comentarios del propio fichero a la parte de arriba, le incrementamos el nº de versión al atributo ProvideMenuResource del fichero “GeneratedCode/Package.tt” (notese que en el comentario referencia a Shell/Package.tt ;)

image

Para ello, lo editamos y reemplazamos lo que viene por defecto ( [VSShell::ProvideMenuResource("1000.ctmenu", 1)] ) , por [VSShell::ProvideMenuResource("1000.ctmenu", 2)]

6. Ahora, vamos a asignarle el comportamiento al botón. Para ello hemos de abrir el fichero GeneratedCode/CommandSet.cs

image

Y le añadimos los métodos OnPopUpMenuClick(), OnPopUpMenuDisplayAction() y GetMenuComands() a la clase.

Evidentemente lo que no vamos a hacer es escribir el código directamente sobre el fichero CommandSet.cs puesto que dicho fichero se machaca cuando le damos a “Transform All Templates” por lo que haciendo uso de las posibilidades de definición de clases parciales, le definiremos el código en un nuevo fichero.

7. Creamos la carpeta Customization y luego añadimos una nueva clase, que será la que contenga el código, de forma que nos quedará como la figura siguiente:

image

NOTA: En mi caso, mi lenguaje se llama LenguajeOOMM y por eso la clase generada en CommandSet.cs se llama así. Por seguir una nomenclatura estándar he creado dicho nombre al fichero. En cualquier caso, el contenido siempre ha de ser el de la definición de la clase doblemente derivada.

Antes hacíamos referencia al fichero CommandSet.cs. Por poco que lo abramos y le demos un vistazo veremos que sigue la pauta de clase doblemente derivada (que se sale del tema del post pero que en futuros post trataré) que crea una clase heredada de DslShell::CommandSet (en mi caso llamada LenguajeOOMMCommandSetBase), y luego otra clase que hereda de la anterior y es a la que vamos a añadirle la funcionalidad citada en el paso 6.

8. Introducimos el siguiente código dentro de LenguajeOOMMCommandSet.cs (en tu caso, el fichero .cs que has creado para tal fin)

using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using Microsoft.VisualStudio.Modeling.Shell;
using System.Collections;
using System.Text;

namespace LenguajeOOMM
{
/// <summary>
/// Double-derived class to allow easier code customization.
/// </summary>
internal partial class LenguajeOOMMCommandSet : LenguajeOOMMCommandSetBase
{
protected override IList<System.ComponentModel.Design.MenuCommand> GetMenuCommands()
{
IList<System.ComponentModel.Design.MenuCommand> commands = base.GetMenuCommands();

DynamicStatusMenuCommand cmdDimeNombreFigura =
new DynamicStatusMenuCommand(
new EventHandler(OnPopUpMenuDisplayAction),
new EventHandler(OnPopUpMenuClick),
new CommandID(new Guid(“D5A40ECA-BA87-4a92-B6A7-A36C27C858AE”), 1));

commands.Add(cmdDimeNombreFigura);

return commands;
}

/// <summary>
/// Lo que se desencadena al pinchar sobre el boton.
/// En principio no queremos nada mas que se muestren los objetos seleccioonados
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal void OnPopUpMenuClick(object sender, EventArgs e)
{
MenuCommand command = sender as MenuCommand;

StringBuilder sb = new StringBuilder();
foreach (object selectedObject in this.CurrentSelection)
{
sb.AppendLine("Objetos Seleccionados: " + selectedObject.ToString());
}

System.Windows.Forms.MessageBox.Show(sb.ToString());
}

/// <summary>
/// Se desencadena cuando vamos a mostrar el menú.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
internal void OnPopUpMenuDisplayAction(object sender, EventArgs e)
{
MenuCommand command = sender as MenuCommand;

foreach (object selectedObject in this.CurrentSelection)
{
// Solo se desencadena si entre todos los objetos seleccionados, hay algun ExampleShape
//para conectores por tanto no sale. Comportamiento a posta
if (selectedObject is ExampleShape)
{
command.Visible = true;
command.Enabled = true;
return;
}
}
//por defecto deshabilitado
command.Visible = false;
command.Enabled = false;
}
}
}

9. Una vez llegados a este punto solo nos queda pinchar sobre “Transforma ll templates” y compilar.
Ahora nos saldrá el elemento del menú en cuestión y al clickear nos saldrá un MessageBox con la información que queríamos.

image

image

Ni que decir tiene las posibilidades de esto. Podemos crearnos un menú que interactúe con nuestro propio modelo de forma que podamos cambiar incluso el aspecto o propiedades de nuestros objetos para que sin tener que borrar figuras, las podamos modificar