我有一个DataFlow,其中有一个脚本组件作为源。
我根据需要定义了输出(OutputRows)和列(MyOutputValue)。
当我想测试我的脚本时,即使使用硬编码值,我总会得到同样的错误:
System.NullReferenceException: Object reference not set to an instance of an object. at 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包中,我开始调试,然后我得到以下屏幕(它是德语,所以我把错误翻译成英文为这篇文章):
答案 0 :(得分:4)
SSIS运行时不会初始化输出缓冲区(例如OutputRowsBuffer
对象),直到 PreExecute
方法返回后。
很遗憾,您的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页。