c# - 在 SSIS 中使用脚本任务设置变量值

标签 c# visual-studio ssis business-intelligence

使用脚本任务,我尝试将变量 A 的值设置为变量 B 的值。两者都在同一个包中。 这是我使用的代码:

public void Main() {

              Dts.Variables["User::VariableA"].Value =     Dts.Variables["User::VariableB"].Value;


        Dts.TaskResult = (int)ScriptResults.Success;
    }

两个变量都是字符串类型,并标记为读/写。我也尝试使用 ToString() 方法将它们转换为脚本中的字符串,但效果不佳。

有人知道我错过了什么吗?

最佳答案

你什么都没错过。或者,您可能过于简单化了这里的问题,因为最小复制不会显示相同的行为

enter image description here

我创建了一个包,如图所示。两个字符串变量,变量 A 和变量 B。它们被初始化为“我的值是 A”和“我的值是 B”。我通过将当前变量打印到输出窗口来确认这一点。然后,我使用您的代码来更新 A 的值。然后,我重复使用相同的检查代码,并查看这两个变量的“我的值是 B”的预期最终值。

SCR 回波值

这是相同的脚本任务,在我更新值之前和之后。它只是将读/写变量发送到信息事件,以便它们显示在“结果/输出”选项卡上

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace ST_5e898ddfc3e24549a581a83a3cabab4d
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        public void Main()
        {
            bool fireAgain = false;
            foreach (var item in Dts.Variables)
            {
                Dts.Events.FireInformation(0, "SCR Echo Back", string.Format("{0}->{1}", item.QualifiedName, item.Value), "", 0, ref fireAgain);
            }

            Dts.TaskResult = (int)ScriptResults.Success;
        }

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
    }
}

SCR 将 B 分配给 A

这是提供的代码

using System;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace ST_3a3b3c73d21c472aba3c2ddbad1481b1
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        public void Main()
        {
            Dts.Variables["User::VariableA"].Value = Dts.Variables["User::VariableB"].Value;
            Dts.TaskResult = (int)ScriptResults.Success;
        }

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
    }
}

还能是什么?

看错地方了

变量窗口显示包的设计时值。也许您认为该变量没有被更新,因为您正在查看该值。

enter image description here

相反,如果您有断点或其他东西,请查看“变量”下的“局部变量”窗口,它将显示当前运行时值是什么

enter image description here

表达自己

有一个表达在起作用。变量上的表达式将始终取代指定的值。尝试分配给 Value 属性时不会引发错误,但不会“粘住”,因为 EvalateAsExpression 属性为 true 意味着 Value 始终基于 Expression 属性进行计算。

在新版本的 BIDS/SSDT 中,它们通过视觉提示使这一点更加明显。可通过 F4 访问属性,但变量窗口现在在变量名称旁边显示一个字形 f(x),以及表示数据类型和值的浅灰色文本。

enter image description here

关于c# - 在 SSIS 中使用脚本任务设置变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75049008/

相关文章:

sql - 如何在集成服务目录中启用创建目录选项?

sql-server - 为什么我的 ODBC 连接在 Visual Studio 中运行 SSIS 加载时失败,但在使用执行包实用工具运行相同包时却失败

c# - 将接口(interface)作为返回类型是否可取?

c# - 使用反射获取对象函数

visual-studio - 可以通过SSMS访问SQL数据库,但不能通过VS2013

visual-studio - checkin VS2015 的工作项时出现转换错误

c# - 在 Unity 中从 excel 中检索元数据

c# - 我们应该使用 "workstation"垃圾回收还是 "server"垃圾回收?

C# 运算符重载不起作用

oracle - SSIS - 使用 Attunity Oracle 数据源在 Oracle 查询中使用参数