首页 > 解决方案 > 如何将列值存储到数据流任务中的变量中?

问题描述

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

我正在使用 OLEDB Source 连接到 My SQL Server 并选择所需的列。然后我有条件拆分,它将为我拆分正确的 URL。来自我已映射到脚本组件的条件拆分的正确 URL 流。

以下是我使用的 C# 代码:

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

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

[脚本组件 [116]] 错误:Microsoft.SqlServer.Dts.Pipeline.ReadWriteVariablesNotAvailableException:为读写访问锁定的变量集合在 PostExecute 之外不可用。在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e) 在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, PipelineBuffer 缓冲区) 在 Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProcessInput(IDTSManagedComponentWrapper100 包装, Int32 inputID, IDTSBuffer100 pDTSBuffer, IntPtr bufferWirePacket)

标签: c#sql-servervb.netssisssis-2012

解决方案


在脚本组件中,变量只能写入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;
}

推荐阅读