我正在尝试为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)
答案 0 :(得分:0)
可能的罪魁祸首是您针对SQL Server 2012 SSIS绑定开发了组件。使用VS 2015,SSIS项目将2016年(甚至2017年)作为默认目标。因此,当您将任务添加到画布上时,组件绑定ID不会匹配。
您需要为2016年生成另一个版本的组件(如果要覆盖所有基础,则需要生成2014年和2017年)或更改SSIS项目的目标版本(右键单击项目本身,选择“属性”。 ... Build?部分,应该说出SSIS / SQL Server的目标版本是什么)