Sql server 如何在VS中以调试模式在脚本任务中执行包任务
我有一个包含两个包的SSIS项目。Package1.dtsx应由Package2.dtsx调用。使用ExecutePackageTask执行此操作时,调试器在调用第二个包后将打开该包 现在我需要修改代码,这样我就不用ExecutePackageTask,而是使用ScriptTask。但是,调试器不会打开第二个包。 Package2.dtsx现在看起来像这样: 以下是我在ScriptTask中尝试的不同方法:Sql server 如何在VS中以调试模式在脚本任务中执行包任务,sql-server,ssis,sql-server-data-tools,dts,script-task,Sql Server,Ssis,Sql Server Data Tools,Dts,Script Task,我有一个包含两个包的SSIS项目。Package1.dtsx应由Package2.dtsx调用。使用ExecutePackageTask执行此操作时,调试器在调用第二个包后将打开该包 现在我需要修改代码,这样我就不用ExecutePackageTask,而是使用ScriptTask。但是,调试器不会打开第二个包。 Package2.dtsx现在看起来像这样: 以下是我在ScriptTask中尝试的不同方法: public void Main() { var pa
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();
}
你知道我会错过什么吗?甚至可能吗?我认为不可能从C#代码调用Visual Studio SSIS调试器。
本声明的序言。SSIS脚本任务是放置在特殊占位符中的独立于.NET语言的可执行文件。您可以在.NET代码本身上运行VS调试器。从结构的角度来看,当VS运行或调试SSIS包时,它会在DtsDebugHost.exe进程中运行它。VS通过了解SSIS包任务的结构、捕获事件和进度并将其显示在窗口中来执行SSIS包任务。
脚本任务执行其代码,您的代码示例是关于如何运行项目并从中执行包的好例子。但是,从VS的角度来看,它是对一些类方法的调用。您可以继续执行包输出,捕获所有任务和组件消息,然后将其存储在文件或DB文本字段中。从另一点到问题所在--如果您需要从另一个包运行一个包,并且两者都属于同一个项目--为什么要避免使用执行包任务?它是SSIS自带的,并为您提供所需的调试功能。@PanagiotisKanavos我知道我可以使用表达式,整个事情很复杂,我已将问题简化为所描述的情况。实际问题是什么,实际问题是什么?你想干什么?您可以像创建和执行任何其他C#类一样创建和执行任何任务,无需编辑项目。另一方面,您不需要以编程方式创建包either@casenonsensitive,您能否详细说明强迫您从代码运行包的问题?在我的评论中,我问您为什么必须在包中使用代码而不是本机SSIS任务,而不是在脚本c#code中。这可能曾经是可能的,但我不确定现在是否是。的附录中引用了一个
DebugMode
属性。它名义上“确定是否触发OnBreakpointHit事件”。然而,这个属性不会暴露在任何地方,至少现在不会了。我可以找到它的参考文献,这是可能的。只需在脚本中设置一个断点。我上周做的。整个SSIS包不是单独的可执行文件。它是由VisualStudio自己执行的。您可以在控制台应用程序中以编程方式创建或加载包,包括脚本任务,并执行它。脚本任务包括代码和编译的IL,它不是一个单独的任务process@PanagiotisKanavos,关于脚本任务代码调试,您是对的。Topic starter希望在从C#脚本任务代码调用的SSIS包中设置断点,并在子包中打开VS SSIS debug。