作为Source的SSIS脚本组件抛出System.NullReferenceException

时间:2013-06-17 12:53:26

标签: c# ssis nullreferenceexception

我有一个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包中,我开始调试,然后我得到以下屏幕(它是德语,所以我把错误翻译成英文为这篇文章): enter image description here

1 个答案:

答案 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页。