Vb.net SSIS中偶尔出现脚本任务错误
我在执行一个包时遇到了一个非常特殊的情况。由于业务需求,包中所有DFT中的派生列都已替换为脚本任务 在开发时执行包会导致偶发错误,有时错误语句为“值太大,无法添加到缓冲区”,有时脚本任务失败 System.ArgumentOutOfRangeException:年、月和日参数 描述一个不可表示的日期时间 或 毫秒值超出范围(不在0和999之间) 执行期间收到的一些其他错误消息如下所述:- 说明:未指定错误结束错误:2016-11-24 10:51:03.37代码:0xC0047062来源:Dft_x[279]Vb.net SSIS中偶尔出现脚本任务错误,vb.net,ssis,buffer,Vb.net,Ssis,Buffer,我在执行一个包时遇到了一个非常特殊的情况。由于业务需求,包中所有DFT中的派生列都已替换为脚本任务 在开发时执行包会导致偶发错误,有时错误语句为“值太大,无法添加到缓冲区”,有时脚本任务失败 System.ArgumentOutOfRangeException:年、月和日参数 描述一个不可表示的日期时间 或 毫秒值超出范围(不在0和999之间) 执行期间收到的一些其他错误消息如下所述:- 说明:未指定错误结束错误:2016-11-24 10:51:03.37代码:0xC0047062来源:Dft
描述:System.ArgumentOutOfRange异常:年、月和日 参数描述不可表示的日期时间。在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(异常 e) 在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID,PipelineBuffer(缓冲区) Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProcessInput(IDTSManagedComponentWrapper100 包装器,Int32-inputID,IDTSBuffer100-pDTSBuffer,IntPtr 缓冲区(数据包)结束错误: & [SSIS.Pipeline]错误:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。这个 平面文件源1上的PrimeOutput方法返回错误代码 0xC02020C4。当管道运行时,组件返回了故障代码 引擎名为PrimeOutput()。故障代码的含义如下: 由组件定义,但错误是致命的,管道 停止执行。在此之前可能会发布错误消息 有更多关于失败的信息 [OleDst_定价[165]]错误:SSIS错误代码DTS_E_OLEDERROR。一 发生OLE DB错误。错误代码:0x80004005。OLEDB记录不可用 可用。来源:“Microsoft SQL Server本机客户端11.0” Hresult:0x80004005说明:“日期格式无效”。 [OleDst_xyz[165]]错误:发生错误 OleDst_xyz.Inputs[OLE DB Destination Input]。上的列[DateColumn] OleDst_xyz.Inputs[OLE DB目标输入]。列状态 返回的是:“转换失败,因为数据值溢出了 指定类型。”。[OleDst_x[165]]错误:SSIS错误代码 DTS_E_导致的传输故障或错误。“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属性之后,我在开发和测试环境中成功地单独并通过SQLServer执行了大约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
这个问题与数据有关。您有时会导入不能表示为日期的数据,并尝试将其输出为日期。由于您没有任何代码来捕获此信息,因此您将得到一个错误 你可以试试这条线。。CATCH块,并决定在字符串无法转换为日期的情况下执行的操作:
ResultBuffer.Datecolumn = CDate(strDate)
这个问题与数据有关。您有时会导入不能表示为日期的数据,并尝试将其输出为日期。由于您没有任何代码来捕获此信息,因此您将得到一个错误 你可以试试这条线。。CATCH块,并决定在字符串无法转换为日期的情况下执行的操作:
ResultBuffer.Datecolumn = CDate(strDate)
如果标准日期具有特定格式(即:
“dd-MM-yyy-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)
此外,如果有许多特定格式,可以声明字符串数组并将其传递给此函数,如下所示:
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
另一点是,如果标准日期具有特定格式(即:
“dd-MM-yyyy-HH:MM:ss”
),则使用DB\u-TIMESTAMP
作为列类型,而不是DT\u-DATE
。您必须使用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)
此外,如果有许多特定格式,可以声明字符串数组并将其传递给此函数,如下所示:
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\u TIMESTAMP
作为列类型,而不是DT\u DATE
strDate在脚本任务之前通过派生列从GETDATE()获取输入。是否仍需要使用Date.ParseExact()?@MominGoniGETDATE()
取决于SQL Server排序规则,CDATE()
取决于计算机区域settings@Mom