我有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)
答案 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;
}