无法在运行时停止SSIS包(.NET C#)

时间:2010-11-25 10:59:01

标签: c# .net multithreading ssis

我正在尝试使用此代码在运行时停止SSIS包

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

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

运行时没有错误

但是,当我调试在停止每个包之间暂停并在SQL SERVER Managment Studio中查看正在运行的包时,我仍然看到所有包都在运行。

我甚至尝试右键单击并在正在运行的包上选择停止,它们不会停止。

如果有人对此有任何见解请指教,我已经梳理了谷歌并找不到任何东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

根据MSDN

  

Stop方法发出停止请求   到Integration Services服务,   但这不会阻止包裹   立即即可。可能会有延迟   在停止请求之间   发出和包的时间   实际上停止了。

这是实现的安全方法(我可以尝试解释为什么/如果需要),但如果你真的必须杀死包执行那么,你需要杀死正在执行它的进程。如果您需要帮助,请告诉我。

但是,我建议你的控制中心使用带回调的多个线程来实现你想要做的事情。您的控制中心可以发出请求以在单独的线程上停止正在运行的程序包。您的单独线程也可以负责通知您的控制中心的主线程,以便在程序包停止运行后执行您尝试执行的操作。或者,如果同步方法适合您,那么很好。

编辑:解释“安全方法”以及如何执行“不安全方法”

据我所知,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上找出进程ID(即,如果您查看活动监视器)并发出请求以终止与程序包执行相关联的SQL Server进程。

答案 1 :(得分:1)

您能告诉我们您的代码在哪里运行吗?它是一个单独的程序,服务还是作为clr程序在sql server中运行?