我有一个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;
}
答案 0 :(得分:1)
这里有一些想法:Directory.GetFiles
应该重载,以便只列出扩展名为.txt的文件。这应该清除你的一些代码。如果您的目标是最终将此信息推送到表中,则将需要此脚本的一部分来收集FileInfo
值。但是,你的问题太复杂了。
将数据流任务添加到SSIS包中。在数据流任务中,添加脚本组件。当它到达画布时,它将询问这是源,目标还是转换。选择来源
在“输入和输出”选项卡上的“输出0”输出上,单击“添加列4次”。为您的问题域重命名并分配正确的数据类型(我使用DT_STR 256,DT_STR 128,DB_DATETIME,DT_I8)
返回“脚本”选项卡,现在指示您的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目标(除非您需要使用其他提供程序)并在那里发送您的数据。出于这个答案的目的,我添加了一个派生列,并在其中放置一个数据查看器以显示其工作原理。