导入SSIS中的最后修改文件

时间:2013-11-27 09:42:45

标签: .net sql vb.net ssis

美好的一天,

我事先道歉,对于你们许多人来说这可能是一个非常简单的问题。

基本上每小时将文件保存到某个文件夹(文件ext .AMA)中,我想创建一个每小时运行一次的SSIS包,并仅将最后修改的文件导入SQL Server数据库。

我意识到我需要使用脚本组件来执行此操作,但我对vb.net没有任何工作知识(我坚持使用VS 2005)。另外,我不确定这是否需要在Foreach循环容器中完成,或者是否可以直接从脚本组件转到OLE DB目标?

有人会非常友好地给我一个我可以解决的示例脚本,并向我解释如何将其合并到SSIS包中吗?我不能在谷歌搜索中看到脚本解决方案的头脑或故事,而且他们中的许多人似乎都在使用C#。

按照上次修改的日期/时间进行操作应该没问题,但文件名中的日期/时间采用以下格式“YYMMDDHHMM”,我不确定它有多大用处。

提前致谢!

2 个答案:

答案 0 :(得分:0)

让我们将这个项目分解成更小的部分,而不是给出完整的解决方案。尝试解决这些问题,解决方案应该出现 - 希望如此。如果你卡在任何一块上,感觉要回到更尖锐的问题。那就是说,这就是我的建议 - 1.取一个.AMA文件。使用数据流任务。使用平面文件源连接作为源,将OleDB用作目标。硬编码连接管理器中的源和目标连接。如果您需要任何转换,请尝试使用派生列(因为它更容易并完成大多数转换)。如果你能够完成这篇文章,它将消除你对使用脚本组件的疑虑。

  1. 接下来,开始删除步骤1中提到的硬编码部分。了解如何使用变量动态更改连接字符串。

  2. 将另一个.AMA文件放在同一位置。使用ForEach任务处理这两个文件。 (不一定你需要它)

  3. Import most recent csv file to sql server in ssis

  4. 希望这可以帮助您自己找到解决方案 - 而不是要求完整的解决方案。

答案 1 :(得分:0)

Public Sub Main()
Dim fileMask As String = "*.csv"
Dim mostRecentFile As String = String.Empty
Dim rootFolder As String = String.Empty

' Assign values from the DTS variables collection.
' This is case sensitive. User:: is not required
' but you must convert it from the Object type to a strong type
rootFolder = Dts.Variables["User::RootFolder"].Value.ToString()

' Repeat the above pattern to assign a value to fileMask if you wish
' to make it a more flexible approach

' Determine the most recent file, this could be null
Dim candidate As System.IO.FileInfo = ScriptMain.GetLatestFile(rootFolder, fileMask)

If candidate IsNot Nothing Then
    mostRecentFile = candidate.FullName
End If

' Push the results back onto the variable
Dts.Variables["CurrentFile"].Value = mostRecentFile

Dts.TaskResult = (int)ScriptResults.Success
End Sub




private static System.IO.FileInfo GetLatestFile(string directoryName, string fileExtension)
{
System.IO.DirectoryInfo directoryInfo = new System.IO.DirectoryInfo(directoryName);

System.IO.FileInfo mostRecent = null;

// Change the SearchOption to AllDirectories if you need to search subfolders
System.IO.FileInfo[] legacyArray = directoryInfo.GetFiles(fileExtension,      
    System.IO.SearchOption.TopDirectoryOnly);
foreach (System.IO.FileInfo current in legacyArray)
{
    if (mostRecent == null)
    {
        mostRecent = current;
    }

    if (current.LastWriteTimeUtc >= mostRecent.LastWriteTimeUtc)
    {
        mostRecent = current;
    }
}

return mostRecent;

// To make the below code work, you'd need to edit the properties of the project
// change the TargetFramework to probably 3.5 or 4. Not sure
// Current error is the OrderByDescending doesn't exist for 2.0 framework
//return directoryInfo.GetFiles(fileExtension)
//     .OrderByDescending(q => q.LastWriteTimeUtc)
//     .FirstOrDefault();
}

This is the site I used for conversion: http://www.developerfusion.com/tools/convert/csharp-to-vb