SSIS脚本任务获取文件名并存储到SSIS对象变量

我正在尝试构建一个将用于标准化文件系统归档过程的SSIS包。 基本上,我将能够将信息添加到配置表,然后使用此表来存档指定文件夹中的某些文件。 我的问题是很多文件都有动态命名,所以我需要获取所有文件的列表,然后查询以确定我应该触摸哪些文件。

在尝试编写包的一部分时,不是C#/ VB程序员会导致一些问题,它会抓取指定网络目录中的所有文件,然后将这些文件名反馈回SSIS对象变量。

我有一个字符串变量’User :: SourceNetworkFolderName’,它将包含我想要读取所有文件的文件夹的UNC位置。 我想将所有这些文件名(带扩展名)传递回名为’User :: SourceFilesInTheDirectory’的SSIS对象变量。 一旦我将文件名列表放入对象变量中,我就会将它们循环到SQL表中。

有没有人对如何获取从我的变量目录到我的SSIS对象变量的所有文件名列表有任何具体建议?

先感谢您!

编辑:这是我更新的代码:

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

在脚本中,只需构建一个文件名数组并将该数组设置为您的变量(确保在脚本任务中将变量设置为可写)。 如果变量是object类型,则可以在后续任务中使用for循环对其进行迭代,并对文件执行任何操作。 你不应该只在一个脚本中处理任何奇迹。

将源目录下的所有文件放在数组中:

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

将所有扩展名为“BIN”的文件放入数组中:

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

您可能需要在脚本代码的顶部包含System.IO

编辑

将数组转换为List以供Loop任务处理。 在调用上面的代码后,请调用:

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

您需要在脚本文件的顶部包含System.Collections.Generic