为什么SSIS无法创建此任务?

时间:2011-07-14 10:31:54

标签: visual-studio-2008 ssis bids

我编写此代码来实现通过HTTP获取文件的SSIS控制流任务:

using System;
using Microsoft.SqlServer.Dts.Runtime;

namespace HttpTask
{
    [DtsTask(
        DisplayName = "HTTP Task",
        TaskContact = "Iain Elder",
        RequiredProductLevel = DTSProductLevel.None
    )]
    public class HttpTask : Task
    {
        public string LocalPath {get; set;}
        public string Connection {get; set;}
        public bool OverwriteDestination {get; set;}

        public DTSExecResult Execute(Connections connections,
            VariableDispenser dispenser, IDTSComponentEvents events,
            IDTSLogging log, object transaction)
        {
            HttpClientConnection http = AcquireHttpConnection(connections);
            http.DownloadFile(this.LocalPath, this.OverwriteDestination);
            return DTSExecResult.Success;
        }

        private HttpClientConnection AcquireHttpConnection(Connections connections)
        {
            ConnectionManager cm = connections[this.Connection];
            object nativeConnection = cm.AcquireConnection(null);
            return new HttpClientConnection(nativeConnection);
        }
    }
}

在Visual Studio中,我使用此构建后脚本构建和部署我的任务,以将包复制到全局程序集缓存中:

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe" /if "$(TargetPath)"
copy $(TargetFileName) "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks"

使用Business Intelligence Development Studio时,我可以在工具箱中看到任务:

HTTPTask is visible in the toolbox.

当我将任务拖到设计窗口时,我看到了这个错误:

The task fails to create.

任务没有出现在设计画布上。

我在这里做错了什么?

编辑: Siva建议我以强名称签署集会。我按照指南的第1步和第2步在Benny Austin's blog上签署了程序集。我没有按照其他步骤进行操作,因为我的构建后脚本为我部署了该组件。

在Visual Studio项目属性中,我转到Signing选项卡并为程序集创建一个新的强名称密钥文件:

enter image description here

我保存设置并重建包。构建后脚本部署新包。

我仍然得到完全相同的错误。

1 个答案:

答案 0 :(得分:4)

我能够重新创建您正面临的问题。以下示例介绍了如何重新创建问题以及如何解决问题。我使用Visual Studio 2010来创建类库DLL,但目标框架版本是2.0。然后将控制流任务添加到SSIS 2008 R2项目中,该项目与SSIS 2008大致相同。

分步流程:

  1. 在Visual Studio 2010 IDE中,创建了一个C#类库项目并将其命名为 HttpTask 。请参阅屏幕截图# 1 。删除除了必需的引用之外的所有引用。添加了对DLL Microsoft.SQLServer.ManagedDTS 的引用,该引用位于我的计算机的路径c:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll中。根据已安装的SQL Server版本,路径可能不同。路径中的100表示​​SQL Server 2008或SQL Server 2008 R2。

  2. 将Program.cs类重命名为HttpTask.cs并粘贴屏幕截图# 2 中显示的代码。代码与问题中提供的代码完全相同。代码也在 C#类代码部分下提供。

  3. 在类库项目Properties上,将目标框架版本更改为.NET Framework 2.0。请参阅屏幕截图# 3

  4. 配置了构建后事件命令行,如屏幕截图# 4 和# 5 所示。我的计算机上的gacutil.exe路径为C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe。您的机器中的路径可能不同。该脚本还提供了构建后事件命令行部分。

  5. 此时未签署类库。请参阅屏幕截图# 6

  6. 项目已构建,但dll未在GAC(全局程序集缓存)中注册。请参阅屏幕截图# 7

  7. 已验证DLL已正确复制到路径C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\。请参阅屏幕截图# 8

  8. 已验证GAC文件夹C:\windows\assembly中存在 的DLL。请参阅屏幕截图# 9

  9. 创建了一个新的SSIS包。在SSIS包的“控制流”选项卡的工具框中,右键单击Control Flow Items部分并选择Choose Items...。请参阅屏幕截图# 10

  10. 在选择工具箱项目上,选择SSIS Control Flow Items选项卡并选择控件 HTTP任务。请参阅screnshot# 11

  11. 尝试将任务拖放到“控制流”选项卡上,并收到与问题中显示的错误相同的错误。请参阅屏幕截图# 12 。所以上面的步骤描述了如何模拟问题。现在,以下步骤描述了如何解决它。

  12. 现在,我回到了类库项目并单击了属性。这次我用Strong Name Key签署了这个项目。请参阅屏幕截图# 13

  13. 已验证强名称密钥文件已添加到项目中。请参阅屏幕截图# 14

  14. 建立项目。这次DLL已成功添加到GAC。请参阅屏幕截图# 15

  15. 已验证DLL已正确复制到路径C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\。请参阅屏幕截图# 8

  16. 已验证DLL存在于GAC文件夹C:\windows\assembly中。请参阅屏幕截图# 16

  17. 在SSIS包上,从“工具箱”中的“控制流项目”部分删除了控制HTTP任务。请参阅屏幕截图# 17

  18. 重复步骤# 9 和# 10 ,将任务再次添加到工具箱中。

  19. 将任务拖放到“控制流”选项卡上,任务显示正确。这次没有错误。请参阅屏幕截图# 18

  20. 希望有所帮助。

    C#类代码:

    using Microsoft.SqlServer.Dts.Runtime;
    
    namespace HttpTask
    {
        [DtsTask(
            DisplayName = "HTTP Task",
            TaskContact = "Iain Elder",
            RequiredProductLevel = DTSProductLevel.None
        )]
        public class HttpTask : Task
        {
            public string LocalPath { get; set; }
            public string Connection { get; set; }
            public bool OverwriteDestination { get; set; }
    
            public DTSExecResult Execute(Connections connections,
                VariableDispenser dispenser, IDTSComponentEvents events,
                IDTSLogging log, object transaction)
            {
                HttpClientConnection http = AcquireHttpConnection(connections);
                http.DownloadFile(this.LocalPath, this.OverwriteDestination);
                return DTSExecResult.Success;
            }
    
            private HttpClientConnection AcquireHttpConnection(Connections connections)
            {
                ConnectionManager cm = connections[this.Connection];
                object nativeConnection = cm.AcquireConnection(null);
                return new HttpClientConnection(nativeConnection);
            }
        }
    }
    

    构建后事件命令行:

    "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe" 
    /if "$(TargetPath)"
    copy $(TargetFileName) 
    "C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\"
    

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

    屏幕截图#11:

    11

    屏幕截图#12:

    12

    屏幕截图#13:

    13

    屏幕截图#14:

    14

    屏幕截图#15:

    15

    屏幕截图#16:

    16

    屏幕截图#17:

    17

    屏幕截图#18:

    18