在SSIS 2005中,我正在使用FTP任务。我有一个流程,当程序包运行时,它会检索特定文件夹中从FTP到本地文件夹的所有文件。
远程文件夹路径由变量设置,例如/root/abc/*abc.txt
如果该文件夹中的文件符合此条件,则任务正常。如果没有文件,则任务失败且找不到文件错误!
如果没有找到此特定文件错误,我怎样才能使SSIS不中断任务错误只是因为远程文件夹没有匹配的文件?
但是,如果FTP服务器无法登录等错误,则该任务应该抛出预期的错误。
答案 0 :(得分:0)
可能你现在已经找到了问题的答案。这是实现这一目标的一种可能方式。 Script Task
可用于查找给定模式的FTP文件夹路径中存在的文件列表(例如*.txt
)。下面的例子说明了如何做到这一点。
分步流程:
在SSIS包上,创建名为 FTP 的FTP Connection
,并创建 5 变量,如屏幕截图# 1 。变量RemotePath
包含FTP文件夹路径; LocalPath
包含文件将被下载到的文件夹; FilePattern
包含用于查找要从FTP服务器下载的文件列表的文件模式; FileName
将填充Foreach loop container
,但为了避免FTP任务设计时错误,可以使用 / 填充它,或者FTP任务上的DelayValidation
属性可以填充设置为 True 。
在SSIS包中,在Script Task
中放置Foreach Loop container
,FTP Task
和Foreach Loop container
,如屏幕截图# 2 所示
将Main()
内的Script Task
方法替换为脚本任务代码部分下的代码。脚本任务将使用与给定模式匹配的文件集合填充变量 ListOfFiles 。这个例子将首先使用模式* .txt,它不会产生任何结果,然后是模式* .xls,它将匹配FTP服务器上的几个文件。
配置Foreach Loop container
,如屏幕截图# 3 和# 4 所示。此任务将循环遍历变量** ListOfFiles *。如果没有文件,循环容器内的FTP任务将不会执行。如果有文件,循环容器内的FTP任务将执行FTP服务器上找到的文件数的任务。
配置FTP Task
,如屏幕截图# 5 和# 6 所示。
屏幕截图# 7 显示了为模式*.txt
找到无匹配文件时的示例包执行情况。
屏幕截图# 8 显示执行包之前文件夹C:\temp\
的内容。
屏幕截图# 9 显示为模式*.xls
找到匹配文件时的示例包执行。
屏幕截图# 10 显示FTP远程路径/Practice/Directory_New
的内容。
屏幕截图# 11 显示执行
C:\temp\
的内容。
屏幕截图# 12 显示提供错误远程路径时的程序包失败。
屏幕截图# 13 显示与程序包失败相关的错误消息。
希望有所帮助。
脚本任务代码:
可以在SSIS 2008 and above
中使用的C#代码。
使用System.Text.RegularExpressions包含using
语句;
public void Main()
{
Variables varCollection = null;
ConnectionManager ftpManager = null;
FtpClientConnection ftpConnection = null;
string[] fileNames = null;
string[] folderNames = null;
System.Collections.ArrayList listOfFiles = null;
string remotePath = string.Empty;
string filePattern = string.Empty;
Regex regexp;
int counter;
Dts.VariableDispenser.LockForWrite("User::RemotePath");
Dts.VariableDispenser.LockForWrite("User::FilePattern");
Dts.VariableDispenser.LockForWrite("User::ListOfFiles");
Dts.VariableDispenser.GetVariables(ref varCollection);
try
{
remotePath = varCollection["User::RemotePath"].Value.ToString();
filePattern = varCollection["User::FilePattern"].Value.ToString();
ftpManager = Dts.Connections["FTP"];
ftpConnection = new FtpClientConnection(ftpManager.AcquireConnection(null));
ftpConnection.Connect();
ftpConnection.SetWorkingDirectory(remotePath);
ftpConnection.GetListing(out folderNames, out fileNames);
ftpConnection.Close();
listOfFiles = new System.Collections.ArrayList();
if (fileNames != null)
{
regexp = new Regex("^" + filePattern + "$");
for (counter = 0; counter <= fileNames.GetUpperBound(0); counter++)
{
if (regexp.IsMatch(fileNames[counter]))
{
listOfFiles.Add(remotePath + fileNames[counter]);
}
}
}
varCollection["User::ListOfFiles"].Value = listOfFiles;
}
catch (Exception ex)
{
Dts.Events.FireError(-1, string.Empty, ex.ToString(), string.Empty, 0);
Dts.TaskResult = (int) ScriptResults.Failure;
}
finally
{
varCollection.Unlock();
ftpConnection = null;
ftpManager = null;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
可以在 SSIS 2005 and above
中使用的VB 代码。
包含Imports
声明导入System.Text.RegularExpressions
Public Sub Main()
Dim varCollection As Variables = Nothing
Dim ftpManager As ConnectionManager = Nothing
Dim ftpConnection As FtpClientConnection = Nothing
Dim fileNames() As String = Nothing
Dim folderNames() As String = Nothing
Dim listOfFiles As Collections.ArrayList
Dim remotePath As String = String.Empty
Dim filePattern As String = String.Empty
Dim regexp As Regex
Dim counter As Integer
Dts.VariableDispenser.LockForRead("User::RemotePath")
Dts.VariableDispenser.LockForRead("User::FilePattern")
Dts.VariableDispenser.LockForWrite("User::ListOfFiles")
Dts.VariableDispenser.GetVariables(varCollection)
Try
remotePath = varCollection("User::RemotePath").Value.ToString()
filePattern = varCollection("User::FilePattern").Value.ToString()
ftpManager = Dts.Connections("FTP")
ftpConnection = New FtpClientConnection(ftpManager.AcquireConnection(Nothing))
ftpConnection.Connect()
ftpConnection.SetWorkingDirectory(remotePath)
ftpConnection.GetListing(folderNames, fileNames)
ftpConnection.Close()
listOfFiles = New Collections.ArrayList()
If fileNames IsNot Nothing Then
regexp = New Regex("^" & filePattern & "$")
For counter = 0 To fileNames.GetUpperBound(0)
If regexp.IsMatch(fileNames(counter)) Then
listOfFiles.Add(remotePath & fileNames(counter))
End If
Next counter
End If
varCollection("User::ListOfFiles").Value = listOfFiles
Dts.TaskResult = ScriptResults.Success
Catch ex As Exception
Dts.Events.FireError(-1, String.Empty, ex.ToString(), String.Empty, 0)
Dts.TaskResult = ScriptResults.Failure
Finally
varCollection.Unlock()
ftpConnection = Nothing
ftpManager = Nothing
End Try
Dts.TaskResult = ScriptResults.Success
End Sub
屏幕截图#1:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#10:
屏幕截图#11:
屏幕截图#12:
屏幕截图#13: