需要通过SSIS将文件属性输入表中

时间:2015-10-02 19:49:26

标签: c# sql-server ssis

我有一个SSIS包需要获取文件大小,上次修改日期和带扩展名的文件名,并将该信息转储到sql server 2014表中。

我正在使用SQL Server数据工具开发Visual Studio 2013.到目前为止,我已经创建了一个脚本任务,它从“source_directory”字符串变量读取并写入对象变量。我的计划是在脚本中创建一个表,遍历源目录并使用fileinfo提取所需的文件属性。然后在该表中搜索仅.txt文件并按文件名排序并放入单独的排序表中。然后将这些值放入我的对象变量中。然后使用foreach循环容器循环遍历对象

然而,我无法让它发挥作用。每当我执行脚本任务时,我都会得到“调用目标已抛出异常。”

请参阅下面的C#代码。

public void Main()
{
        // Create a dataset. I named it unsorted, because it's not yet sorted
        DataSet dsUnsorted = new DataSet();

        // Create a new table in the dataset
        DataTable filelistTable = dsUnsorted.Tables.Add();
        filelistTable.Columns.Add("Source_Full_Filepath", typeof(string));  // Filepath needed for connectionstring.
        filelistTable.Columns.Add("Source_Filename", typeof(string));  // Filename used for sorting [optional]. 
        filelistTable.Columns.Add("Source_Datetime", typeof(DateTime));// Filedate used for sorting [optional].
        filelistTable.Columns.Add("Source_Size", typeof(int));// Filesize.

        // Get all files within the folder       
        string[] allFiles = Directory.GetFiles(Dts.Variables["Source_Directory"].Value.ToString());

        // Variable for storing file properties
        FileInfo fileInfo;

        // Loop through the files in the folder       
        foreach (string currentFile in allFiles)
        {
            // Fill fileInfo variable with file information         
            fileInfo = new FileInfo(currentFile);

            // Choose which the file properties you will use
            // Columns:            FilePath           FileName       FileDate
            filelistTable.Rows.Add(fileInfo.FullName, fileInfo.Name, fileInfo.LastWriteTime, fileInfo.Length);

        }

        // Filtering on *.txt extension. Note: like uses * instead of %
        // Sorting the files on filename (or filedate: FileName DESC)
        DataRow[] rows = dsUnsorted.Tables[0].Select("Source_Full_Filepath like '*.txt'", "Source_FileName ASC");



        // Create a new sorted dataset that the SSIS foreach loop uses.
        DataSet dsSorted = new DataSet();
        DataTable filelistTableSorted = dsSorted.Tables.Add();

        // Only interested in the filepath which is needed for the connectionstring 
        filelistTableSorted.Columns.Add("Source_Full_Filepath", typeof(string));  // Filepath needed for connectionstring.
        filelistTableSorted.Columns.Add("Source_Filename", typeof(string));
        filelistTableSorted.Columns.Add("Source_Datetime", typeof(DateTime));// Filedate used for sorting [optional].
        filelistTableSorted.Columns.Add("Source_Size", typeof(int));// Filedate used for sorting [optional].
        // Fill the new dataset with the sorted rows.

        foreach (DataRow row in rows)
        {
            filelistTableSorted.Rows.Add(row["Source_Full_Filepath"].ToString());
            filelistTableSorted.Rows.Add(row["Source_Filename"].ToString());
            filelistTableSorted.Rows.Add(row["Source_Datetime"].ToString());
            filelistTableSorted.Rows.Add(row["Source_Size"].ToString());
        }

        // Store the dataset in the SSIS variable       
        Dts.Variables["FileDataset"].Value = dsSorted;




        Dts.TaskResult = (int)ScriptResults.Success;
    }

1 个答案:

答案 0 :(得分:1)

这里有一些想法:Directory.GetFiles应该重载,以便只列出扩展名为.txt的文件。这应该清除你的一些代码。如果您的目标是最终将此信息推送到表中,则需要此脚本的一部分来收集FileInfo值。但是,你的问题太复杂了。

将数据流任务添加到SSIS包中。在数据流任务中,添加脚本组件。当它到达画布时,它将询问这是源,目标还是转换。选择来源

在“输入和输出”选项卡上的“输出0”输出上,单击“添加列4次”。为您的问题域重命名并分配正确的数据类型(我使用DT_STR 256,DT_STR 128,DB_DATETIME,DT_I8)

enter image description here

返回“脚本”选项卡,现在指示您的SSIS变量Source_Directory是ReadOnly并单击“编辑脚本”。

using System;
using System.Data;
using System.IO;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void CreateNewOutputRows()
    {
        string sourceDirectory = @"C:\ssisdata";
        string fileMask = "*.txt";

        // Variable for storing file properties
        FileInfo fileInfo;

        foreach (var currentFile in Directory.GetFiles(sourceDirectory, fileMask, SearchOption.AllDirectories))
        {
            fileInfo = new FileInfo(currentFile);
            Output0Buffer.AddRow();
            Output0Buffer.FullName = fileInfo.FullName;
            Output0Buffer.Name = fileInfo.Name;
            Output0Buffer.LastWriteTime = fileInfo.LastWriteTime;
            // fileInfo.Length is type Long
            // Output0Buffer.Length is type Int64
            // Too lazy to look, but I think Long could overflow Int64
            Output0Buffer.Length = fileInfo.Length;
        }
    }
}

从那里添加OLE DB目标(除非您需要使用其他提供程序)并在那里发送您的数据。出于这个答案的目的,我添加了一个派生列,并在其中放置一个数据查看器以显示其工作原理。

enter image description here