gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:17:03 24 4
gpt4 key购买 nike

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

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

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

运行时没有错误

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

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

如果有人对此有任何见解,请告知,我已经通过谷歌进行了梳理,但找不到任何东西。任何帮助将不胜感激。

最佳答案

根据 MSDN ,

The Stop method issues a stop request to the Integration Services service, but this does not stop packages immediately. There may be a delay between the time a stop request is issued and the time that packages actually stop.

这是实现的安全方法(如果你愿意,我可以尝试解释原因/方式),但如果你真的必须当场终止包执行,则需要终止执行它的进程。如果您也需要这方面的帮助,请告诉我。

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

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

据我了解,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 进程。

关于c# - 无法在运行时停止 SSIS 包 (.NET C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4276260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com