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

时间:2019-01-22 11:47:51

标签: c# sql-server vb.net ssis ssis-2012

我有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)

2 个答案:

答案 0 :(得分:2)

在脚本组件中,只能使用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;
}

答案 1 :(得分: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;
}