object - example - ssis cast datetime to string
SSIS pasando objetos personalizados (4)
En primer lugar, si desea utilizar correctamente una biblioteca de clases personalizada en su proyecto SSIS (para poder usarla en todo el paquete), debe firmar su ensamblado con el nombre seguro. Y agrégalo a GAC. No sé de otra manera. Y luego puedes referenciarlo desde tu proyecto.
Otra cosa es que debes usar la variable con el tamaño adecuado para rellenar tu diagrama de objetos en algún lugar. Luego podrá recuperarlo más tarde, por ejemplo, en alguna otra tarea de script.
HTH
PD: mira esto , al final dice dónde poner el dll así que tal vez no tengas que firmarlo después de todo (?!?)
Creé una clase personalizada en una de mis tareas de flujo y le asigno valores a sus propiedades. Guardo la colección de estas clases personalizadas en la variable Object Más adelante, en una tarea de script diferente, quiero leer los valores de esta colección de objetos personalizados.
La clase personalizada es desconocida en los otros componentes de ssis. No puedo crear un dll y almacenarlo en el servidor SQL, así que cómo transportar la colección de objetos personalizados.
Puedo llevarlos a las tareas del script y tienen todas las propiedades y los valores correctos, pero no parece haber una forma de acceder a las propiedades. Dupliqué la clase personalizada e intenté lanzarla, pero SSIS sabe que no es la misma y no jugará.
¿Cómo accedo a esta información?
Erick
Si, de hecho, no puede crear una DLL personalizada o un componente de SSIS personalizado, su única alternativa será utilizar la reflexión .NET en sus secuencias de comandos de consumo para encontrar los métodos / propiedades adecuados y acceder a ellos de forma dinámica.
Esa será una cantidad significativa de trabajo, y el entorno de programación ofrecido por SSIS no es realmente propicio para ello. Si realmente no puede implementar código que no sea un paquete en sus servidores, seriamente volvería a pensar en la arquitectura que necesita esa clase personalizada.
EDITAR: el acceso simple no fue tan difícil como pensé que podría ser. Suponiendo que tiene una variable de nivel de paquete de tipo Object
llamado "SomeObject", podría generar un flujo de control como este:
El código para SCR_SetVariables es:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_00e1230a50e6470e8324a14e9d36f6c7.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
class SomeClass
{
public string Greeting { get; set; }
public override string ToString()
{
return String.Format("My greeting is {0}", this.Greeting);
}
}
public void Main()
{
SomeClass myClass = new SomeClass();
myClass.Greeting = "Hello, world!";
Dts.Variables["SomeObject"].Value = myClass;
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
y el código para SCR_ShowVariables es:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Reflection;
namespace ST_eea68a39bda44e9d9afaa07d2e48fc0f.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public void Main()
{
object someObject = Dts.Variables["SomeObject"].Value;
PropertyInfo getGreeting = someObject.GetType().GetProperty("Greeting");
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;
}
}
}
Esto mostrará el siguiente mensaje:
Yo recomendaría almacenar sus datos en el objeto DataSet, de esta manera siempre puede acceder a sus datos en otras tareas / componentes de script. Por ejemplo, en su primera tarea de secuencia de comandos almacenar sus datos con
...
DataSet dataSet = new DataSet("Data");
DataTable table = dataSet.Tables.Add("Table");
Dts.Variables["VariableOfTypeObject"].Value = dataSet;
...
y en la otra tarea de script acceder a ella a través de
Dataset myData = Dts.Variables{"VariableOfTypeObject"].Value as DataSet;
Alternativamente, si está buscando una forma nativa de almacenar datos en una variable SSIS de tipo objeto dentro de un flujo de datos, puede usar el "Destino de conjunto de registros".
Alternativamente, puede crear un proyecto de biblioteca .Net, agregarlo al GAC y hacer referencia a él en sus scripts si no tiene qué ir a la ruta de reflexión.