SSIS包在删除脚本任务时失败

本文关键字:任务 失败 脚本 删除 SSIS | 更新日期: 2023-09-27 18:13:17

我有一个SSIS包 zip.dtsx。此包在服务器a上成功运行。我在serverB中复制了这个包。然而,当我试图运行zip。在serverB上执行dtsx,则失败。

zip。DTSX只是读取源文件夹中的文件,压缩它,将压缩文件保存到另一个文件夹,然后删除源文件夹中的原始文件。

经过一番调查,我发现如果我注释掉c#脚本任务中删除源文件夹中文件的部分。

我需要删除源文件夹中的文件。否则,该文件将被反复加载到数据库中。我已经按照这里的建议重新添加了脚本任务引用,但是我仍然不能使file.delete成功运行。

public void Main()
        {
            String sourcePath = Convert.ToString(Dts.Variables["SourcePath"].Value);
            String namePart = Convert.ToString(Dts.Variables["NamePart"].Value);
            String destinationPath = Convert.ToString(Dts.Variables["DestinationPath"].Value);
            FileStream sourceFile = File.OpenRead(@sourcePath + namePart);
            FileStream destFile = File.Create(@destinationPath + namePart);
            GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress);
            try
            {
                int theByte = sourceFile.ReadByte();
                while (theByte != -1)
                {
                    compStream.WriteByte((byte)theByte);
                    theByte = sourceFile.ReadByte();
                }
            }
            finally
            {
                compStream.Dispose();
                sourceFile.Close();
                destFile.Close();
                File.Delete(@sourcePath + namePart);
            } 
            Dts.TaskResult = (int)ScriptResults.Success;
        }

更新:

在这里尝试完全相同的代码之后。发现这段代码,删除了我在源文件夹中的文件,我试图更新我的代码,以遵循链接中删除文件的方式。然而,它仍然不起作用。下面是我如何更新我的代码:

    String sourcePath = Convert.ToString(Dts.Variables["SourcePath"].Value);
    String namePart = Convert.ToString(Dts.Variables["NamePart"].Value);
    String destinationPath = Convert.ToString(Dts.Variables["DestinationPath"].Value);
    FileStream sourceFile = File.OpenRead(@sourcePath + namePart);
    FileStream destFile = File.Create(@destinationPath + namePart);
    GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress);
    try
    {
        int theByte = sourceFile.ReadByte();
        while (theByte != -1)
        {
            compStream.WriteByte((byte)theByte);
            theByte = sourceFile.ReadByte();
        }
    }
    finally
    {
        compStream.Dispose();
        sourceFile.Close();
        destFile.Close();
        FileInfo currFileInfo = new FileInfo(@sourcePath + namePart);
        currFileInfo.Delete();

SSIS包在删除脚本任务时失败

我终于想通了。

为了说明整个情况,我们有一个完全运行的sqlserver serverA。我们想要在serverB上复制这个,这样我们就可以在serverB上拥有一个测试环境。已经在serverB上恢复了必要的数据库,剩下的就是SSIS包和SQL Server代理作业。

加载文件内容到DB的主包(main.dtsx)失败。

从集成服务目录->目录文件夹->右键单击->报告->所有执行,我已经了解到它是失败的Zip。从main.dtsx调用的DTSX。邮政编码。DTSX压缩访问的文件,存档并从源文件夹中删除。

在Zip中完成脚本任务后。dtsx(我从Kannan Kandasamy的评论中得到的一个想法),我发现它是在File.delete()部分,我的脚本任务失败了。马上,人们会认为这是一个权限问题。

我的第一个错误是我在执行Zip时继续玩我的脚本任务。在Visual Studio上右键单击->执行任务。在我之前的帖子中,我一直在获取运行时错误屏幕截图,而没有意识到我正在获取它,因为我使用了由main传递的包变量。DTSX到zip.dtsx。我挂了这个,直到我明白为什么脚本任务成功运行时,我用我的硬编码路径名替换变量。

我的第二个错误是替换了Zip的包变量。DTSX和我的硬编码路径。直到最后,我才意识到是Zip访问的文件夹。dtsx是serverB中的本地文件夹,我在本地机器中运行SQL服务器代理作业,例如machineA。因此,我将serverB本地文件夹共享给我的用户帐户。由于某种原因,这使我的包严重混乱,它不再看到文件夹中的文件,因此我的包成功运行,因为它发现文件夹为空。

主要解决方案:

我改回了我对Zip所做的更改。dtsx并删除了将serverB的本地文件夹共享到我的用户帐户,而是添加了NT Service'SQL$Instance以完全控制脚本任务删除文件的源文件夹。查看如何将SQLServer$Instance添加到文件夹权限设置。

我遇到的其他问题是:

  1. 当从不同的服务器传输包并且包失败时,我认为这也很重要。这一步我也做过。但是在serverB中,我找不到Microsoft.SQLServer.ManagedDTS.dll。我所做的是我将这个dll从serverA复制到serverB。还要检查您的系统路径,以查看您默认使用的Microsoft SQL Server工具的版本,并确保这是您在脚本任务中引用的版本。

  2. 在某个时间点,在调查时,我在查看集成服务目录的所有执行报告时遇到了一个错误。我通过进入C:'Temp文件夹解决了这个问题。当我双击它以访问它时,出现了一个我目前无法访问的对话框。我继续点击对话框中的"继续"按钮。之后,"所有执行报告"将再次运行。我从SSMS得到的错误是,

标题:Microsoft SQL Server Management Studio

本地报告处理过程中发生错误。(Microsoft.ReportViewer.WinForms)

------------------------------ 附加信息:

报告"的定义无效。(Microsoft.ReportViewer.Common)


编译表达式时发生意外错误。本地的编译器返回值:' [BC2001]文件'C:'Windows'TEMP'mpgc21o3.0.vb'"找不到"。(Microsoft.ReportViewer.Common)

------------------------------ 按钮:

我不确定这对我的情况有多大影响,但我正在分享它,以防有人遇到同样的问题。我是MS SQL Server的初学者,所以我认为这可能会帮助像我这样的初学者。