1

我有一个SSIS 包zip.dtsx。此包在 serverA 上成功运行。我在serverB中复制了这个包。但是,当我尝试在 serverB 上运行 zip.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();
4

1 回答 1

0

我终于想通了。

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

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

从集成服务目录 -> 目录文件夹 -> 右键单击​​ -> 报告 -> 所有执行,我了解到它在从 main.dtsx 调用的 Zip.dtsx 上失败。Zip.dtsx 压缩访问的文件,将其归档并从源文件夹中删除。

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

我的第一个错误是我在通过右键单击执行 Zip.dtsx 时继续播放我的脚本任务 -> 在 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 管理工作室

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

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

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


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

- - - - - - - - - - - - - - - 纽扣:

好的

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

于 2016-10-18T02:55:32.610 回答