2011-09-12 4 views
1

Got it travail - Posté Ma solution ci-dessous mais savoir s'il y a une meilleure façonSSIS Scripting Component: Obtenir les enregistrements enfants pour la création d'objets

Bonjour à tous

Je suis en train de créer le domaine de l'événement pour un objet de domaine nouvellement créé (après la migration) dans ma base de données.

Pour les objets sans objet enfant interne, cela a fonctionné correctement en utilisant le composant Script. Le problème est de savoir comment obtenir les lignes enfant pour ajouter des informations à l'objet événement.

Ex. Client-> Emplacements client.

Je crée un événement dans le composant de script - en tant que transformation - (référence au module d'événements de mon domaine), puis je crée des informations sérialisées sur l'événement en tant que valeur de colonne. Les lignes d'entrée fournissent actuellement des données pour l'objet parent.

Veuillez nous aviser.

Cordialement,

Mar

Modifier 1

Je voudrais ajouter que le courant que je fais processsing dans

public override void Input0_ProcessInputRow(Input0Buffer Row) 

Je cherche quelque chose comme créer un lecteur de données dans cette fonction

Parcourez les lignes de données -> créez un objet enfant et ajoutez-le à la colonne parent

Toujours sur google et PreExecute et ProcessInput Semble quelque chose à regarder. enter image description here

Répondre

1

Ceci est ma solution. Je suis un débutant total dans SSIS, donc ce n'est peut-être pas la meilleure solution.

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 
public class ScriptMain : UserComponent 
{ 
    IDTSConnectionManager100 connectionManager; 
    SqlCommand cmd = null; 
    SqlConnection conn = null; 
    SqlDataReader reader = null; 


    public override void AcquireConnections(object Transaction) 
    { 

     try 
     { 
      connectionManager = this.Connections.ScriptConnectionManager; 
      conn = connectionManager.AcquireConnection(Transaction) as SqlConnection; 

      // Hard to debug failure- better off logging info to file 
      //using (StreamWriter outfile = 
      // new StreamWriter(@"f:\Migration.txt")) 
      //{ 
      // outfile.Write(conn.ToString()); 
      // outfile.Write(conn.State.ToString()); 
      //} 
     } 
     catch (Exception ex) 
     { 
      //using (StreamWriter outfile = 
      // new StreamWriter(@"f:\Migration.txt")) 
      //{ 
      // outfile.Write(" EEEEEEEEEEEEEEEEEEEE"+ ex.ToString()); 
      //} 
     } 




    } 


    public override void PreExecute() 
    { 
     base.PreExecute(); 

     cmd = new SqlCommand("SELECT [CustomerLocation fields] FROM customerlocationView where [email protected]", conn); 
     cmd.Parameters.Add("CustId", SqlDbType.UniqueIdentifier); 

    } 

    public override void PostExecute() 
    { 
     base.PostExecute(); 
     /* 
      Add your code here for postprocessing or remove if not needed 
      You can set read/write variables here, for example: 
      Variables.MyIntVar = 100 
     */ 
    } 

    public override void Input0_ProcessInputRow(Input0Buffer Row) 
    { 
     Collection<CustomerLocation> locations = new Collection<CustomerLocation>(); 
     cmd.Parameters["CustId"].Value = Row.id; 

     // Any error always saw that reader reamians open on connection 
     if (reader != null) 
     { 
      if (!reader.IsClosed) 
      { 
       reader.Close(); 
      } 
     } 

     reader = cmd.ExecuteReader(); 

     if (reader != null) 
     { 
      while (reader.Read()) 
      { 
       // Get Child Details 
       var customerLocation = new CustomerLocation(....,...,...,); 
       customerLocation.CustId = Row.id; 
       locations.Add(customerLocation); 
      } 



     } 






     var newCustomerCreated = new NewCustomerCreated(Row.id,,...,...,locations); 

     var serializedEvent = JsonConvert.SerializeObject(newCustomerCreated, Formatting.Indented, 
                    new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); 

     Row.SerializedEvent = serializedEvent; 
     Row.EventId = newCustomerCreated.EventId; 
     ... 
     ... 
     ... 
     .... 
     .. 
     . 
     Row.Version = 1; 



     // using (StreamWriter outfile = 
     //  new StreamWriter(@"f:\Migration.txt", true)) 
     // { 
     //  if (reader != null) 
     // { 
     //  outfile.WriteLine(reader.HasRows); 
      //outfile.WriteLine(serializedEvent); 
      // } 
      // else 
      // { 
      //  outfile.Write("reader is Null"); 
      // } 
     //} 
     reader.Close(); 
    } 



    public override void ReleaseConnections() 
    { 
     base.ReleaseConnections(); 
     connectionManager.ReleaseConnection(conn); 
    } 
} 

Une chose à noter est qu'une approche différente pour créer la connexion est obtenir la chaîne de connexion de ConnectionManager et de l'utiliser pour créer une connexion OLEDB.

Questions connexes