2012-08-01 9 views
5

Ich versuche, ein SSIS-Paket zu erstellen, das in einem standardisierten Dateisystemarchivierungsvorgang verwendet wird. Grundsätzlich kann ich Informationen zu einer Konfigurationstabelle hinzufügen und dann diese Tabelle verwenden, um bestimmte Dateien in bestimmten Ordnern zu archivieren. Mein Problem ist, dass viele der Dateien dynamische Namen haben, also muss ich eine Liste aller Dateien bekommen und dann abfragen, welche Dateien ich anfassen sollte.SSIS-Skriptaufgabe Abrufen von Dateinamen und Speichern in eine SSIS-Objektvariable

Wenn ich kein C#/VB-Programmierer bin, verursache ich einige Probleme, wenn ich versuche, einen Teil des Pakets zu scripten, alle Dateien in einem bestimmten Netzwerkverzeichnis abzufangen und diese Dateinamen wieder in eine SSIS-Objektvariable einzufügen.

Ich habe eine String-Variable 'User :: SourceNetworkFolderName', die den UNC-Speicherort des Ordners enthält, aus dem ich alle Dateien lesen möchte. Ich möchte dann alle diese Dateinamen (mit Erweiterung) an eine SSIS-Objektvariable mit dem Namen 'User :: SourceFilesInTheDirectory' zurückgeben. Sobald ich die Liste der Dateinamen in der Objektvariable habe, würde ich sie foreach in eine SQL-Tabelle loopen.

Hat jemand spezielle Vorschläge, wie ich eine Liste aller Dateinamen aus meinem Variablenverzeichnis in meine SSIS-Objektvariable bekommen kann?

Vielen Dank im Voraus!

EDIT: Hier ist meine aktualisierte Code:

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

Antwort

5

In Ihrem Skript, nur ein Array der Dateinamen erstellen und festlegen, dass die Array auf Ihre Variable (stellen Sie sicher, dass die Variable gesetzt ist beschreibbar in der Skriptaufgabe). Wenn die Variable vom Typ Objekt ist, können Sie sie in einer nachfolgenden Aufgabe mit einer for-Schleife durchlaufen und alles mit den Dateien machen. Sie sollten nicht an irgendwelchen Wundern nur in einem Skript arbeiten müssen.

Legen Sie alle Dateien unter Quellverzeichnis in einem Array:

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

Legen Sie alle Dateien mit der Erweiterung "BIN" in einem Array:

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

Sie müssen möglicherweise System.IO enthalten in die Spitze Ihres Skript-Codes.

EDIT:

Um Array in eine Liste für die Verarbeitung durch den Loop Aufgabe zu umwandeln. Nach den obigen Code aufrufen, nennen dies:

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

Sie müssen System.Collections.Generic an der Spitze der Skriptdatei aufzunehmen.

+0

Vielen Dank für die Hilfe! Ich habe Fortschritte gemacht, aber ich stecke wieder fest. Ich denke, mein neues Problem hängt mit der Art und Weise zusammen, wie ich meine Objektvariable aus der Skriptaufgabe bevölkere. Im Debugger benutze ich Uhr und meine Variable 'User :: SourceFilesInTheDirectory' zeigt: Wert = {Dimensionen: [2]} Typ = String [] Ich glaube, dass, um diese Variable als ADO zu verwenden Enumerator, muss es lesen: Value = {System.Data.DataSet} Type = DataSet – Joe

+0

Ich fühle mich sehr nahe, aber derzeit bekomme ich Debug-Fehler beim Versuch, diese Variable als Foreach ADO Enumerator ausführen. Irgendwelche Ideen, wie man diese Variable vom richtigen Typ bekommt, damit ich sie als Foreach Enumerator benutzen kann? Ich habe meinen Code unten eingefügt: – Joe

+0

'Code public void Main() { // eine Liste von Dateien aus 'SourceNetworkFolderName' SSIS Variable String in einem Array Fetch [] array1 = Directory.GetFiles (Dts.Variables [ "SourceNetworkFolderName"]. Value.ToString()); // Füllen Sie die SSIS-Objektvariable 'SourceFilesInTheDirectory' mit allen Dateinamen aus dem Array Dts.Variables ["SourceFilesInTheDirectory"]. Value = array1; Dts.TaskResult = (int) ScriptResults.Success; } ' – Joe

Verwandte Themen