我有一个SSIS包,根据特定标准向用户发送电子邮件,我现在想跟踪以这种方式通知的所有用户,并将摘要发送给我们的一个团队。我想将变量中通知的用户名存储为List(Of String),但我似乎无法在脚本任务中执行此操作,这是我的代码:
Public Sub Main()
Dim vars As Variables
If Dts.Variables("Users").Value Is Nothing Then
Dim users As New List(Of String)
users.Add("Enrollees: \n")
Dts.VariableDispenser.LockOneForWrite("Users", vars)
vars.Item("Users").Value = users
End If
'errors out on this line
Dim userList As List(Of String) = DirectCast(Dts.Variables("Users").Value, List(Of String))
'errors out on this line
userList.Add(Dts.Variables("FirstName").Value.ToString() & " " & Dts.Variables("LastName").Value.ToString() & " (" & Dts.Variables("Email").Value.ToString() & " )\n")
Dts.VariableDispenser.LockOneForWrite("Users", vars)
vars.Item("Users").Value = userList
Dts.TaskResult = Dts.Results.Success
End Sub
变量Users设置为Object类型,我知道你可以在其中存储复杂类型,因为我已经在其中存储了ADO.NET记录集,但我从未在代码中通过脚本任务这样做。我也尝试了CType,它也给出了同样的错误。我做错了什么?
另外我知道我可以将变量以逗号分隔的形式存储在字符串中并稍后拆分,但我想知道为什么这不起作用并坚持使用更基于对象的方法。
感谢。
答案 0 :(得分:2)
问题是Users变量从未设置为List(Of String)
- 但它也不是Nothing
。相反,SSIS已将其初始化为System.Object
,当然无法强制转换为List(Of String)
。
Public Sub Main()
Dim msg As String
If Dts.Variables("Users").Value Is Nothing Then
msg = "Dts.Variables(""Users"").Value is Nothing"
Else
msg = "Dts.Variables(""Users"").Value is an object of type " + Dts.Variables("Users").Value.GetType().FullName
End If
Dts.Events.FireInformation(0, "Main", msg, "", 0, True) ' Information: Dts.Variables("Users").Value is an object of type System.Object
' rest of your code follows
幸运的是,您需要做的就是在某个地方的脚本任务中将用户初始化为List(Of String)
。