Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在VS中以调试模式在脚本任务中执行包任务_Sql Server_Ssis_Sql Server Data Tools_Dts_Script Task - Fatal编程技术网

Sql server 如何在VS中以调试模式在脚本任务中执行包任务

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

我有一个包含两个包的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();
    }

你知道我会错过什么吗?甚至可能吗?

我认为不可能从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。