我在执行包时经历了一个非常特殊的情况。由于业务需求,包中所有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
答案 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