Как выполнить пакетную задачу в скриптовой задаче в режиме отладки в VS

У меня есть проект 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();
    }

Любые идеи, что я мог пропустить? Это вообще возможно?


person casenonsensitive    schedule 07.07.2020    source источник
comment
С другой стороны, если вам нужно запустить один пакет из другого, и оба относятся к одному и тому же проекту, почему вы избегаете использования Execute Package Task? Он встроен в SSIS и предлагает запрошенные вами возможности отладки.   -  person Ferdipux    schedule 16.07.2020
comment
Почему вы используете этот код в первую очередь? Вы создаете новую задачу Execute Package в коде и используете жестко заданный путь к пакету. Почему бы просто не добавить правильную задачу? Если вы хотите изменить пакет или параметры во время выполнения, используйте выражения   -  person Panagiotis Kanavos    schedule 16.07.2020
comment
@Ferdipux Я пытался использовать встроенную задачу «Выполнение пакета» в скрипте, но это не помогло. В коде он начинается с // test 4   -  person casenonsensitive    schedule 16.07.2020
comment
@PanagiotisKanavos Я знаю, что могу использовать выражения, все это сложно, и я свел проблему к описанной ситуации.   -  person casenonsensitive    schedule 16.07.2020
comment
Что такое актуальный вопрос, актуальная проблема? Что ты пытаешься сделать? Вы можете создать и выполнить любую задачу, как если бы это был любой другой класс C#, вам не нужно редактировать проект. С другой стороны, вам также не нужно создавать пакет программно.   -  person Panagiotis Kanavos    schedule 16.07.2020
comment
@casenonsensitive, не могли бы вы рассказать о своей проблеме, заставляющей вас запускать пакет из кода? В своем комментарии я спросил, почему вы должны перейти к коду вместо собственной задачи SSIS в пакете, а не в коде Script c#.   -  person Ferdipux    schedule 16.07.2020
comment
@casenonsensitivity SSIS непросто программировать. Какая бы у вас ни была проблема, переход к сценарию сделает ее примерно в 1000 раз сложнее.   -  person Panagiotis Kanavos    schedule 16.07.2020
comment
Я создал замену для задачи выполнения пакета в пользовательской задаче. Некоторые из его функций заключаются в запуске пакетов через каталог SSIS и параллельно с настраиваемой очередью. Проблема, с которой я столкнулся сейчас, заключается в том, что я хочу воспроизвести ту же функциональность, что и ExecutePackageTask (работает локально, без распараллеливания), чтобы упростить отладку некоторых наших сложных пакетов. При использовании стандартного ExecutePackageTask отладчик открывает дочерний пакет, позволяя следить за выполнением. Я знаю CustomTask != ScriptTask, но мне нужно с чего-то начинать.   -  person casenonsensitive    schedule 16.07.2020
comment
Возможно, когда-то это было возможно, но я не уверен, что это возможно сейчас. В приложении к DebugMode. ">этот документ. Он номинально определяет, запускается ли событие OnBreakpointHit. Однако это свойство нигде не выставляется, по крайней мере, больше. Это единственная страница, которую я могу найти, которая ссылается на нее.   -  person allmhuran    schedule 17.07.2020
comment
В продолжение отличной находки @allmhuran, что, если в примере 4 вы установите для свойства @[System::DebugMode] значение true — либо во время разработки, либо с переопределением во время выполнения?   -  person billinkc    schedule 18.07.2020
comment
@billinkc Я создал новый проект SSIS (visual studio 2019, последние обновления для инструментов данных), нацеленный на проект SQL Server 2017, и не смог найти это свойство ни в системных переменных, ни в качестве доступного свойства объекта внутри задачи скрипта. Возможно, это было выставлено в более ранних версиях?   -  person allmhuran    schedule 18.07.2020
comment
@allmhuran Я нашел понятие об использовании свойства DebugMode в MS docs - похоже, это внутреннее свойство MS для ускорения, если оно не находится в режиме отладки. Здесь MS показывает пример реализации отладки в пользовательской задаче.   -  person Ferdipux    schedule 20.07.2020
comment
@Ferdipux В любом случае похоже, что это относится к этой конкретной задаче. Кажется, нам здесь нужно свойство DebugMode самого пакета. Некоторые из свойств, перечисленных в приложении к этому интервью с Дональдом Фармером, по-прежнему видны как системные переменные и доступны для объектов Package в задачах сценария. Но этого нет, по крайней мере, уже нет.   -  person allmhuran    schedule 20.07.2020


Ответы (1)


Я не думаю, что можно вызвать отладчик Visual Studio SSIS из кода C#.
Предисловие к этому утверждению. Задача «Сценарий служб SSIS» — это исполняемый файл .NET на независимом языке, помещенный в специальный заполнитель. Вы можете запустить отладчик VS в самом коде .NET. С точки зрения структуры, когда VS запускает или отлаживает пакет SSIS, он запускает его в процессе DtsDebugHost.exe. VS выполняет задачу пакета SSIS за задачей, зная его структуру, фиксируя события и ход выполнения и отображая их в своем окне.
Задача «Сценарий» выполняет свой код, примеры кода — прекрасные примеры того, как запустить проект и выполнить пакет из Это. Но - с точки зрения VS - это вызов некоторых методов класса. Вы можете продолжить вывод пакета, перехватив все сообщения о задачах и компонентах, а затем сохранить их в файле или текстовом поле БД.

person Ferdipux    schedule 16.07.2020
comment
Это возможно. Просто установите точку останова в скрипте. Я сделал это на прошлой неделе. Весь пакет SSIS не является отдельным исполняемым файлом. Он выполняется самой Visual Studio. Вы можете программно создать или загрузить пакет в консольном приложении, включая задачи сценария, и выполнить его. Задачи Script включают в себя код и скомпилированный IL, это не отдельный процесс. - person Panagiotis Kanavos; 16.07.2020
comment
@PanagiotisKanavos, вы правы в отношении отладки кода задачи сценария. Автор темы хочет установить точку останова в пакете служб SSIS, вызываемом из кода задачи сценария C#, и открыть отладку VS SSIS в дочернем пакете. - person Ferdipux; 16.07.2020