2010-11-25 2 views
3

Я пытаюсь не остановить SSIS пакетов во время выполнения этого кодане удается остановить SSIS пакета во время выполнения (.NET C#)

RunningPackages pkgs = app.GetRunningPackages("myserver"); 

foreach (RunningPackage p in pkgs) 
{ 
    Console.WriteLine("PackageName: " + p.PackageName); 
    p.Stop(); 
} 

нет ошибок во время выполнения

Однако, когда я отлаживать пауза между остановкой каждого пакета и переходом к просмотру запущенных пакетов в SQL Server Managment Studio, я все еще вижу все запущенные пакеты.

Я даже пытаюсь щелкнуть правой кнопкой мыши и выбрать остановку на идущих пакетах, и они не остановятся.

Если у кого-то есть понимание этого, пожалуйста, посоветуйте, я прочесал через Google и ничего не могу найти. Любая помощь будет оценена.

ответ

2

Согласно MSDN,

Метод Stop выдает запрос остановки на службу Integration Services, , но это не останавливает пакеты немедленно. Может существовать задержка между запросом на остановку и временем, которое пакеты фактически останавливаются.

Это безопасный подход (я могу попытаться объяснить, почему/как, если хотите), но если вы действительно должны убить выполнение пакета тогда и там, вам нужно убить процесс, который его выполняет. Дайте мне знать, если вам тоже нужна помощь.

Однако я рекомендую, чтобы ваш центр управления использовал несколько потоков с обратным вызовом для достижения того, что вы пытаетесь сделать. Центр управления может выдавать запрос на остановку запущенных пакетов в отдельном потоке. Ваш отдельный поток также может отвечать за уведомление основного потока вашего центра управления делать то, что вы пытаетесь сделать, как только пакеты перестали работать. Или, если для вас работает синхронный подход, то отлично.

EDIT: Объясняя «безопасный подход» и как выполнить «небезопасный подход»

Из того, что я понимаю, пакеты SSIS проверить только для запросов остановки между ними задачами. Тем не менее, если пакет находится в середине выполнения длинной задачи потока данных, вы должны дождаться завершения задачи потока данных. Это необходимо для сохранения целостности данных и предотвращения несогласованных состояний.

Итак, что вы можете сделать, чтобы остановить пакет, когда он находится в середине выполнения длинной задачи потока данных? Как я сказал ранее, вам придется убить процесс, выполняющий пакет (с пониманием того, что это может привести к повреждению данных и другим негативным вещам).

using System.Diagnostic; 
... 
void StopAllPackages() { 
    // Get all processes executing an SSIS package on the database server. 
    // If you run this on the database server itself, remove the second parameter 
    // from GetProcessesByName. 
    foreach(Process p in Process.GetProcessesByName("dtexec.exe","databaseServerMachine") { 
     try { p.Kill(); } 
     catch(Win32Exception w32e) { 
      // process was already terminating or can't be terminated 
     } 
     catch(InvalidOperationException ioe) { 
      // process has already exited 
     } 
    } 
} 

Другой способ сделать это, чтобы выяснить идентификатор процесса на SQL Server (то есть, если вы просмотра Activity Monitor) и выдает запрос, чтобы убить процесс сервера SQL, связанный с выполнением пакета.

1

Можете ли вы сказать нам, где вы запускаете код? Это отдельная программа, сервис или она выполняется внутри сервера sql в качестве процедуры clr?

+0

Он запускается внутри другого (основного) пакета SSIS, который действует как центр управления для управления другими потоковыми пакетами.Это дает вам больше подсказок? – Bank 2010-11-25 15:50:53

+0

У меня есть ключ. Все ли пакеты по-прежнему работают после остановки или только последний, для которого вы вызвали остановку? В документации MSDN говорится, что запрос на блокировку выдается службе интеграции. Поскольку служба интеграции находится в режиме отладки, запрос не может быть обработан своевременно. – 2010-11-25 17:30:32

Смежные вопросы