我有一个DataFlow,其中有一个脚本组件作为源.
我已经根据需要定义了Output(OutputRows)和Column(MyOutputValue).
当我想测试我的脚本时,即使使用硬编码值,也总是会遇到相同的错误:
System.NullReferenceException:对象引用未设置为对象的实例.在ScriptMain.CreateNewOutputRows()中.
我不知道这里出了什么问题.任何想法?
这是我的代码:
using System;
using System.Data;
using System.Windows.Forms;
using System.Threading;
using System.Globalization;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.SqlServer.Dts.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
#region Members
String MyOutputValue;
#endregion
public override void PreExecute()
{
base.PreExecute();
MyOutputValue = "test";
CreateNewOutputRows();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void CreateNewOutputRows()
{
OutputRowsBuffer.AddRow();
OutputRowsBuffer.MyOutputValue = MyOutputValue;
}
}
在我的SSIS程序包中,我开始调试,然后得到以下屏幕(它是德语,因此针对该帖子,我将错误翻译为英语):
解决方法:
在PreExecute方法返回之前,SSIS运行时不会初始化输出缓冲区(例如OutputRowsBuffer对象).
不幸的是,您的PreExecute方法直接调用CreateNewOutputRows,这将导致NullReferenceException.相反,您应该让SSIS运行时调用CreateNewOutputRows(它将在执行周期的适当时间调用它):
public override void PreExecute()
{
base.PreExecute();
MyOutputValue = "test";
// Do NOT call CreateNewOutputRows from PreExecute!
// CreateNewOutputRows();
}
public override void CreateNewOutputRows()
{
OutputRowsBuffer.AddRow();
OutputRowsBuffer.MyOutputValue = MyOutputValue;
}
有关其他示例代码,请参见MSDN上的Creating a Source with the Script Component页.