我正在尝试从SSIS包中的平面文件为变量赋值。我正在使用的脚本位于
之下#Region "Imports"
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
#End Region
' This is the class to which to add your code. Do not change the name, attributes, or parent
' of this class.
<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute()> _
<CLSCompliant(False)> _
Public Class ScriptMain
Inherits UserComponent
Dim StartDate As String
Dim FinishDate As String
Public Overrides Sub PreExecute()
MyBase.PreExecute()
End Sub
Public Overrides Sub PostExecute()
MyBase.PostExecute()
Me.ReadWriteVariables("StartDate").Value = StartDate
Me.ReadWriteVariables("FinishDate").Value = FinishDate
End Sub
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
StartDate = Row.StartDate
FinishDate = Row.FinishDate
End Sub
End Class
我遇到的问题是,有时平面文件中的字段可能为空白,当它们为空时我会收到错误:
分配给变量“User :: StartDate”的值的类型与当前变量类型不同。变量在执行期间可能不会更改类型。变量类型是严格的,除了Object类型的变量。
有没有人有任何想法可能导致错误?
答案 0 :(得分:2)
我猜这是因为当你进行任务时,该值将为null。 SSIS不支持其变量的空值。
当文件中没有值时,您想要您的变量有什么价值?如果文件中没有行,或者 一行但是StartDate和EndDate的列为空,则会出现问题吗?
如果您想要一个空字符串,请尝试更改:
Dim StartDate As String
Dim FinishDate As String
到
Dim StartDate As String = ""
Dim FinishDate As String = ""
...防止没有行的情况。在这种情况下,您的ProcessInputRow将永远不会运行,因此您需要从一开始就将字符串设置为空。
对于有行的情况,您希望防止在ProcessInputRow中将值设置为null:
If Not Row.StartDate_IsNull Then
StartDate = Row.StartDate
End If
If Not Row.EndDate_IsNull Then
EndDate = Row.EndDate
End If
虽然如果你没有在你正在使用的文件的源上勾选“将数据流中的空值保留为数据流中的空值”,但它们应该以空字符串的形式出现...
答案 1 :(得分:1)
如果空的开始日期和结束日期是有效方案,则可以使用“ColumnName”_IsNull属性来防范空字段。在您的代码中,您可以添加以下内容:
if (String.IsNullOrEmpty(Row.StartDate))
{
Row.StartDate_IsNull = true;
}
else
{
StartDate = Row.StartDate;
}