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