SSIS中的偶然脚本任务错误

时间:2016-11-28 09:33:09

标签: vb.net ssis buffer

我在执行包时经历了一个非常特殊的情况。由于业务需求,包中所有DFT中的派生列已替换为脚本任务。

在开发时执行包会导致错误声明偶尔出现错误,因为' 值太大而无法添加到缓冲区'有时脚本任务失败说明

  

System.ArgumentOutOfRangeException:年,月和日参数   描述不可表示的DateTime

OR

  

毫秒值超出界限(不在0和999之间)。

执行期间收到的其他一些错误消息如下: -

  

描述:未指定的错误结束错误错误:2016-11-24   10:51:03.37代码:0xC0047062来源:Dft_x [279]
  描述:System.ArgumentOutOfRangeException:年,月和日   参数描述了不可表示的DateTime。在   Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(例外   吃   Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(的Int32   inputID,PipelineBuffer buffer)at   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProcessInput(IDTSManagedComponentWrapper100   包装器,Int32 inputID,IDTSBuffer100 pDTSBuffer,IntPtr   bufferWirePacket)结束错误错误:

&安培;

  

[SSIS.Pipeline]错误:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。该   Flat File Source 1上的PrimeOutput方法返回错误代码   0xC02020C4。组件在管道时返回了失败代码   引擎称为PrimeOutput()。失败代码的含义是   由组件定义,但错误是致命的和管道   停止执行。在此之前可能会发布错误消息   有关失败的更多信息。

     

[OleDst_Pricing [165]]错误:SSIS错误代码DTS_E_OLEDBERROR。一个   发生OLE DB错误。错误代码:0x80004005。 OLE DB记录是   可用。来源:" Microsoft SQL Server Native Client 11.0"   Hresult:0x80004005描述:"日期格式无效"。   [OleDst_xyz [165]]错误:出现错误   OleDst_xyz.Inputs [OLE DB目标输入] .Columns [DateColumn] on   OleDst_xyz.Inputs [OLE DB目标输入]。列状态   返回的是:"转换失败,因为数据值溢出了   指定的类型。"。 [OleDst_x [165]]错误:SSIS错误代码   DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 " OleDst_xyz.Inputs [OLE   数据库目标输入]"失败,因为发生错误代码0xC020907A,   " OleDst_xyz.Inputs [OLE DB   目的地输入]"指定错误失败。发生错误   指定组件的指定对象。可能有错误   在此之前发布的消息以及有关失败的更多信息。

     

[FltSrc_x 1 [313]]错误:尝试向行添加行   数据流任务缓冲区失败,错误代码为0xC0047020。

     

[SSIS.Pipeline]错误:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。该   FltSrc_BR_x 1上的PrimeOutput方法返回错误代码   0xC02020C4。组件在管道时返回了失败代码   引擎称为PrimeOutput()。失败代码的含义是   由组件定义,但错误是致命的和管道   停止执行。在此之前可能会发布错误消息   有关失败的更多信息。

然而,经过调整 DefaultMaxBufferRows& DefaultMaxBufferSize属性,我在开发和测试环境中成功地通过SQL Server执行了大约40次包,以确保它不会再次失败。但生产执行再次失败,具有类似的日期特定错误。

我发布的脚本任务中包含的代码在每个DFT中都类似: -

Public Class ScriptMain
    Inherits UserComponent
    Dim xyzArray() As String
    Dim rowValue As String
    Dim strDate As String
    Dim columnxyz As String '= Me.Variables.MaterialMaster.ToString()
    'Dim v1 As IDTSVariables100


Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    rowValue = Row.XYZtoABC.ToString() + "~".ToString()
    xyzArray = rowValue.Split(New Char() {"~"c})
    strDate = Row.DateColumn.ToString()
    columnxyz = Row.columnxyz.ToString()
    CreateNewOutputRows()

End Sub

Public Sub CreateNewOutputRows()

    ResultBuffer.AddRow()
    ResultBuffer.xyz1 = xyzArray(1)
    ResultBuffer.xyz2 = xyzArray(2)
    ResultBuffer.xyz3 = xyzArray(3)
    ResultBuffer.xyz4 = xyzArray(4)
    ResultBuffer.xyz5 = xyzArray(5)


    ResultBuffer.Datecolumn = CDate(strDate)
    ResultBuffer.columnxyz = columnxyz

End Sub

End Class

2 个答案:

答案 0 :(得分:0)

问题与数据有关。您偶尔会导入无法表示为日期的数据,并尝试将其输出为日期。由于您没有任何代码来捕获它,因此您收到错误。

您可以将此行放在TRY .. CATCH块中,并决定在无法将字符串转换为日期的情况下该怎么做:

   ResultBuffer.Datecolumn = CDate(strDate)

答案 1 :(得分:0)

如果strDate具有特定格式(即:"dd-MM-yyyy HH:mm:ss")。您必须使用Date.ParseExact()函数,如下所示:

ResultBuffer.Datecolumn = Date.ParseExact(strDate,"dd-MM-yyyy HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.None)

此外,如果您有许多特定格式,您可以声明一个字符串数组并将其传递给此函数,如下所示:

dim strFormats() as string = {"dd-MM-yyyy","yyyy-MM-dd"}
ResultBuffer.Datecolumn = Date.ParseExact(strDate,strFormats,System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.None)

CDate功能与您的区域设置相关,因此最佳做法是使用Date.ParseExact

另一点是使用DB_TIMESTAMP作为列类型而不是DT_DATE