美好的一天,
我事先道歉,对于你们许多人来说这可能是一个非常简单的问题。
基本上每小时将文件保存到某个文件夹(文件ext .AMA)中,我想创建一个每小时运行一次的SSIS包,并仅将最后修改的文件导入SQL Server数据库。
我意识到我需要使用脚本组件来执行此操作,但我对vb.net没有任何工作知识(我坚持使用VS 2005)。另外,我不确定这是否需要在Foreach循环容器中完成,或者是否可以直接从脚本组件转到OLE DB目标?
有人会非常友好地给我一个我可以解决的示例脚本,并向我解释如何将其合并到SSIS包中吗?我不能在谷歌搜索中看到脚本解决方案的头脑或故事,而且他们中的许多人似乎都在使用C#。
按照上次修改的日期/时间进行操作应该没问题,但文件名中的日期/时间采用以下格式“YYMMDDHHMM”,我不确定它有多大用处。
提前致谢!
答案 0 :(得分:0)
让我们将这个项目分解成更小的部分,而不是给出完整的解决方案。尝试解决这些问题,解决方案应该出现 - 希望如此。如果你卡在任何一块上,感觉要回到更尖锐的问题。那就是说,这就是我的建议 - 1.取一个.AMA文件。使用数据流任务。使用平面文件源连接作为源,将OleDB用作目标。硬编码连接管理器中的源和目标连接。如果您需要任何转换,请尝试使用派生列(因为它更容易并完成大多数转换)。如果你能够完成这篇文章,它将消除你对使用脚本组件的疑虑。
接下来,开始删除步骤1中提到的硬编码部分。了解如何使用变量动态更改连接字符串。
将另一个.AMA文件放在同一位置。使用ForEach任务处理这两个文件。 (不一定你需要它)
希望这可以帮助您自己找到解决方案 - 而不是要求完整的解决方案。
答案 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