使用脚本任务,我尝试将变量 A 的值设置为变量 B 的值。两者都在同一个包中。 这是我使用的代码:
public void Main() {
Dts.Variables["User::VariableA"].Value = Dts.Variables["User::VariableB"].Value;
Dts.TaskResult = (int)ScriptResults.Success;
}
两个变量都是字符串类型,并标记为读/写。我也尝试使用 ToString() 方法将它们转换为脚本中的字符串,但效果不佳。
有人知道我错过了什么吗?
最佳答案
你什么都没错过。或者,您可能过于简单化了这里的问题,因为最小复制不会显示相同的行为
我创建了一个包,如图所示。两个字符串变量,变量 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
};
}
}
还能是什么?
看错地方了
变量窗口显示包的设计时
值。也许您认为该变量没有被更新,因为您正在查看该值。
相反,如果您有断点或其他东西,请查看“变量”下的“局部变量”窗口,它将显示当前运行时
值是什么
表达自己
有一个表达在起作用。变量上的表达式将始终取代指定的值。尝试分配给 Value 属性时不会引发错误,但不会“粘住”,因为 EvalateAsExpression 属性为 true 意味着 Value 始终基于 Expression 属性进行计算。
在新版本的 BIDS/SSDT 中,它们通过视觉提示使这一点更加明显。可通过 F4 访问属性,但变量窗口现在在变量名称旁边显示一个字形 f(x),以及表示数据类型和值的浅灰色文本。
关于c# - 在 SSIS 中使用脚本任务设置变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75049008/