Object 传递自定义对象的SSI

Object 传递自定义对象的SSI,object,casting,ssis,Object,Casting,Ssis,我在一个流任务中创建了一个自定义类,并为其属性赋值。 我将这些自定义类的集合存储在对象变量中 稍后在另一个脚本任务中,我想从这个自定义对象集合中读取值 自定义类在其他ssis组件中未知。我无法创建dll并将其存储在SQL server上,因此无法传输自定义对象集合 我可以让他们进入脚本任务,他们拥有所有属性和正确的值,但似乎没有办法访问这些属性。我复制了自定义类,并尝试铸造它,但SSIS知道它不是同一个,不会玩球 如何访问此数据 Erick首先,如果要在SSIS项目中正确使用自定义类库(以便能够

我在一个流任务中创建了一个自定义类,并为其属性赋值。 我将这些自定义类的集合存储在对象变量中 稍后在另一个脚本任务中,我想从这个自定义对象集合中读取值

自定义类在其他ssis组件中未知。我无法创建dll并将其存储在SQL server上,因此无法传输自定义对象集合

我可以让他们进入脚本任务,他们拥有所有属性和正确的值,但似乎没有办法访问这些属性。我复制了自定义类,并尝试铸造它,但SSIS知道它不是同一个,不会玩球

如何访问此数据


Erick

首先,如果要在SSIS项目中正确使用自定义类库(以便能够在整个包中使用它),必须使用强名称对程序集进行签名。并将其添加到GAC。我不知道还有别的办法。然后你可以从你的项目中引用它

另一件事是必须使用范围正确的变量来填充对象图中的某个地方。然后您可以在以后检索它,例如在其他脚本任务中


另外,最后它指出了dll的存放位置,这样也许您就不必对其进行签名了(?!?)

我建议您将数据存储在DataSet对象中-这样您就可以始终访问其他脚本任务/组件中的数据。 例如,在您的第一个脚本任务中,使用

...
DataSet dataSet = new DataSet("Data");
DataTable table = dataSet.Tables.Add("Table");
Dts.Variables["VariableOfTypeObject"].Value = dataSet;
...
在另一个脚本任务中,通过

Dataset myData = Dts.Variables{"VariableOfTypeObject"].Value as DataSet;

或者,如果您正在寻找在数据流中对象类型的SSIS变量中存储数据的本机方法,则可以使用“记录集目标”。

如果您实际上无法创建自定义DLL或自定义SSIS组件,您唯一的选择将是在您的消费脚本中使用,以找到适当的方法/属性并动态访问它们

这将是一项巨大的工作,SSIS提供的编程环境对它并没有真正的帮助。如果您真的无法将非包代码部署到服务器上,我将认真重新考虑需要该自定义类的体系结构

编辑:简单访问并不像我想象的那么难。假设您有一个名为“SomeObject”的
Object
类型的包级变量,您可以构建如下控制流:

SCR_设置变量的代码为:

使用系统;
使用系统数据;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
名称空间ST_00e1230a50e6470e8324a14e9d36f6c7.csproj
{
[System.AddIn.AddIn(“ScriptMain”,Version=“1.0”,Publisher=”“,Description=”“)]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#区域VSTA生成代码
枚举脚本结果
{
Success=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Success,
Failure=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Failure
};
#端区
上课
{
公共字符串问候语{get;set;}
公共重写字符串ToString()
{
返回String.Format(“我的问候语是{0}”,this.greeting);
}
}
公共图书馆
{
SomeClass myClass=新的SomeClass();
myClass.Greeting=“你好,世界!”;
变量[“SomeObject”]。值=myClass;
Dts.TaskResult=(int)ScriptResults.Success;
}
}
}
SCR_ShowVariables的代码为:

使用系统;
使用系统数据;
使用Microsoft.SqlServer.Dts.Runtime;
使用System.Windows.Forms;
运用系统反思;
命名空间ST_eea68a39bda44e9d9afaa07d2e48fc0f.csproj
{
[System.AddIn.AddIn(“ScriptMain”,Version=“1.0”,Publisher=”“,Description=”“)]
公共部分类ScriptMain:Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#区域VSTA生成代码
枚举脚本结果
{
Success=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Success,
Failure=Microsoft.SqlServer.Dts.Runtime.dtsesecresult.Failure
};
#端区
公共图书馆
{
object someObject=Dts.Variables[“someObject”].Value;
PropertyInfo getGreeting=someObject.GetType().GetProperty(“问候”);
string greeting=(string)getGreeting.GetValue(someObject,null);
string msg=string.Format(“someObject.Greeting='{0}',Greeting);
System.Windows.Forms.MessageBox.Show(msg);
Dts.TaskResult=(int)ScriptResults.Success;
}
}
}
这将显示以下消息框:


或者,您可以创建一个.Net库项目,将其添加到GAC中,并在脚本中引用它(如果您不知道如何进行反射)。

被否决,因为“SSIS变量的对象类型不是.Net对象,它是伪装的ADO.Net数据集”的说法完全是胡说八道。对象类型是.NET对象。当您尝试将任何其他对象类型存储在Object类型的SSIS变量中,以及在调试模式下设置断点并将该变量添加到监视列表中时,调试器会将其显示为类似COM对象的内容。只有将数据集传递到此变量时,它才会按预期工作。这就是为什么我写它是一个伪装的.net对象。请参见此处:我更正了我的答案-您在上面证明了这一点,SSIS对象变量it是一个真实的.Net对象。但是,如果您处于调试模式,如果您试图查看SSIS变量,它将只适用于数据集。。。对于不需要通过反射的数据集,您可以轻松访问其他脚本tak/组件中的对象。在编辑后删除下一票以删除不准确的cla