2010-06-03 123 views
0

在我的腳本組件中,我試圖執行Stored Procedure =>,其中返回多行=>其中需要生成輸出行。爲每個InputRow + SSIS腳本組件執行存儲過程

代碼如下:

/* 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); 
} 

}

這總是跳過第一行。

while(Row.NextRow())總是引入輸入緩衝區的第二行。

我在做什麼錯。

感謝

回答

1

明白了,我的SqlCommand需要在InputRows_ProcessInputRow的局部範圍犯規要做NextRow()。謝謝

1

你可以改變whiledo while循環呢?

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