为每个InputRow + SSIS脚本组件执行存储过程

时间:2010-06-03 04:55:11

标签: c#-3.0 ssis script-component

在我的脚本组件中,我尝试执行存储过程=>返回多行=>其中需要生成输出行。

代码如下:

/* 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())总是带来输入缓冲区的第二行。

我做错了什么。

由于

2 个答案:

答案 0 :(得分:1)

您可以更改while循环的do while吗?

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

答案 1 :(得分:1)

知道了,我的SqlCommand需要在InputRows_ProcessInputRow的本地范围内,并且不需要做NextRow()。感谢