我有一个脚本转换组件,它从OLEDB源获取输入,并且对于每一行,使用基于行值的参数执行存储过程。我在过去的解决方案中使用了这个功能而没有问题,但它现在抛出可怕的“对象引用未设置为对象的实例”。我已经比较了所有的设置(例如框架版本,输入/输出,程序集引用等),我可以考虑在这两个解决方案之间进行检查无济于事。实际设置变量似乎只有一个问题,即我可以实例化一个公共计数器,用计数器输出一个消息(在ProcessInputRow方法中)并增加计数器 - 这将触发与行中的行一样多的消息源表。我也尝试过.ToString()为变量值而没有任何运气。
数据流任务
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
SqlConnection conn = new SqlConnection();
IDTSConnectionManager100 connMgr;
public override void AcquireConnections(object Transaction)
{
connMgr = base.Connections.adoAdminsys;
conn = (SqlConnection)connMgr.AcquireConnection(null);
}
public override void PreExecute()
{
//base.PreExecute();
}
public override void PostExecute()
{
//base.PostExecute();
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
string certNbr = Row.certNbr;
int seqNbr = Row.seqNbr;
try
{
SqlCommand cmd = new SqlCommand("dbo.jbb_test_insert", conn);
cmd.Parameters.Add(new SqlParameter("@certNbr", certNbr));
cmd.Parameters.Add(new SqlParameter("@seqNbr", seqNbr));
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
同样,如果我在行缓冲区内显示消息,它将触发源中有行的确切时间。我还在Source和Script Component之间启用了Data Viewer,以确保实际传递行。此外,如果我只是尝试在消息中显示变量(certNbr,seqNbr),我将收到错误 - 所以我确信问题与输入行有关。