如何将列值存储到数据流任务中的变量中?

How to store a column value into a variable in Data Flow Task?

我有 DFT,我从 table 中提取 URL,我需要将该值存储到一个变量中。

我正在使用 OLEDB 源连接到我的 SQL 服务器并选择所需的列。 然后我有条件拆分,它将为我拆分正确的 URL。 右边的 URL 来自我映射到脚本组件的条件拆分。

下面是我用过的C#代码:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    this.ReadWriteVariables["User::NextPageLink"].Value = Row.href;
}

但是当我尝试执行时出现以下错误:

[Script Component [116]] Error: Microsoft.SqlServer.Dts.Pipeline.ReadWriteVariablesNotAvailableException: The collection of variables locked for read and write access is not available outside of PostExecute. at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e) at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, PipelineBuffer buffer) at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProcessInput(IDTSManagedComponentWrapper100 wrapper, Int32 inputID, IDTSBuffer100 pDTSBuffer, IntPtr bufferWirePacket)

在脚本组件中,变量只能写入 PostExecute 方法,而不是 ProcessInputRow 方法。要使用列中的值更新变量,请在这些方法之外声明一个变量,更新 ProcessInputRow 中的变量,然后将此值分配给 PostExecute 方法中的 SSIS 变量。当然,在脚本组件的 ReadWriteVariables 字段中添加 SSIS 变量。您可能知道,ProcessInputRow 方法对每一行调用一次,而 PostExecute 仅在处理完所有记录后执行,因此如果您需要对多行中的值执行某些操作,您您将希望在 ProcessInputRow 方法中执行此逻辑。请注意为通过此组件的每条记录执行任何操作所带来的额外开销。

string nextPageLink = null;

public override void PostExecute()
{
    base.PostExecute();
    Variables.NextPageLink = nextPageLink;  
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    nextPageLink = Row.href;
}

谢谢,@userfl89。 我的编码与您的类似,但我使用了 VariableDispenser。真的需要这里吗?

public override void PostExecute()
{
    base.PostExecute();
    VariableDispenser variableDispenser = (VariableDispenser)this.VariableDispenser;
    variableDispenser.LockForWrite("User::NextPageLink");
    this.ReadWriteVariables["User::NextPageLink"].Value = nextpagelink;

 }

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    nextpagelink = Row.href;
}