2012-08-01 11 views
5

Sto provando a creare un pacchetto SSIS che verrà utilizzato in un processo di archiviazione file system standardizzato. Fondamentalmente, sarò in grado di aggiungere informazioni a una tabella di configurazione e quindi utilizzare questa tabella per archiviare determinati file nelle cartelle specificate. Il mio problema è che molti file hanno nomi dinamici quindi ho bisogno di ottenere un elenco di tutti i file e quindi interrogare per decidere quali file dovrei toccare.Attività script SSIS Ottieni nomi file e archivia su una variabile oggetto SSIS

Non essendo un programmatore C#/VB mi sta causando alcuni problemi quando si cerca di script di una parte del pacchetto delle palio tutti i file in una directory di rete specificata e poi si nutrono questi nomi di file di nuovo in una variabile oggetto SSIS.

Ho una variabile stringa 'User :: SourceNetworkFolderName' che conterrà la posizione UNC della cartella di cui voglio leggere tutti i file. Voglio quindi passare tutti questi nomi di file (con estensione) a una variabile di oggetto SSIS denominata 'User :: SourceFilesInTheDirectory'. Una volta che avrò la lista dei nomi di file nella variabile oggetto, stavo per forzare il loro ciclo in una tabella SQL.

Qualcuno ha qualche suggerimento specifico su come faccio a ottenere un elenco di tutti i nomi di file dalla mia directory delle variabili alla variabile dell'oggetto SSIS?

Grazie in anticipo!

EDIT: Ecco il mio codice aggiornato:

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; 
     } 
    } 
} 

risposta

5

All'interno dello script, basta costruire un array dei nomi di file e impostare tale matrice alla variabile (assicurarsi che la variabile è impostata scrivibile nel compito di scripting). Se la variabile è di tipo oggetto, puoi eseguirne l'iterazione utilizzando un ciclo for in un'attività successiva e fare ciò che vuoi con i file. Non dovresti aver bisogno di lavorare su miracoli solo in una sceneggiatura.

Mettere tutti i file sotto il tuo dir fonte in un array:

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

Mettere tutti i file con estensione "BIN" in un array:

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

Potrebbe essere necessario includere System.IO a la parte superiore del codice di scripting.

EDIT:

Per convertire matrice a una lista di elaborazione da parte del compito Loop. Dopo aver chiamato il codice qui sopra, chiamare questo:

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

Sarà necessario includere System.Collections.Generic nella parte superiore del vostro file di script.

+0

Grazie per l'aiuto! Ho fatto dei progressi, ma sono di nuovo bloccato. Penso che il mio nuovo problema sia legato al modo in cui sto compilando la mia variabile oggetto dall'attività di script. Nel debugger sto usando watch e la mia variabile 'User :: SourceFilesInTheDirectory' sta mostrando: Value = {Dimensions: [2]} Type = String [] Credo che per usare questa variabile come ADO enumeratore, deve leggere: Valore = {System.Data.DataSet} Type = DataSet – Joe

+0

Mi sento super vicino, ma attualmente ricevo errori di debug quando provo a eseguire questa variabile come un enumeratore ADO Foreach. Qualche idea su come ottenere che questa variabile sia di tipo corretto in modo che io possa usarla come un enumeratore Foreach? Ho incollato il mio codice qui sotto: – Joe

+0

'codice public void Main() { // recuperare un elenco di file da variabile SSIS 'SourceNetworkFolderName' ad una stringa di matrice [] array1 = Directory.GetFiles (Dts.Variables [ "SourceNetworkFolderName"] Value.ToString()).; // Popolare la variabile oggetto SSIS 'SourceFilesInTheDirectory' con tutti i nomi file dall'array Dts.Variables ["SourceFilesInTheDirectory"]. Value = array1; Dts.TaskResult = (int) ScriptResults.Success; } ' – Joe