我有一个脚本任务,该任务创建一个自定义对象列表并将它们设置为SSIS对象变量.
自定义类:
public class Dog
{
public string Name { get; set; }
}
填充列表并将其设置为SSIS对象变量“ myDogs”的代码:
public void Main()
{
List<Dog> dogs = new List<Dog>();
Dog dog1 = new Dog();
dog1.Name = "Fido";
Dog dog2 = new Dog();
dog1.Name = "Roofus";
dogs.Add(dog1);
dogs.Add(dog2);
Dts.Variables["myDogs"].Value = dogs;
}
在第二个脚本任务中,我试图将我的“ myDogs”对象变量读回到列表中:
在第二个脚本任务中复制的自定义类:
public class Dog
{
public string Name { get; set; }
}
我的第二个脚本任务中的主要代码:
public void Main()
{
var varDogs = Dts.Variables["myDogs"].Value;
List<Dog> dogs = new List<Dog>();
dogs = (List<Dog>)varDogs;
}
我的varDogs对象从SSIS对象变量“ myDogs”正确加载了数据.但是,当我尝试将varDogs强制转换为Dog类型的列表时,我收到一条错误消息,提示“无法强制转换System.Collections.Generic.List类型的对象”.
有谁知道我将如何将该var数据重新投射到列表中?谢谢.
解决方法:
在尝试任何其他操作之前,请将自定义类编译为.dll,然后将其安装到GAC(全局程序集缓存)中.在与自定义对象进行交互时,SSIS确实很挑剔,并且希望在那里找到对它们的引用.可以找到here的GAC安装的MSDN示例.安装.dll后,只需在脚本任务中将其引用即可,SSIS会自动搜索GAC签名.
这是在SSIS中管理自定义对象的正确方法,因为您在两个脚本任务中都引用一个类.尽管当前的两个脚本任务之间的类相同,但是您的错误表明它们来自单独的命名空间.
正如其他人所建议的那样,序列化是可行的,但这至少是一个棘手的解决方案,因为您必须在两面都维护类(脚本任务1和脚本任务2).在开始使用复杂类型之前,最好先熟悉本机SSIS解决方案:)