在我的脚本组件中,我尝试执行存储过程=>返回多行=>其中需要生成输出行。
代码如下:
/* 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())总是带来输入缓冲区的第二行。
我做错了什么。
由于
答案 0 :(得分:1)
您可以更改while
循环的do while
吗?
do
{
// all the gubbings here
} while (Row.NextRow());
答案 1 :(得分:1)
知道了,我的SqlCommand需要在InputRows_ProcessInputRow的本地范围内,并且不需要做NextRow()。感谢