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

标签 c# variables object ssis

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

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

我有一个字符串变量“User::SourceNetworkFolderName”,它将包含我要从中读取所有文件的文件夹的 UNC 位置。然后我想将所有这些文件名(带扩展名)传递回名为“User::SourceFilesInTheDirectory”的 SSIS 对象变量。将文件名列表放入对象变量后,我将使用 foreach 将它们循环到 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;
        }
    }
}

最佳答案

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

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

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

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

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

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

编辑:

将数组转换为列表以供循环任务处理。调用上面的代码后,调用这个:

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

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

关于c# - SSIS 脚本任务获取文件名并存储到 SSIS 对象变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11751901/

相关文章:

java - 我什么时候应该使用基元而不是包装对象?

xcode - 如何从一个类访问另一个类的变量? SWIFT代码

c# - 使用 Owin 的 Twitter 外部登录给出 HTTP 403(禁止)

c# - WinForms 应用程序中的 Webbrowser HTML 文件存储目录?

C#忽略if语句的字母大小写

Php调用变量中类的静态方法

jQuery 无法在 AJAX 函数内定义变量

javascript - 带参数的 Object.create

javascript - 将多个对象转换为一个具有相同键、值的对象作为数组

c# - Windows Phone 应用程序退出通知