2012-08-01 29 views
5

Estoy intentando crear un paquete SSIS que se utilizará en un proceso de archivo de sistema de archivos estandarizado. Básicamente, podré agregar información a una tabla de configuración y luego usar esta tabla para archivar ciertos archivos en carpetas específicas. Mi problema es que muchos de los archivos tienen nombres dinámicos, así que necesito obtener una lista de todos los archivos y luego consultar para decidir qué archivos debo tocar.Tarea de secuencia de comandos de SSIS Obtener nombres de archivo y almacenar en una variable de objeto SSIS

No ser un programador C#/VB me está causando algunos problemas al intentar crear una secuencia de comandos de una porción del paquete que atrapa todos los archivos en un directorio de red especificado y luego los devuelve a una variable de objeto SSIS.

Tengo una variable de cadena 'User :: SourceNetworkFolderName' que contendrá la ubicación UNC de la carpeta de la que quiero leer todos los archivos. Quiero pasar todos los nombres de estos archivos (con extensión) a una variable de objeto SSIS llamada 'User :: SourceFilesInTheDirectory'. Una vez que tengo la lista de nombres de archivo en la variable de objeto, iba a foreach en bucle en una tabla SQL.

¿Alguien tiene alguna sugerencia específica sobre cómo obtener una lista de todos los nombres de archivos de mi directorio de variables a mi variable de objeto SSIS?

¡Gracias de antemano!

EDIT: Aquí está mi código actualizado:

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.IO; 
using System.Collections.Generic; 
using System.Data.SqlClient; 

namespace ST_f5e4ae71f14d40d8811af21fa2a9a622.csproj 
{ 
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 

     #region VSTA generated code 
     enum ScriptResults 
     { 
      Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
      Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
     }; 
     #endregion 

     public void Main() 
     { 
     //Setup Connection String to SQL 
      SqlConnection SQLConnection = new SqlConnection(
             //"user id=username;" +     //UserName 
             //"password=password;" +     //Password 
             "Trusted_Connection=true;" +    //Windows Auth 
             "server=SERVERNAME;" +     //SQL Server 
             "database=DATABASENAME; " +    //SQL Database 
             "connection timeout=30;" +    //connection timeout 
             "Network Library=dbmssocn");    //TCP/IP Connection ("dbnmpntw" = Name Pipes) 


     //Open the SQL Connection and remove the error code 
      try 
      { 
       SQLConnection.Open(); 
      } 
      catch (Exception OpenConnectionError) 
      { 
       Console.WriteLine(OpenConnectionError.ToString()); 
      } 


     //Fetch a list of files from 'SourceNetworkFolderName' SSIS variable to an array called array1. 
      string[] ArrayFileName = Directory.GetFiles(Dts.Variables["SourceNetworkFolderName"].Value.ToString()); 


     //Set up sql variable for table population 
      SqlParameter SQLFileNameParam = new SqlParameter("@FileName", SqlDbType.VarChar, 100); 


     //Loop through the array and insert into an SQL table 
      foreach (string strFileName in ArrayFileName) 
      { 
      //Update sql variable with file names from array 
       SQLFileNameParam.Value = strFileName; 
      //Make the table insert 
       SqlCommand SQLInsertToTable = new SqlCommand("INSERT INTO Archive_Extract_Network_Folder_File_List (FileName) VALUES (@FileName)", SQLConnection); 
      //This snippit allows the use of the variable in the sql script. 
       SQLInsertToTable.Parameters.Add(SQLFileNameParam); 
      //Execute SqlCommand 
       SQLInsertToTable.ExecuteNonQuery(); 
      //Clear the parameters and set the object to null  
       SQLInsertToTable.Parameters.Clear(); 
       SQLInsertToTable = null; 
      } 


     //Close the SQL Connection and remove the error code 
      try 
      { 
       SQLConnection.Close(); 
      } 
      catch (Exception CloseConnectionError) 
      { 
       Console.WriteLine(CloseConnectionError.ToString()); 
      } 


     //Set array to null since it is no longer required. 
      ArrayFileName = null; 


     //Exit on success 
      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
    } 
} 

Respuesta

5

dentro del guión, simplemente construir una matriz con los nombres de los archivos y establecer esa matriz a la variable (asegúrese de que la variable se establece en grabables en la tarea de scripting). Si la variable es de tipo objeto, puede iterar sobre ella utilizando un bucle for en una tarea posterior y hacer lo que quiera con los archivos. No debería necesitar trabajar en milagros solo en un guión.

Ponga todos los archivos bajo el directorio de fuentes en una matriz:

string[] array1 = Directory.GetFiles(Dts.Variables("SourceNetworkFolderName").Value.ToString()); 

Ponga todos los archivos con la extensión "BIN" en una matriz:

string[] array2 = Directory.GetFiles(Dts.Variables("SourceNetworkFolderName").Value.ToString(), "*.BIN"); 

Usted puede necesitar incluir System.IO en la parte superior de tu código de scripting

EDITAR:

Convertir matriz a una lista para ser procesada por la tarea de bucle. Después de llamar al código anterior, llamar a esto:

List<string> fileList = new List<string>(astrTest); 
Dts.Variables["SourceFilesInTheDirectory"].Value = fileList; 

Usted tendrá que incluir System.Collections.Generic en la parte superior de su archivo de secuencia de comandos.

+0

¡Gracias por la ayuda! He progresado un poco, pero estoy atascado de nuevo. Creo que mi nuevo problema está relacionado con la forma en que estoy rellenando mi variable de objeto desde la tarea de script. En el depurador estoy usando mi reloj y variable 'usuario :: SourceFilesInTheDirectory' está mostrando: Valor = {Dimensiones: [2]} Tipo = String [] Creo que con el fin de utilizar esta variable como un ADO enumerador, necesita leer: Valor = {System.Data.DataSet} Tipo = DataSet – Joe

+0

Me siento súper cerca, pero actualmente recibo errores de depuración cuando intento ejecutar esta variable como un Enumerador ADO de Foreach. ¿Alguna idea sobre cómo hacer que esta variable sea del tipo correcto para que pueda usarla como un Enumerador de Foreach? He pegado a mi código: – Joe

+0

'código principal public void() { // Obtiene una lista de los archivos de variables SSIS 'SourceNetworkFolderName' a una cadena matriz [] = array1 Directory.GetFiles (Dts.Variables [ "SourceNetworkFolderName"]. Value.ToString()); // Complete la variable de objeto SSIS 'SourceFilesInTheDirectory' con todos los nombres de archivo de la matriz Dts.Variables ["SourceFilesInTheDirectory"]. Value = array1; Dts.TaskResult = (int) ScriptResults.Success; } ' – Joe

Cuestiones relacionadas