43

如何访问我在数据流 -> 脚本组件 -> 我的 C# 脚本和我的 SSIS 包中使用的 C# 代码中的变量?

我试过 which 也不起作用

IDTSVariables100 varCollection = null;
this.VariableDispenser.LockForRead("User::FilePath");
string XlsFile;

XlsFile = varCollection["User::FilePath"].Value.ToString();
4

6 回答 6

71

访问(数据流任务的)脚本组件中的包变量与访问脚本任务中的包变量不同。对于脚本组件,您首先需要打开脚本转换编辑器(右键单击组件并选择“编辑...”)。在“脚本”选项卡的“自定义属性”部分,您可以输入(或选择)您希望在只读或读写基础上提供给脚本的属性: 脚本转换编辑器属性页面的屏幕截图 然后,在脚本本身中,变量将可用作变量对象的强类型属性:

// Modify as necessary
public override void PreExecute()
{
    base.PreExecute();
    string thePath = Variables.FilePath;
    // Do something ...
}

public override void PostExecute()
{
    base.PostExecute();
    string theNewValue = "";
    // Do something to figure out the new value...
    Variables.FilePath = theNewValue;
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    string thePath = Variables.FilePath;
    // Do whatever needs doing here ...
}

一个重要的警告:如果您需要写入包变量,您只能在 PostExecute() 方法中执行此操作。

关于代码片段:

IDTSVariables100 varCollection = null;
this.VariableDispenser.LockForRead("User::FilePath");
string XlsFile;

XlsFile = varCollection["User::FilePath"].Value.ToString();

varCollection初始化为 null 并且从不设置为有效值。因此,任何取消引用它的尝试都会失败。

于 2012-11-19T17:51:29.810 回答
11

首先在脚本任务编辑器的 ReadOnlyVariables 中列出要在脚本任务中使用的变量,然后编辑脚本

在脚本代码中使用您的 ReadOnlyVariables

String codeVariable = Dts.Variables["User::VariableNameinSSIS"].Value.ToString();

这行代码会将 ssis 包变量视为字符串。

于 2018-02-21T11:23:59.453 回答
4

除了我记得声明 ReadOnlyVariables 之外,我遇到了与 OP 相同的问题。

在玩了一些之后,我发现问题出在我的变量名上。SSIS 中的“File_Path”不知何故被转换为“FilePath”。C# 不能很好地处理变量名中的下划线。

所以要访问变量,我输入

string fp = Variables.FilePath;

在脚本组件的 PreExecute() 方法中。

于 2018-02-20T22:43:03.017 回答
2
  • 在变量脚本的前端属性页面,修改ReadOnlyVariables(或ReadWriteVariables)属性并选择您感兴趣的变量。这将启用脚本任务中的选定变量
  • 在代码中,您现在可以将变量读取为

    字符串 myString = Variables.MyVariableName.ToString();

于 2012-11-19T11:12:52.413 回答
0

强类型的 var 似乎不可用,我必须执行以下操作才能访问它们:

String MyVar = Dts.Variables["MyVarName"].Value.ToString();

于 2013-12-04T14:52:12.900 回答
0

这应该有效:

IDTSVariables100 vars = null;
VariableDispenser.LockForRead("System::TaskName");
VariableDispenser.GetVariables(vars);
string TaskName = vars["System::TaskName"].Value.ToString();
vars.Unlock();

您的初始代码缺少对 GetVariables() 方法的调用。

于 2016-11-29T10:42:59.870 回答