继续处理 SSIS 中的某些特定错误
Posted
技术标签:
【中文标题】继续处理 SSIS 中的某些特定错误【英文标题】:Continue flow on certain specific Error in SSIS 【发布时间】:2010-10-08 10:17:39 【问题描述】:在 SSIS 2005 中,我使用的是 FTP 任务。我有一个流程,当包运行时,它会将特定文件夹中的任何文件从 FTP 检索到本地文件夹。
远程文件夹路径由/root/abc/*abc.txt等变量设置
如果该文件夹中有符合此条件的文件,则该任务可以正常工作。如果没有文件,任务将失败并出现文件未找到错误!
如果只是因为远程文件夹没有匹配的文件而出现此特定文件未找到错误,我如何才能使 SSIS 不中断任务?
但是,如果出现 FTP 服务器无法登录等错误,那么任务应该会抛出预期的错误。
【问题讨论】:
【参考方案1】:您现在可能已经找到了问题的答案。这是实现这一目标的一种可能方法。 Script Task
可用于查找给定模式的 FTP 文件夹路径中存在的文件列表(例如 *.txt
)。下面的例子展示了如何做到这一点。
分步过程:
在 SSIS 包上,创建一个名为 FTP 的 FTP Connection
,并创建 5 变量,如屏幕截图 #1 所示.变量RemotePath
包含FTP 文件夹路径; LocalPath
包含文件将下载到的文件夹; FilePattern
包含文件模式,用于查找要从 FTP 服务器下载的文件列表; FileName
将由 Foreach loop container
填充,但为避免 FTP 任务设计时错误,可以使用 / 填充它,或者可以将 FTP 任务上的 DelayValidation
属性设置为 是的。
在 SSIS 包上,将 Script Task
、Foreach Loop container
和 FTP Task
放在 Foreach Loop container
中,如屏幕截图 #2 所示。
将Script Task
中的Main()
方法替换为脚本任务代码 部分下的代码。 Script Task 将使用匹配给定模式的文件集合填充变量 ListOfFiles。此示例将首先使用模式 *.txt,它不会产生任何结果,然后是模式 *.xls,它将匹配 FTP 服务器上的少数文件。
如屏幕截图 #3 和 #4 所示配置 Foreach Loop container
。此任务将循环通过变量 **ListOfFiles*。如果没有文件,循环容器内的 FTP 任务将不会执行。如果有文件,则循环容器内的 FTP 任务将针对在 FTP 服务器上找到的文件数执行该任务。
如屏幕截图 #5 和 #6 所示配置FTP Task
。
屏幕截图 #7 显示了当 no 为模式 *.txt
找到匹配文件时的示例包执行。
屏幕截图#8显示了文件夹C:\temp\
在执行包之前的内容。
屏幕截图 #9 显示了为模式 *.xls
找到匹配文件时执行的示例包。
截图#10显示了FTP远程路径/Practice/Directory_New
的内容。
屏幕截图#11显示执行包后文件夹C:\temp\
的内容。
屏幕截图 #12 显示了在提供不正确的远程路径时包失败。
屏幕截图 #13 显示了与包失败相关的错误消息。
希望对您有所帮助。
脚本任务代码:
C# 代码可以在 SSIS 2008 and above
中使用。
包含using
语句使用 System.Text.RegularExpressions;
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;
VB 代码,可以在 SSIS 2005 and above
中使用。
包含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:
【讨论】:
以上是关于继续处理 SSIS 中的某些特定错误的主要内容,如果未能解决你的问题,请参考以下文章