我正在尝试构建一个简单的自定义SSIS组件,该组件查看单个输入列并对其进行验证,根据每行的值创建bool类型的输出列。
我已经成功构建了一个更简单的组件,它接受一个值并对其进行转换:这并不需要摆弄输出列。在这个例子中,我需要接受一个字符串并输出一个布尔值,组件需要知道它输出一个布尔值,所以我可以将值提供给条件分割。
我很难添加输出列。基于code samples from Microsoft,我已经这样做了:
public override DTSValidationStatus Validate()
{
IDTSOutput100 output = ComponentMetaData.OutputCollection[0];
IDTSOutputColumn100 outputcol = output.OutputColumnCollection.New();
outputcol.Name = "IsValid";
outputcol.SetDataTypeProperties(DataType.DT_BOOL, 0, 0, 0, 0);
return DTSValidationStatus.VS_ISVALID;
}
然后我尝试在ProcessInput步骤中填充它:
public override void ProcessInput(int inputID, PipelineBuffer buffer)
{
while (buffer.NextRow())
{
string str = buffer.GetString(0);
buffer.SetBoolean(0, IsValid(str)); // validation code not relevant
}
}
当我尝试在包中使用此组件时,出现此错误:
The component has detected potential metadata corruption during validation.
Error at Data Flow Task [Uppercase [24]]: System.MissingMethodException: Method not found: 'Void Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutputColumn100.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType, Int32, Int32, Int32, Int32)'.
at EmailValidation.Uppercase.Validate()
at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostValidate(IDTSManagedComponentWrapper100 wrapper)
搜索此错误消息并没有产生任何价值。
在原始样本中 - 以及其他一些在线教程 - 添加输出列是通过循环输入列并为每个输入列添加额外输出来完成的。我试过这个并得到同样的错误。
我还尝试将输出列代码从Validate
移动到OnInputPathAttached
,这仍然会产生相同的错误。
我做错了什么?
答案 0 :(得分:2)
在调查中,这似乎是SQL Server Data Tools for Visual Studio 2015中的一个错误。我在Visual Studio 2013的Integration Services包中构建,部署并使用了带有自定义输出列的自定义组件。但是,相同的工具在2015年部署在一个包中会导致所描述的错误。
答案 1 :(得分:0)
如果它仍然相关,我遇到了类似的问题(使用ComponentMetaData
属性而不是SetDataTypeProperties
),并且适合我的解决方案是设置Embed Interop Types
属性Microsoft.SqlServer.DTSPipelineWrap
和Microsoft.SQLServer.DTSRuntimeWrap
引用false
。
我找到了这个解决方案here。它被列为获取InvalidCastException
的解决方案,但无论何时引用自定义组件中的DTSPipelineWrap
或DTSRuntimeWrap
程序集,它似乎都相关。