【问题标题】:Occasional Script Task error in SSISSSIS 中的偶尔的脚本任务错误
【发布时间】:2016-11-28 09:33:08
【问题描述】:

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

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

System.ArgumentOutOfRangeException:年、月和日参数 描述一个无法表示的日期时间

毫秒值超出范围(不在 0 和 999 之间)。

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

描述:未指定的错误结束错误错误:2016-11-24 10:51:03.37 代码:0xC0047062 来源:Dft_x [279]
说明:System.ArgumentOutOfRangeException:年、月和日 参数描述了一个不可表示的日期时间。在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(异常 吃 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID,PipelineBuffer 缓冲区)在 Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProcessInput(IDTSManagedComponentWrapper100 包装器,Int32 inputID,IDTSBuffer100 pDTSBuffer,IntPtr bufferWirePacket) End Error 错误:

&

[SSIS.Pipeline] 错误:SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED。这 平面文件源 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_INDUCEDTRANSFORMFAILUREON错误。 “OleDst_xyz.Inputs[OLE DB Destination Input]" 失败,因为发生错误代码 0xC020907A, 以及“OleDst_xyz.Inputs[OLE DB Destination Input]" 指定错误时失败。错误发生在 指定组件的指定对象。可能有错误 在此之前发布的消息,其中包含有关失败的更多信息。

[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

【问题讨论】:

    标签: vb.net ssis buffer


    【解决方案1】:

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

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

       ResultBuffer.Datecolumn = CDate(strDate)
    

    【讨论】:

    • 对于日期列,输入是通过 GETDATE() 在此任务之前使用派生列提供的。
    • 那么也许是不同的专栏,但答案的大致点仍然是正确的。它与数据相关,您有时会尝试将值填充到无法容纳它的数据类型中。一种解决方案是在错误发生时使用 TRY..CATCH 进行处理。
    【解决方案2】:

    如果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

    【讨论】:

    • strDate 在脚本任务之前通过派生列从 GETDATE() 获取输入。是否仍需要使用 Date.ParseExact()?
    • @MominGoni GETDATE() 取决于 SQL Server 排序规则,CDATE() 取决于机器区域设置
    • @MominGoni 尝试使用列类型DB_TIMESTAMP 而不是DT_DATE
    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多