0

私のスクリプトコンポーネントで、複数の行を返すストアドプロシージャ=>を実行しようとしています=>そのうちの出力行を生成する必要があります。

以下のようにコーディングします。

/* 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番目の行をもたらします。

私は何を間違っているのですか。

ありがとう

4

2 に答える 2

1

while代わりにfordo whileループを変更できますか?

do
{
   // all the gubbings here
} while (Row.NextRow());
于 2010-06-03T05:20:42.410 に答える
1

わかりました。SqlCommand は InputRows_ProcessInputRow のローカル スコープ内にある必要があり、NextRow() を実行する必要はありません。ありがとう

于 2010-06-03T05:29:59.913 に答える