当没有文件可供下载时,如何避免 SSIS FTP 任务失败?

2024-05-13

我正在使用 SQL Server 2005,并在 SSIS 中创建 ftp 任务。

有时会有文件需要通过 ftp 传输,有时则不会。如果没有文件,我不希望任务或包失败。我已将从 ftp 任务到下一个任务的箭头更改为“完成”,以便包运行。我已将允许的错误数更改为 4(因为有 4 个 ftp 任务,并且 4 个目录中的任何一个都可能有文件,也可能没有文件)。

但是,当我从代理中的作业运行该包时,它将该作业标记为失败。由于这将每 15 分钟运行一次,因此我不希望我的工作历史记录中有一堆红色 x,这将导致我们在问题真正发生时看不到问题。

如何设置 ftp 任务中的属性,以便未找到要 ftp 的文件不会失败?我正在使用的操作是“发送文件”。

以下是更多信息:这些文件位于服务器上,除了 ftp 之外,我无法通过该服务器进行任何访问。而且,我事先不知道文件名。用户可以随意称呼它们。所以我无法检查特定文件,我认为我根本无法检查。除非使用 ftp 连接和基于该连接的任务。这些文件位于远程服务器上,我想将它们复制到我的服务器,以从该远程服务器获取它们。

我可以在脚本任务中对命令级 ftp 进行 shell 处理。也许这就是我需要使用的而不是 ftp 任务。 (我已更改为使用 ftp 命令行,并带有从脚本任务调用的参数文件。当没有要获取的文件时,它不会给出错误。我认为这个解决方案对我有用。我正在创建动态参数文件,这意味着我不需要在纯文本文件中包含连接信息,而是可以存储在我的配置文件中,该文件位于更安全的位置。)


我知道您已经找到了问题的答案。这是针对可能偶然发现此问题的其他用户的。这是实现这一目标的一种可能方法。Script Task可用于查找给定模式的 FTP 文件夹路径中存在的文件列表(例如*.txt)。下面的示例展示了如何做到这一点。

分步过程:

  1. 在 SSIS 包上创建一个FTP Connection named FTP并还创建5变量如屏幕截图所示#1。多变的RemotePath包含 FTP 文件夹路径;LocalPath包含文件将下载到的文件夹;FilePattern包含文件模式以查找要从 FTP 服务器下载的文件列表;FileName将由以下人员填充Foreach loop container但为了避免 FTP 任务设计时错误,可以将其填充为/ or the DelayValidationFTP 任务上的属性可以设置为True.

  2. 在 SSIS 包上,放置一个Script Task, Foreach Loop container and FTP TaskForeach Loop container如截图所示#2.

  3. 更换Main()内的方法Script Task与下面的代码脚本任务代码部分。脚本任务将填充变量文件列表与匹配给定模式的文件集合。此示例将首先使用模式 *.txt,该模式不会产生任何结果,然后使用模式 *.xls,该模式将匹配 FTP 服务器上的几个文件。

  4. 配置Foreach Loop container如截图所示#3 and #4。此任务将循环访问变量 **ListOfFiles*。如果没有文件,循环容器内的FTP任务将不会执行。如果有文件,则循环容器内的 FTP 任务将执行在 FTP 服务器上找到的文件数量的任务。

  5. 配置FTP Task如截图所示#5 and #6.

  6. 截屏 #7显示示例包执行情况no找到该模式的匹配文件*.txt.

  7. 截屏 #8显示文件夹的内容C:\temp\ before包的执行。

  8. 截屏 #9显示找到该模式的匹配文件时的示例包执行情况*.xls.

  9. 截屏 #10显示 FTP 远程路径的内容/Practice/Directory_New.

  10. 截屏 #11显示文件夹的内容C:\temp\ after包的执行。

  11. 截屏 #12当提供不正确的信息时显示包失败远程路径.

  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:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当没有文件可供下载时,如何避免 SSIS FTP 任务失败? 的相关文章

  • SSIS Excel 文件问题 - 创建文件失败

    我有 SSIS 包 可以抓取 excel 文件并将其加载到 sql 表中 运行它时出现以下错误 我尝试将 64 位运行设置为 false 那不起作用 我还安装了 64 位访问驱动程序引擎 这也没有帮助 数据流任务 Excel 源 2 出错
  • SQL Server 删除触发器 - 引用已删除行或标记为删除的行的行句柄

    我在表上有一个删除触发器 用于从另一个数据库的表中删除条目 CREATE TRIGGER dbo Trigger Contracts Delete ON dbo Contracts AFTER DELETE NOT FOR REPLICAT
  • 在 SQL Profiler 中查找特定 LINQ 查询的巧妙技巧

    由于有时会创建疯狂的 SQL 因此分析 LINQ 查询及其执行计划尤为重要 我经常发现我需要跟踪特定的查询 但很难在查询分析器中找到 我经常在有大量正在运行的事务的数据库 有时是生产服务器 上执行此操作 因此仅打开 Profiler 是没有
  • INSERT 失败,因为以下 SET 选项设置不正确:“QUOTED_IDENTIFIER”

    在执行存储过程时 我们有时会收到以下消息 之后无需任何更改 删除并重新执行存储过程 它就可以正常工作 DBCORE INSERT 失败 因为以下 SET 选项设置不正确 QUOTED IDENTIFIER 验证 SET 选项是否正确用于索引
  • SQL Server 2016-临时表-如何识别用户

    是否可以获得有关修改历史表中数据的用户 连接的信息 我读到了审计场景 其中我可以使用时态表 并且可以检测谁更改了数据 但我怎样才能做到这一点呢 一个看似无懈可击的审核解决方案 它给出了进行每个更改的登录用户的名称 并且对我的之前的回答 ht
  • 从另一个表中选择范围之间的记录

    我有两张桌子 比如说Table1 and Table2 Table1 ID RN 11 1 12 2 13 3 14 4 15 5 16 6 17 7 18 8 19 9 10 10 Table2 ID FromRN ToRN 1 1 3
  • 如何在 BigQuery/SQL 中将行转置为包含大量数据的列?

    我在将 BigQuery 中的大量数据表 15 亿行 从行转置为列时遇到问题 我可以弄清楚如何在硬编码时使用少量数据来完成此操作 但是对于如此大量的数据 该表的快照如下所示 CustomerID Feature Value 1 A123 3
  • Filezilla FTP 服务器无法检索目录列表

    我正在运行 Filezilla Server 0 9 45 beta 来远程管理我的服务器 设置好后 我测试了使用IP连接到它127 0 0 1 并且运行成功 但是 为了远程连接到服务器 我将端口转发到端口 21 并尝试使用我的计算机的 I
  • Python FTP下载550错误

    我编写了一个 ftp 爬虫来下载特定文件 它会一直工作 直到找到要下载的特定文件 然后抛出此错误 ftplib error perm 550 该文件存在于我的下载文件夹中 但文件大小为 0 kb 我需要转换某些内容才能下载吗 我可以访问 f
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 服务器未配置 RPC

    查找我的工作历史 发现以下错误 06 18 2018 00 00 01 MBS Lojas ExportaMR OutrasLojas Error 1 WIN VRT 01 SQL2008 MBS Lojas ExportaMR Outra
  • 将 varbinary 数据插入 SQL Server 数据库

    我有这张表
  • 无法找到请求的.Net Framework 数据提供程序。 (Sql客户端)

    我正在尝试使用来自 SQL Server 2005 的 DB First 迁移来设置一个简单的 ASP NET MVC 4 Web 应用程序 我已经在数据库中创建了表 并使用实体框架在代码中创建了对象 我可以使用这些对象访问数据 当我尝试使
  • 无法从本地文件夹运行 Jquery

    你好 我是网络开发新手 我需要与JQuery 即使我已经成功尝试过一个jquery但仅在将文件复制到我的在线 ftp 文件夹后 我完全无法从本地文件夹运行它 请解释一下 如何我可以测试一些新脚本吗 进行额外的练习将文件复制到 ftp 文件夹
  • 实体框架死锁问题

    我在使用 NET 4 的新实体框架时遇到了一个奇怪的问题 我有一个 SQL Server 2005 EXPRESS 数据库 我的服务使用实体框架将数据写入两个表 假设表是 TableA 和 TableB TableB 具有 TableA 的
  • SQL Server 查看主键

    有没有办法在 sql server 中为视图提供主键 我知道在oracle中这是可能的 我不关心更新它的只读视图 但其他人正在 ms access 中使用它 所以我希望显示我知道正确的约束 是的 您可以创建一个索引视图 http msdn
  • 在 Sql Server 2005 中实现最后修改列的最佳方法?

    如何在 SQL 中实现最后修改列 我知道对于创建日期的列 您可以将默认值设置为getdate 对于最后修改我一直使用触发器 但似乎必须有更好的方法 Thanks 触发器是最好的方法 因为此逻辑与表密切相关 而不是与应用程序相关 除了更细粒度
  • 为什么需要 EndExecuteNonQuery()?

    文档here http msdn microsoft com en us library ca56w9se aspx指出 开发人员必须致电 EndExecuteNonQuery 方法完成 操作 我无法找到一个充分的理由来解释为什么会这样 或
  • BCP 实用程序:“复制方向必须是‘输入’、‘输出’或‘格式’”

    当我为可信连接运行 BCP 命令时 出现以下错误 复制方向必须是 输入 输出 或 格式 我尝试搜索 MSDN 其中指定传递的服务器名可能不正确 我正在尝试的命令是 bcp SQL database TABLE1 in FileSERVER
  • 表中主键的最佳实践是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在设计表时 我养成了一种习惯 即有一列是唯一的 并且我将其作为主键 根据要求 可以通过三种方式实现 自动递增的标识整数列 唯一标识符 GUID

随机推荐