25 may 2009

Cómo pasar variables a un DTSX

Recientemente he tenido que "agarrarme" (como decimos en Tiquicia) con los Dtsx (la evolución de los tan útiles Dts de Sql Server 2000 ahora enmarcado en los paquetes SSIS de Sql Server 2005).

La cuestión es que ya cargado dentro de un componente .Net necesitaba pesarle el valor de unas variables que había declarado dentro del Dtsx como si de parámetros se tratasen. Cumplí este cometido de la siguiente manera:

Se requiere el siguiente using para trabajar con Dtsx:
using Microsoft.SqlServer.Dts.Runtime;

y luego el siguiente código como parte del método correspondiente:
Package myPackage;
Application integrationServices = new Application();
string packagePath= System.Configuration.ConfigurationManager.AppSettings["DTSXPATH"];
myPackage = integrationServices.LoadPackage(packagePath, null);

Variables vars = null;
myPackage.VariableDispenser.LockForWrite("variable1");
myPackage.VariableDispenser.LockForWrite("variable2");
myPackage.VariableDispenser.GetVariables(ref vars);
try
{
    foreach (Variable v in vars)
    {
        switch (v.Name)
        {
            case "variable1":
                v.Value = "lo que quiera pasar para la variable1";
                break;
            case "variable2":
                v.Value = "lo que quiera pasar para la variable2";
                break;
        }

    }
}
catch (Exception ex)
{
    throw ex;
}
finally
{
    vars.Unlock();
}
DTSExecResult local_DTSExecResult = myPackage.Execute();
if (local_DTSExecResult == Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure)
{
    foreach (DtsError local_DtsError in myPackage.Errors)
    {                
        throw new Exception(local_DtsError.Description);
    }
}

Variable1 y Variable2 son variables globales a nivel del dtsx las cuales por medio del VariableDispenser son accesibles tanto de escritura como en este caso o de lectura si se requierese. Siempre hay que hacer un Unlock de las variables antes de ejecutar el paquete .

Otra cosa interesante es la detección de errores de DTSX dentro de ambiente .Net, Éstos se almacenan en la colección Errors del paquete. En este caso se dispara una excepción cuya descripción es la del primer error en dicha colección pero se puede hacer de forma más elaborada almacenando toda la colección de errores usando la instrumentación para ello, por ejemplo.

15 may 2009

chr() en C#

En algunas ocasiones las viejas funciones las echamos de menos cuando intentamos hacer algo similar en los nuevos lenguajes. En esta ocasión particular necesito utilizar el chr() de visual basic pero en C#. El chr lo que hace es que devuelve el caracter equivalente al código ascii que le pasemos por parámetro
La función en C# equivalente vendría siendo Convert.ToChar() de manera que si que quiere concatenar un salto de línea a un texto, por ejemplo, sería así:
variable_texto + Convert.ToChar(10)
Algunos códigos ASCII útiles para tener a mano
10 = Saldo de linea
13 = Retorno de carro
32 = Espacio
34 = Comillas dobles
39 = Comilla simple
o podemos consultar http://www.ascii.cl/es/
La función inversa del chr() en VB es asc() en la cual le pasamos un caracter y nos devuelve el código ascii correspondiente. En C# podría reemplazarse por Convert.ToInt32() pasando por parámetro en carater a evaluar.
Por ejemplo:
char c = '"';
Console.Write(Convert.ToInt32(c));
Esto nos devuelve 34 que es el código ascii de la comillas dobles. Sin embargo hay caracteres cuyo código ascii no se puede determinar de esta manera y requiere una forma mas elaborada. Quizás en un próximo post deje una función que emule el asc, de momento me ha funcionado bien Convert.ToInt32().
Como nota adicional en T-SQL la función CHAR() es la equivalente a chr() y ASCII() a asc().

11 may 2009

Cerrar Ventanas

En una página se abren varias ventanas popups para recabar información variopinta, pero deseo que si me salgo de la pantalla que abre esas ventanas, éstas no queden desperdigadas, si no que también se cierren.

Hago en javascript lo siguiente:


var VentanaIndex = 0;
var VentanasHijas = Array();
function cerrarVentanas()
{
if (VentanasHijas.length > 0)
{
for (var n=0; VentanasHijas.length; n++)
{
VentanasHijas[n].close();
}
}
}

function AbrirVentana(sURL, sName, sFeatures, bReplace)
{
VentanasHijas[VentanaIndex] = window.open(sURL, sName, sFeatures, bReplace);
VentanaIndex++;
return VentanasHijas[VentanaIndex];
}


En el html, el encabezado del body colocamos lo siguiente:


body onunload="cerrarVentanas();"


Cada vez que necesitemos abrir una ventana lo hacemos por medio de la función AbrirVentana así incrementamos el arreglo de ventanas que después cerramos si aun están abiertas a la hora de cerrar la pagina padre.

No necesitamos decrementar la variable VentanaIndex cuando cerramos los popups pues javascript no da error si la ventana a cerrar ya no existe.

5 may 2009

Windows 7

Ya esta disponible la version candidata para producto final (Release Candidate, RC) del nuevo Windows 7. Esta version es una mejora mucho más estable y depurada que la anteriormente liberada versión beta.

Al respecto de Windows 7, una de las cosas que más me llama la atención es la virtualización "completa" de XP (o en teoría de cualquier sistema operativo). Según el artculo de Coding Horror Has The Virtualization Future Arrived? las aplicaciones nativas de XP se ejecutaría en una especie de maquina virtual pero siempre dentro del contexto de Windows 7 osea sin necesidad explícitamente de levantar,por ejemplo, virtual PC. Para el usuario seria transparente, como ejecutar cualquier otra aplicación.

Esto no es nuevo, ni mucho menos. Hace tiempo que ya lo viene haciendo Apple en sus OS X, pareciera que una vez más Microsoft busca en sus competidores tecnologías con las cuales "sorprender" a sus usuarios. Esperemos, si embargo, que esta vez la implementación sea la correcta, ya que desde ahora muchos se preguntan por cuestiones como el desempeño, o la implementación de drivers de video adecuados dentro de la virtualización, para el uso en los videojuegos por ejemplo.

En todo caso aqui tiene el link para comenzar a descargar el Windows 7 RC y veremos si con este nuevo wndows ya pasan la página del tristemente célebre Vista cuyo destino parece ser pasar con mucha más pena que gloria por la páginas (y las pc´s) de la historia de la informática.