SSIS脚本组件* bug * - PipelineBuffer类不支持列数据类型DT_DBDATE

时间:2015-03-03 21:51:36

标签: sql-server ssis

有没有人确切知道为什么会发生这些类型的问题使用脚本组件,可以通过删除并重新添加相同的代码来修复此类问题来“修复”?为什么删除和重新添加代码时元数据会发生变化?发生这种情况时发动机内部会发生什么?它可以修复什么样的问题来删除和重新添加脚本组件,复制相同的代码并重新连接它?

我可以通过以下步骤随意复制:

  1. 使用脚本组件和两个输出缓冲区获取工作包。脚本组件还为第二个输出缓冲区设置了其他输入列和输出列,这些输出列尚未由源查询(OLE DB源SQL命令)填充。源查询的第二个输出缓冲区中只填充了一列。
  2. 在新的源查询中复制,并为第二个输出缓冲区添加其他列。
  3. 运行包。获取错误消息PipelineBuffer类不支持列数据类型DT_DBDATE。
  4. 注释掉第二个输出缓冲区的两行,运行包,包运行成功:

    RedactedOutputBuffer.AddRow();

    RedactedOutputBuffer。 RedactedColumnName = Row。 RedactedColumnName;

  5. 取消注释 相同的 两行。包仍然有效。 所以包裹现在与它不起作用时完全相同。

1 个答案:

答案 0 :(得分:-2)

嗯,不,这不是一个真正的错误,它更像是SSIS不会试图聪明并且适合圆孔中的方形钉。

我的意思是错误信息非常清楚,不是吗? PipelineBuffer类没有任何方法来处理DT_DBDATE的数据类型。所以它会引发你UnsupportedBufferDataTypeException

  

将值分配给缓冲区列时引发的异常   包含不正确的数据类型。

无论如何,由于你没有打印完整的错误消息堆栈,很难说完全但我的猜测是它试图在你的破坏列上调用SetDateTime(或GetDateTime)。因此,当您设置源查询时,它会将管道缓冲区的数据类型设置为DT_DBDATE,但是当您将其注释掉时,让它运行,然后取消注释,它已将管道缓冲区的数据类型转换为DT_DBTIMESTAMP,这与SetDateTime兼容或者从PipelineBuffer类中调用的任何方法都会引发错误。

无论如何,this MSDN post应该会让你对你所看到的内容有更多的了解,但最重要的是确保来自你的源查询的字段被正确识别为你想要的字段类型在你的目的地。如果这是一个SQL Server日期时间字段,您需要在源查询中将其强制转换为日期时间,或者使用数据转换组件为脚本组件显式转换它。