SSIS包在脚本任务的file.delete上失败

时间:2016-10-17 08:14:41

标签: c# sql-server visual-studio-2015 ssis script-task

我有一个 SSIS包,zip.dtsx。此程序包在serverA上成功运行。我在serverB中复制了这个包。但是,当我尝试在serverB上运行zip.dtsx时,它会失败。

zip.dtsx只读取源文件夹中的文件,压缩文件,将压缩文件保存到其他文件夹,然后删除源文件夹中的原始文件。

经过一番调查,我发现如果我在C#脚本任务中注释掉删除源文件夹中文件的部分。包运行成功。

我需要删除源文件夹中的文件。否则,此文件将重复加载到数据库。我已经按照建议的here重新添加了脚本任务参考,但我仍然无法成功运行$('#myTabs a[href="#default"]').tab('show');

file.delete

更新

尝试完全相同的代码here后。并创建了这段代码,删除了我在源文件夹中的文件,我试图更新我的代码,以便按照链接中删除文件的方式。但是,它仍然无效。以下是我更新代码的方式。

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;
        }

1 个答案:

答案 0 :(得分:0)

我终于弄明白了。

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

将文件内容加载到数据库的主程序包(main.dtsx)失败。

来自Integration Services目录 - >目录文件夹 - >右键单击 - >报告 - >所有执行,我都知道从main.dtsx调用的Zip.dtsx失败了。 Zip.dtsx压缩访问的文件,将其归档并从源文件夹中删除。

在使用Zip.dtsx中的脚本任务(我从Kannan Kandasamy's comments获得的一个想法)之后,我发现它位于我的脚本任务失败的File.delete()部分。当然,人们会认为这是一个许可问题。

我的第一个错误是我通过右键单击执行Zip.dtsx继续播放我的脚本任务 - >在Visual Studio上执行任务。我一直在my previous post获取运行时错误屏幕,而没有意识到我得到它,因为我使用的是由main.dtsx传递给zip.dtsx的包变量。我把它挂了,直到我想到为什么当我用我的硬编码路径名替换变量时脚本任务成功运行。

我的第二个错误是用我的硬编码路径替换Zip.dtsx的包变量。直到最后,我才意识到 Zip.dtsx访问的文件夹是serverB中的本地文件夹,我在本地计算机上运行SQL Server代理作业,比如machineA。所以,我将serverB本地文件夹共享到我的用户帐户。出于某种原因,这严重搞砸了我的包,它不再看到文件夹中的文件,因此我的包成功运行,因为它发现文件夹为空。

主要解决方案:

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

我遇到的其他问题是:

  1. 当从不同的服务器传输包并且包失败时,我想this is also important。我也做了这一步。但是在serverB中,我无法找到Microsoft.SQLServer.ManagedDTS.dll。我做的是将此dll从serverA复制到serverB 。还要检查系统路径,以查看默认情况下使用的Microsoft SQL Server工具版本,并确保这是您在脚本任务中引用的内容。

  2. 在某个时间点,在调查时,我在查看 Integration Services目录的所有执行报告时遇到错误。我通过转到 C:\ Temp 文件夹解决了这个问题。当我双击它以访问它时,会出现一个对话框,我当前无权访问。我继续点击'继续'对话框中的按钮。之后,All Executions Report再次运行。 我从SSMS得到的错误是,

  3.   

    TITLE:Microsoft SQL Server Management Studio

         

    本地报告处理期间发生错误。   (Microsoft.ReportViewer.WinForms)

         

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

         

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

               

    编译表达式时发生意外错误。本地人   编译器返回值:'[BC2001] file' C:\ Windows \ TEMP \ mpgc21o3.0.vb'   无法找到'。 (Microsoft.ReportViewer.Common)

         

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

         

    确定

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

相关问题