我编写此代码来实现通过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时,我可以在工具箱中看到任务:
当我将任务拖到设计窗口时,我看到了这个错误:
任务没有出现在设计画布上。
我在这里做错了什么?
编辑: Siva建议我以强名称签署集会。我按照指南的第1步和第2步在Benny Austin's blog上签署了程序集。我没有按照其他步骤进行操作,因为我的构建后脚本为我部署了该组件。
在Visual Studio项目属性中,我转到Signing选项卡并为程序集创建一个新的强名称密钥文件:
我保存设置并重建包。构建后脚本部署新包。
我仍然得到完全相同的错误。
答案 0 :(得分:4)
我能够重新创建您正面临的问题。以下示例介绍了如何重新创建问题以及如何解决问题。我使用Visual Studio 2010
来创建类库DLL,但目标框架版本是2.0。然后将控制流任务添加到SSIS 2008 R2
项目中,该项目与SSIS 2008大致相同。
分步流程:
在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。
将Program.cs类重命名为HttpTask.cs
并粘贴屏幕截图# 2 中显示的代码。代码与问题中提供的代码完全相同。代码也在 C#类代码部分下提供。
在类库项目Properties上,将目标框架版本更改为.NET Framework 2.0
。请参阅屏幕截图# 3 。
配置了构建后事件命令行,如屏幕截图# 4 和# 5 所示。我的计算机上的gacutil.exe路径为C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe
。您的机器中的路径可能不同。该脚本还提供了构建后事件命令行部分。
此时未签署类库。请参阅屏幕截图# 6 。
项目已构建,但dll未在GAC(全局程序集缓存)中注册。请参阅屏幕截图# 7 。
已验证DLL已正确复制到路径C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\
。请参阅屏幕截图# 8 。
已验证GAC文件夹C:\windows\assembly
中存在 的DLL。请参阅屏幕截图# 9 。
创建了一个新的SSIS包。在SSIS包的“控制流”选项卡的工具框中,右键单击Control Flow Items
部分并选择Choose Items...
。请参阅屏幕截图# 10 。
在选择工具箱项目上,选择SSIS Control Flow Items
选项卡并选择控件 HTTP任务。请参阅screnshot# 11 。
尝试将任务拖放到“控制流”选项卡上,并收到与问题中显示的错误相同的错误。请参阅屏幕截图# 12 。所以上面的步骤描述了如何模拟问题。现在,以下步骤描述了如何解决它。
现在,我回到了类库项目并单击了属性。这次我用Strong Name Key签署了这个项目。请参阅屏幕截图# 13 。
已验证强名称密钥文件已添加到项目中。请参阅屏幕截图# 14 。
建立项目。这次DLL已成功添加到GAC。请参阅屏幕截图# 15 。
已验证DLL已正确复制到路径C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Tasks\
。请参阅屏幕截图# 8 。
已验证DLL存在于GAC文件夹C:\windows\assembly
中。请参阅屏幕截图# 16 。
在SSIS包上,从“工具箱”中的“控制流项目”部分删除了控制HTTP任务。请参阅屏幕截图# 17 。
重复步骤# 9 和# 10 ,将任务再次添加到工具箱中。
将任务拖放到“控制流”选项卡上,任务显示正确。这次没有错误。请参阅屏幕截图# 18 。
希望有所帮助。
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:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#10:
屏幕截图#11:
屏幕截图#12:
屏幕截图#13:
屏幕截图#14:
屏幕截图#15:
屏幕截图#16:
屏幕截图#17:
屏幕截图#18: