支持自定义组件中的多目标

适用范围:SQL Server Azure 数据工厂中的 SSIS Integration Runtime

现在可以在 SQL Server Data Tools (SSDT) 中使用 SSIS 设计器来创建、维护和运行面向 SQL Server 2016、SQL Server 2014 或 SQL Server 2012 的包。 若要获取用于 Visual Studio 2015 的 SSDT,请参阅下载最新的 SQL Server Data Tools

在解决方案资源管理器中,右键单击 Integration Services 项目并选择“属性” 以打开该项目的属性页。 在“配置属性”的“常规”选项卡上,选择“TargetServerVersion”属性,然后选择 SQL Server 2016、SQL Server 2014 或 SQL Server 2012。

项目属性对话框中的 TargetServerVersion 属性

自定义组件的多版本支持和多目标

五种 SSIS 自定义扩展都支持多目标。

  • 连接管理器
  • 任务
  • 枚举器
  • 日志提供程序
  • 数据流组件

对于托管扩展,SSIS 设计器会为指定的目标版本加载扩展版本。 例如:

  • 如果目标版本为 SQL Server 2012,设计器会加载扩展的 2012 版本。
  • 如果目标版本为 SQL Server 2016,设计器则加载扩展的 2016 版本。

COM 扩展不支持多目标。 无论指定的目标版本是什么,SSIS 设计器始终为当前版本的 SQL Server 加载 COM 扩展。

添加对多版本和多目标的基本支持

有关基本指南,请参阅 Getting your SSIS custom extensions to be supported by the multi-version support of SSDT 2015 for SQL Server 2016(让 SSIS 自定义扩展获得用于 SQL Server 2016 的 SSDT 2015 多版本支持的支持)。 此博客文章介绍了以下步骤或要求。

  • 将程序集部署到相应的文件夹。

  • 为 SQL Server 2014 和较高版本创建扩展映射文件。

添加代码以切换版本

在自定义连接管理器、任务、枚举器或日志提供程序中切换版本

对于自定义连接管理器、任务、枚举器或日志提供程序,在 SaveToXML 方法中添加降级逻辑。

public void SaveToXML(XmlDocument doc, IDTSInfoEvents events)
{
    if (TargetServerVersion == DTSTargetServerVersion.SQLServer2014)
    {
        // Add logic to downgrade from SQL Server 2016 to SQL Server 2014.
    }

    if (TargetServerVersion == DTSTargetServerVersion.SQLServer2012)
    {
         // Add logic to downgrade from SQL Server 2016 to SQL Server 2012.
    }
}

在自定义数据流组件中切换版本

对于自定义连接管理器、任务、枚举器或日志提供程序,在新的 PerformDowngrade 方法中添加降级逻辑。

public override void PerformDowngrade(int pipelineVersion, DTSTargetServerVersion targetServerVersion)
{
    if (targetServerVersion == DTSTargetServerVersion.DTSTSV_SQLSERVER2014)
    {
        // Add logic to downgrade from SQL Server 2016 to SQL Server 2014.
        ComponentMetaData.Version = 8;
    }

    if (targetServerVersion == DTSTargetServerVersion.DTSTSV_SQLSERVER2012)
    {
          // Add logic to downgrade from SQL Server 2016 to SQL Server 2012.
        ComponentMetaData.Version = 6;
    }
}

常见错误

InvalidCastException

错误消息。 无法将类型为 "System.__ComObject" 的 COM 对象强制转换为接口类型 "Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100"。 此操作失败的原因是对 IID 为 "{BE8C48A3-155B-4810-BA5C-BDF68A659E9E}" 的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此类接口(异常来自 HRESULT: 0x80004002 (E_NOINTERFACE))。 (Microsoft.SqlServer.DTSPipelineWrap)。

解决方案。 如果自定义扩展引用 Microsoft.SqlServer.DTSPipelineWrap 或 Microsoft.SqlServer.DTSRuntimeWrap 等 SSIS 互操作程序集,将“嵌入互操作类型”属性的值设置为“False”。

嵌入互操作类型

当目标版本为 SQL Server 2012 时无法加载某些类型

此问题会影响某些类型,比如 IErrorReportingService 或 IUserPromptService。

错误消息(示例)。 未能从程序集 "Microsoft.DataWarehouse, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 中加载类型 "Microsoft.DataWarehouse.Design.IErrorReportingService"。

解决方法: 当目标版本为 SQL Server 2012 时,不使用这些接口,而改用 MessageBox。