自定义转换适用于SSDT 2012,但不适用于SSDT 2015

时间:2018-04-04 15:34:49

标签: c# ssis sql-server-data-tools

我正在尝试为SSIS包构建自定义转换任务。我一直在关注如何执行此操作的示例,以便更好地了解所有部分如何协同工作以构建自己的部分。我已经到了尝试在数据流任务中使用自定义任务的地步。

在SSDT 2012中(使用VS 2012 Shell),我可以将它拖到设计画布上,将其连接到我的输入和输出,然后双击它以查看高级属性。

但是,在SSDT 2015(使用VS 2015社区)中,任务按预期显示在SSIS工具箱中,但是当我将其拖到设计画布上时,我收到以下错误。

将代码附加到SSDT 2015流程进行调试时,它会在ProvideComponentProperties()方法中窒息(请参阅下面的代码段)。

代码段:

public override void ProvideComponentProperties()
{
    // Set component information
    ComponentMetaData.Name = "CustomEmailValidator";
    ComponentMetaData.Description = "Transformation to validate email using Regular Expressions.";

    // Reset the component
    // Deletes each Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput100 and IDTSOutput100 from the component
    RemoveAllInputsOutputsAndCustomProperties();

    // Add an input object
    IDTSInput100 inputObject = ComponentMetaData.InputCollection.New();
    inputObject.Name = "InputToCustomEmailValidator";
    inputObject.ErrorRowDisposition = DTSRowDisposition.RD_FailComponent;

    // Add an output object
    IDTSOutput100 outputObject = ComponentMetaData.OutputCollection.New();
    outputObject.Name = "OutputFromCustomEmailValidator";
    outputObject.SynchronousInputID = inputObject.ID; // Synchronous Transform

    // Add an error object
    AddErrorOutput("ErrorFromCustomEmailValidator", inputObject.ID, outputObject.ExclusionGroup);
}

错误#1:

  

===================================

     

无法将组件添加到数据流任务中。不能   初始化组件。有一个潜在的问题   ProvideComponentProperties方法。 (Microsoft Visual Studio)

     

===================================

     

数据流任务错误[CustomEmailValidator [47]]:   System.InvalidCastException:无法转换类型的COM对象   '系统.__ ComObject'到界面类型   ' Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100&#39 ;.   此操作失败,因为QueryInterface调用COM   与IID接口的组件   ' {887BD061-82D4-4F06-A222-337D42E7F896}'由于以下原因而失败   错误:不支持此类接口(HRESULT异常:0x80004002   (E_NOINTERFACE))。在   System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc,IntPtr   pCPCMD,IntPtr& ppTarget,Boolean& pfNeedsRelease)at   Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100.set_Name(字符串   pbstrName)at   CustomEmailValidator.CustomEmailValidatorTransform.ProvideComponentProperties()   在   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProvideComponentProperties(IDTSManagedComponentWrapper100   包装器)

     

===================================

     

无法转换类型为' System .__ ComObject'的COM对象。接口   类型   ' Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100&#39 ;.   此操作失败,因为QueryInterface调用COM   与IID接口的组件   ' {887BD061-82D4-4F06-A222-337D42E7F896}'由于以下原因而失败   错误:不支持此类接口(HRESULT异常:0x80004002   (E_NOINTERFACE))。 (Microsoft.SqlServer.DTSPipelineWrap)

     

------------------------------计划地点:

     

在   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HandleUserException(例外   吃   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProvideComponentProperties(IDTSManagedComponentWrapper100   包装)   Microsoft.SqlServer.Dts.Pipeline.Wrapper.CManagedComponentWrapperClass.ProvideComponentProperties()   在   Microsoft.DataTransformationServices.Design.PipelineTaskDesigner.AddNewComponent(字符串   clsid,Boolean throwOnError,Boolean select)

编辑#1 TargetServerVersion属性(在Integration Services项目配置属性中)更新为SQL Server 2016(从2017年开始)。这样做可以解决上面的错误,但是会导致新的错误。进度?

错误#2:

  

===================================

     

无法将组件添加到数据流任务中。不能   初始化组件。有一个潜在的问题   ProvideComponentProperties方法。 (Microsoft Visual Studio)

     

===================================

     

数据流任务错误[CustomEmailValidator [41]]:   System.MissingMethodException:找不到方法:   ' Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100   Microsoft.SqlServer.Dts.Pipeline.PipelineComponent.get_ComponentMetaData()&#39 ;.   在   CustomEmailValidator.CustomEmailValidatorTransform.ProvideComponentProperties()   在   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProvideComponentProperties(IDTSManagedComponentWrapper100   包装器)

     

===================================

     

找不到方法:   ' Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100   Microsoft.SqlServer.Dts.Pipeline.PipelineComponent.get_ComponentMetaData()&#39 ;.   (Microsoft.SqlServer.DTSPipelineWrap)

     

------------------------------计划地点:

     

在   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HandleUserException(例外   吃   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProvideComponentProperties(IDTSManagedComponentWrapper100   包装)   Microsoft.SqlServer.Dts.Pipeline.Wrapper.CManagedComponentWrapperClass.ProvideComponentProperties()   在   Microsoft.DataTransformationServices.Design.PipelineTaskDesigner.AddNewComponent(字符串   clsid,Boolean throwOnError,Boolean select)

1 个答案:

答案 0 :(得分:0)

可能的罪魁祸首是您针对SQL Server 2012 SSIS绑定开发了组件。使用VS 2015,SSIS项目将2016年(甚至2017年)作为默认目标。因此,当您将任务添加到画布上时,组件绑定ID不会匹配。

您需要为2016年生成另一个版本的组件(如果要覆盖所有基础,则需要生成2014年和2017年)或更改SSIS项目的目标版本(右键单击项目本身,选择“属性”。 ... Build?部分,应该说出SSIS / SQL Server的目标版本是什么)