1

我正在尝试从 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 类型的变量。

有没有人有任何想法可能导致错误?

4

2 回答 2

2

我猜那是因为当您进行分配时该值将为空。SSIS 不支持其变量的空值。

当文件中没有值时,您希望变量具有什么值?当文件中没有行时,或者当有一行但 StartDate 和 EndDate 的列为空时,是否会出现问题

如果您想要一个空字符串,请尝试更改:

Dim StartDate As String
Dim FinishDate As String

Dim StartDate As String = ""
Dim FinishDate As String = ""

...防止出现没有行的情况。在这种情况下,您的 ProcessInputRow 将永远不会运行,因此您需要从一开始就将字符串设置为空。

对于有行的情况,您要防止在 ProcessInputRow 中将值设置为空:

If Not Row.StartDate_IsNull Then
    StartDate = Row.StartDate
End If

If Not Row.EndDate_IsNull Then
    EndDate = Row.EndDate
End If

尽管如果您没有在您正在使用的文件的源上勾选“将源中的空值保留为数据流中的空值”,那么它们无论如何都应该作为空字符串出现......

于 2013-09-10T10:20:11.723 回答
1

如果空的开始日期和结束日期是有效的方案,您可以使用 'ColumnName'_IsNull 属性来防止出现空字段。在您的代码中,您可以添加如下内容:

if (String.IsNullOrEmpty(Row.StartDate))
{       
Row.StartDate_IsNull = true;
}        
else        
{            
StartDate = Row.StartDate;           
}
于 2013-09-10T10:18:42.517 回答