【发布时间】:2020-10-28 06:14:14
【问题描述】:
我有一个包含两个包的 SSIS 项目。 Package1.dtsx 应该由 Package2.dtsx 调用。使用 ExecutePackageTask 执行此操作时,调试器会在调用第二个包后打开它。
现在我需要调整代码,以便我不使用 ExecutePackageTask 而是使用 ScriptTask。但是,调试器不会打开第二个包。 Package2.dtsx 现在看起来像这样:
以下是我在 ScriptTask 中尝试的不同方法:
public void Main()
{
var parentPackage = (Package)Dts.Variables["System::StartTime"].Parent;
var proj100 = (IDTSProject100)parentPackage.Project;
string packageStreamName = "Package1.dtsx";
// test 1 - using IDTSProject100.GetConfiguredPackageByName
var pkgTest1 = proj100.GetConfiguredPackageByName(packageStreamName);
pkgTest1.InteractiveMode = true;
var res1 = pkgTest1.Execute();
// test 2 - using IDTSProject100.GetPackageByName
var pkgTest2 = proj100.GetPackageByName(packageStreamName);
pkgTest2.InteractiveMode = true;
var res2 = pkgTest2.Execute(pConnections: proj100.GetConnections(), pVariables: proj100.GetVariables(), pEvents: null, pLog: null, pTransaction: Dts.Transaction);
// test 3 - using reflection to get the Project object and then load the package from the PackageItems
System.Reflection.PropertyInfo pInfo = proj100.GetType().GetProperty(
"Project",
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
Project proj = (Project)pInfo.GetValue(proj100, null);
PackageItems pis = proj.PackageItems;
PackageItem childPackageItem = pis[packageStreamName];
Package pkgTest3 = childPackageItem.LoadPackage(null);
pkgTest3.InteractiveMode = true;
var res3 = pkgTest3.Execute();
// test 4 - using a new package added to the current project. This package contains an ExecutePackageTask that calls the child
Package pkgTest4 = new Package();
Executable execPackageTask = pkgTest4.Executables.Add("STOCK:ExecutePackageTask");
var taskHost = (TaskHost)execPackageTask;
var execPkgTask = taskHost.InnerObject as ExecutePackageTask;
execPkgTask.UseProjectReference = true;
execPkgTask.PackageName = packageStreamName;
//var execRes = taskHost.Execute(connections: Dts.Connections, variables: Dts.Variables, events: null, log: null, transaction: Dts.Transaction);
pkgTest4.InteractiveMode = true;
proj.PackageItems.Add(pkgTest4, "test.dtsx");
var res4 = pkgTest4.Execute();
}
有什么我可能会遗漏的想法吗?有没有可能?
【问题讨论】:
-
从另一个角度来看问题——如果你需要从另一个运行一个包并且两者都属于同一个项目——你为什么要避免使用执行包任务?它是 SSIS 原生的,并为您提供所需的调试功能。
-
@PanagiotisKanavos 我知道我可以使用表达式,整个事情很复杂,我已将问题简化为所描述的情况。
-
什么是实际问题,实际问题?你想做什么?您可以像创建任何其他 C# 类一样创建和执行任何任务,而无需编辑项目。另一方面,您也不需要以编程方式创建包
-
@casenonsensitive,您能否详细说明您的问题,迫使您从代码运行包?在我的评论中,我问为什么你必须去代码而不是包中的本机 SSIS 任务,而不是 Script c# 代码。
-
这可能曾经是可能的,但我不确定它是否已经存在了。 this document 的附录中引用了
DebugMode属性。它名义上“确定是否触发 OnBreakpointHit 事件”。然而,这个属性没有暴露在任何地方,至少现在没有了。 This is the only page我可以找到它的引用。
标签: sql-server ssis sql-server-data-tools dts script-task