【问题标题】:Custom Transformation works in SSDT 2012 but not SSDT 2015自定义转换适用于 SSDT 2012 但不适用于 SSDT 2015
【发布时间】:2018-09-14 06:08:10
【问题描述】:

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

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

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

在将代码附加到 SSDT 2015 进程以进行调试时,它会在 ProvideComponentProperties() 方法中阻塞(有关代码 sn-p,请参见下文)。

代码片段:

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:

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

无法将组件添加到数据流任务。不能 初始化组件。存在潜在问题 提供组件属性方法。 (微软视觉工作室)

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

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

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

无法将“System.__ComObject”类型的 COM 对象转换为接口 类型 'Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100'。 此操作失败,因为 COM 上的 QueryInterface 调用 带有 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)

编辑#1TargetServerVersion 属性(在 Integration Services 项目配置属性中)更新为 SQL Server 2016(从 2017 年开始)。这样做让我克服了上面的错误,但是,导致了一个新的错误。进展吗?

错误 #2:

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

无法将组件添加到数据流任务。不能 初始化组件。存在潜在问题 提供组件属性方法。 (微软视觉工作室)

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

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

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

找不到方法: 'Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100 Microsoft.SqlServer.Dts.Pipeline.PipelineComponent.get_ComponentMetaData()'。 (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)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我将 Integration Services 项目的 TargetServerVersion 更新为 SQL Server 2016,这给了我一个不同的错误。我已经更新了原始帖子以反映这一点。有没有办法缓解自定义任务中的升级/版本问题?本质上,有没有办法开发更兼容版本的自定义任务?
    • 我不知道,但这并不意味着它不能完成 - 只是我停止寻找。在 2005 年到 2008 年期间更改设置的恶作剧足以让我对我还没有真正回到创建自定义组件的体验感到不满。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2012-05-02
    相关资源
    最近更新 更多