4

我有一个数据流,其中有一个脚本组件作为源。

我已经根据我的需要定义了输出(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 包中,我开始调试,然后我得到以下屏幕(它是德语,所以我将错误翻译成英文用于这篇文章): 在此处输入图像描述

4

1 回答 1

6

方法返回之前,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 上的使用脚本组件页面创建源。

于 2013-06-17T15:54:39.583 回答