Creando paquetes de SSIS con .NET – Agregando elementos básicos

Se pueden crear paquetes de SQL Server Integration Services (SSIS) programáticamente con .NET, haciendo uso de las librerías que incluye SQL Server 2008. En este post se explica cómo crear los paquetes y agregar los elementos básicos.

Serie Creando paquetes de SSIS con .NET

SQL Server Integration Services (SSIS) es un componente presente a partir de SQL Server 2005 como evolución de los DTS. Éstos nos permiten manejar la integración de datos basados en flujos de trabajos. Actualmente, para la versión de SQL Server 2008 (R2), los SSIS se desarrollan usando un IDE llamado SQL Server Business Intelligence Development Studio, el cual es una versión de Visual Studio 2008 con las plantillas y componentes necesarios para crear visualmente este tipo de paquetes (los DTSX).

Cuando instalamos SQL Server 2008 podemos tener acceso a una serie de librerias que nos permitirán tener acceso a funcionalidades de SQL Server vía programación con .NET, funcionalidades que van desde objetos para la administración de servidor hasta el desarrollo programáticamente de objetos y paquetes de base de datos como lo son los DTSX resultantes de SQL Server Integration Services.

A efectos de esta serie de artículos, estaré comentado cómo crear vía programación paquetes de Integration Services usando el .NET Framework 4 y C# como lenguaje de programación.

Agregando referencias

Lo primero que debemos hacer es crear un proyecto en Visual Studio, del tipo que nos convenga y agregar las referencias de las librerías de SQL Server que utilizaremos para tener acceso a las funciones de creación de paquetes. Las librerías a agregar son (con su respectiva ruta donde se encuentran [varía según la instalación]):

  • C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.DTSRuntimeWrap.dll
  • C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.DTSPipelineWrap.dll
  • C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll

Creando el paquete

Para generar el paquete y guardarlo utilizaremos el siguiente código inicial:

using System;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using RuntimeWrapper = Microsoft.SqlServer.Dts.Runtime.Wrapper;

namespace ETLGenDEMO
{
    class Program
    {
        static void Main(string[] args)
        {
            Package pkg = new Package();
            pkg.Name = "NombrePaquete";

            //Acá toda la lógica de contenido del paquete

            new Application().SaveToXml(String.Format(@"C:\Temp\{0}.dtsx", pkg.Name), pkg, null);
            pkg.Dispose();
        }
    }
}

Con este código creamos el paquete y lo guardamos con una extensión .dtsx, como el contenido del paquete está basado en una estructura XML, usamos la función SaveToXml para vaciarlo en un archivo. En la línea comentada iría toda la lógica que querramos agregarle, a efectos de este post veremos cómo crear variables y conexiones.

UPDATE [03/01/2012] Los nombres de los objetos al momento de su creación son estándares, puedes consultar los nombres que corresponden a cada uno en el artículo CreationName for SSIS 2008 and adding components programmatically

Creando variables

Las variables nos permiten pasarle parametros al paquete de SSIS y a su vez darle dinamismo a los objetos del flujo de trabajo que estemos manejando. El siguiente código me permite crear las variables que necesite para mi paquete (recuerda colocar este código en la zona donde está la línea comentada):

//pkg.Variables.Add(NombreVariable, SoloLectura, nameSpace, Valor);
pkg.Variables.Add("LocalDB", false, "", "MiBaseDeDatos");
pkg.Variables.Add("ArchivoDatos",false,"",@"C:\RutaDelArchivo\Archivo.txt");

Con este código estamos creando 2 variables las cuales utilizaremos más adelante en la creación de las conexiones con valores dinámicos.

Creando conexiones

Todos los paquetes cuentan con un manejador de conexiones, en el cual están todos los objetos que contienen los valores necesarios para que el paquete pueda interactuar con un repositorio de datos. Podemos crear los siguientes tipos de conexiones:

  • OLE DB
  • Flat file
  • ADO.NET
  • Analysis Services
  • File
  • Data Source

A efectos de ejemplo, crearemos 2 conexiones, una hacia una base de datos SQL Server y otra hacia un archivo de TXT.

// Conexion SQL OLE-DB
ConnectionManager connectionManagerOleDb = pkg.Connections.Add("OLEDB");
connectionManagerOleDb.Name = "OLEDB";
connectionManagerOleDb.ConnectionString = "Provider=SQLOLEDB.1;Data Source=(local);Initial Catalog=MiBaseDeDatos;Integrated Security=SSPI;";

// Conexion Flat File
Microsoft.SqlServer.Dts.Runtime.ConnectionManager srcConMan = pkg.Connections.Add("FLATFILE");
srcConMan.ConnectionString = @"C:\RutaDelArchivo\Archivo.txt";
srcConMan.Properties["LocaleID"].SetValue(srcConMan, "8202");
srcConMan.Properties["CodePage"].SetValue(srcConMan, "1252");
srcConMan.Properties["Format"].SetValue(srcConMan, "Delimited");
srcConMan.Properties["DataRowsToSkip"].SetValue(srcConMan, 0);
srcConMan.Properties["ColumnNamesInFirstDataRow"].SetValue(srcConMan, false);
srcConMan.Properties["Name"].SetValue(srcConMan, "TXT.Archivo");
srcConMan.Properties["RowDelimiter"].SetValue(srcConMan, "\r\n");
srcConMan.Properties["TextQualifier"].SetValue(srcConMan, "");
//Mapear columnas del archivo
ffSrcCM = srcConMan.InnerObject as RuntimeWrapper.IDTSConnectionManagerFlatFile100;

RuntimeWrapper.IDTSConnectionManagerFlatFileColumn100 colu = ffSrcCM.Columns.Add();
RuntimeWrapper.IDTSName100 colN = (Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSName100)colu;

colN.Name = "Columna1";
colu.DataType = RuntimeWrapper.DataType.DT_STR;
colu.ColumnWidth = colu.MaximumWidth = 1024;
colu.ColumnDelimiter = ",";
colu.TextQualified = true;
colu.ColumnType = "Delimited";
colu.DataPrecision = 0;
colu.DataScale = 0;

colu = ffSrcCM.Columns.Add();
colN = (Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSName100)colu;
colN.Name = "Columna2";
colu.DataType = RuntimeWrapper.DataType.DT_STR;
colu.ColumnWidth = colu.MaximumWidth = 1024;
colu.ColumnDelimiter = ",";
colu.TextQualified = true;
colu.ColumnType = "Delimited";
colu.DataPrecision = 0;
colu.DataScale = 0;

colu = ffSrcCM.Columns.Add();
colN = (Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSName100)colu;
colN.Name = "Columna 3";
colu.DataType = RuntimeWrapper.DataType.DT_STR;
colu.ColumnWidth = colu.MaximumWidth = 1024;
colu.ColumnDelimiter = "\r\n";
colu.TextQualified = true;
colu.ColumnType = "Delimited";
colu.DataPrecision = 0;
colu.DataScale = 0;

Con este código creamos 2 objetos de conexión, uno hacia una base de datos y otro hacia un archivo de texto. Para el caso de archivos, como la data tiene una estructura para definir cada columna, se debe mapear las columnas a usar.

Valores dinámicos con variables

Como comenté anteriormente, podemos usar las variables de los paquetes para darle dinamismo a los objetos del flujo de trabajo. En este ejemplo, asignaremos el nombre de la base de datos en la conexión de forma dinámica, de tal manera que si nosotros cambiamos el valor de la variable, alteraríamos la cadena de conexión que estamos armando con la variable.

//Sustituir la siguiente línea
//connectionManagerOleDb.ConnectionString = "Provider=SQLOLEDB.1;Data Source=(local);Initial Catalog=MiBaseDeDatos;Integrated Security=SSPI;";
//por la siguiente linea
connectionManagerOleDb.SetExpression("ConnectionString", "\"Data Source=(local);Initial Catalog=\"+@MiBaseDeDatos+\";Provider=SQLNCLI10.1;Integrated Security=SSPI;\"");

De esta forma estamos construyendo una cadena de conexión donde estaríamos indicándole que el nombre de la base de datos proviene de una variable definida en el paquete de SSIS. Usando SetExpression podemos realizar este tipo de asignación de valores dinámicos.

En la siguiente entrega estaré mostrando un poco cómo agregar elementos al paquete y darle forma al flujo de trabajo interno.

Nos leemos,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s