2010-06-03 4 views
0

Dans mon composant Script, j'essaie d'exécuter Stored Procedure => qui renvoie plusieurs lignes => qui doivent générer des lignes de sortie.Exécution de la procédure stockée pour chaque composant InputRow + Script SSIS

code comme ci-dessous:

/* Microsoft SQL Server Integration Services Script Component 
* Write scripts using Microsoft Visual C# 2008. 
* ScriptMain is the entry point class of the script.*/ 

    using System; 
    using System.Data; 
    using System.Data.SqlClient; 
    using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 
    using Microsoft.SqlServer.Dts.Runtime.Wrapper; 

    [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 
    public class ScriptMain : UserComponent 
{ 
SqlConnection cnn = new SqlConnection(); 
IDTSConnectionManager100 cnManager; 
//string cmd; 
SqlCommand cmd = new SqlCommand(); 

public override void AcquireConnections(object Transaction) 
{ 
    cnManager = base.Connections.myConnection; 
    cnn = (SqlConnection)cnManager.AcquireConnection(null); 
} 

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

public override void PostExecute() 
{ 
    base.PostExecute(); 
} 

public override void InputRows_ProcessInputRow(InputRowsBuffer Row) 
{ 
    while(Row.NextRow()) 
    { 
     DataTable dt = new DataTable(); 
     cmd.Connection = cnn; 
     cmd.CommandText = "OSPATTRIBUTE_GetOPNforOP"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("@NK", SqlDbType.VarChar).Value = Row.OPNK.ToString(); 
     cmd.Parameters.Add("@EDWSTARTDATE", SqlDbType.DateTime).Value = Row.EDWEFFECTIVESTARTDATETIME; 
     SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
     adapter.Fill(dt); 

     foreach (DataRow dtrow in dt.Rows) 
     { 
      OutputValidBuffer.AddRow(); 
      OutputValidBuffer.OPNK = Row.OPNK; 
      OutputValidBuffer.OSPTYPECODE = Row.OSPTYPECODE; 
      OutputValidBuffer.ORGPROVTYPEDESC = Row.ORGPROVTYPEDESC; 
      OutputValidBuffer.HEALTHSECTORCODE = Row.HEALTHSECTORCODE; 
      OutputValidBuffer.HEALTHSECTORDESCRIPTION = Row.HEALTHSECTORDESCRIPTION; 
      OutputValidBuffer.EDWEFFECTIVESTARTDATETIME = Row.EDWEFFECTIVESTARTDATETIME; 
      OutputValidBuffer.EDWEFFECTIVEENDDATETIME = Row.EDWEFFECTIVEENDDATETIME; 
      OutputValidBuffer.OPQI = Row.OPQI; 

      OutputValidBuffer.OPNNK = dtrow[0].ToString(); 
      OutputValidBuffer.OSPNAMETYPECODE = dtrow[1].ToString(); 
      OutputValidBuffer.NAMETYPEDESC = dtrow[2].ToString(); 
      OutputValidBuffer.OSPNAME = dtrow[3].ToString(); 
      OutputValidBuffer.EDWEFFECTIVESTARTDATETIME1 = Row.EDWEFFECTIVESTARTDATETIME; 
      OutputValidBuffer.EDWEFFECTIVEENDDATETIME1 = Row.EDWEFFECTIVEENDDATETIME; 
      OutputValidBuffer.OPNQI = dtrow[6].ToString(); 

     } 

    } 
} 
public override void ReleaseConnections() 
{ 
    cnManager.ReleaseConnection(cnn); 
} 

}

Cette saute toujours la première ligne.

while (Row.NextRow()) amène toujours la deuxième ligne du tampon d'entrée.

Qu'est-ce que je fais mal.

Merci

Répondre

1

Got, mon SqlCommand besoin d'être portée locale de InputRows_ProcessInputRow et n'a pas besoin de faire NextRow(). Merci

1

Pouvez-vous changer la while pour une place boucle do while?

do 
{ 
    // all the gubbings here 
} while (Row.NextRow()); 
Questions connexes