lunes, 25 de mayo de 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.

0 comentarios: