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

4
我有一个DFT,需要从表格中提取URL并将该值存储到变量中。
我正在使用OLEDB Source连接到我的SQL Server,并选择所需的列。 然后,我使用条件分割器来拆分正确的URL。 从条件分割器流出的正确URL被映射到脚本组件。
下面是我使用的C#代码:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    this.ReadWriteVariables["User::NextPageLink"].Value = Row.href;
}

但是当我尝试执行时,出现以下错误:
[Script Component [116]] 错误: Microsoft.SqlServer.Dts.Pipeline.ReadWriteVariablesNotAvailableException: 只读变量集合和写入的访问权限不可在PostExecute之外使用。 在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e)处 在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, PipelineBuffer buffer)处 在Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostProcessInput(IDTSManagedComponentWrapper100 wrapper, Int32 inputID, IDTSBuffer100 pDTSBuffer, IntPtr bufferWirePacket)处

似乎在ReadWriteVariable权限方面存在问题。您是否将变量添加到“Script Transformation Editor”的“ReadWriteVariables”字段中? - Sabbir Hassan
2个回答

3
在脚本组件中,变量只能在PostExecute方法中进行写入,而不能在ProcessInputRow方法中进行。要使用列的值更新变量,请在这些方法之外声明一个变量,在ProcessInputRow中更新变量,并在PostExecute方法中将此值分配给SSIS变量。当然,还需要将SSIS变量添加到脚本组件的ReadWriteVariables字段中。如您所知,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;
}

感谢您的回答。 - Naveen Kumar

1

谢谢,@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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接