SSIS脚本组件无法写入ReadWriteVariable

时间:2011-08-23 16:28:18

标签: sql-server-2008 ssis

我在SQLServer 2008 R2上的SSIS中有一个脚本组件,它需要能够写入读写变量以生成平面文件导出的文件名。我创建了一个包级别变量来保存文件名,并设置平面文件连接以使用包含变量的表达式。

我有一个脚本组件,除其他外,在post execute方法中动态构建文件名。我已将变量设置在脚本组件的ReadWriteVariables设置中。

如果变量中没有默认值,则包会立即失败,因为平面文件连接管理器会尝试计算表达式以设置目标文件。所以,我只是输入了一个占位符文件名。

问题是现在它总是使用占位符文件名而不是脚本指定的文件名。确保我可以写入这些变量的最佳方法是什么?我尝试过Variables.VariableName =“value”,我也尝试过使用VariableDispenser和this.ReadWriteVariables [“VariableName”]。value,并且它们都没有持久保存我在脚本中设置的值。

1 个答案:

答案 0 :(得分:1)

以下是一种可以在Script Component内的Data Flow Task内为包变量赋值的方法。

我尝试将变量锁定在Script TaskScript Component中,而不是在“属性”对话框中指定它们。我觉得这更容易维护。

在下面的示例中,我有一个名为 FileName 的包变量,并且该变量在脚本组件中被赋值为C:\Temp\PathChanged

我认为脚本组件可能不是操作包变量值的正确位置,例如文件名,但这又取决于你想要做什么。

希望有所帮助。

/* Microsoft SQL Server Integration Services Script Component
*  Write scripts using Microsoft Visual C# 2008.
*  ScriptMain is the entry point class of the script.*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void PreExecute()
    {
        base.PreExecute();
    }

    public override void PostExecute()
    {
        base.PostExecute();

        IDTSVariables100 varCollection = null;
        this.VariableDispenser.LockForWrite("User::FileName");
        this.VariableDispenser.GetVariables(out varCollection);

        varCollection["User::FileName"].Value = @"C:\Temp\PathChanged";
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
    }
}

Script Component