【发布时间】:2014-12-24 21:54:20
【问题描述】:
我尝试在启动 SSIS 包后等到 SQL Server 上所有正在运行的包完成,但我无法找出正确的方法。我到目前为止的代码是:
var runningPackagesBefore = catalog.Executions.ToList();
// [..] logic to start the package
while (true)
{
// get all packages that are new
catalog.Executions.Refresh();
var newOperations = catalog.Executions.Except(runningPackagesBefore);
// get all packages that are new, running and are in the same folder and project as the package
var runningOperations =
newOperations.Where(
operation => operation.FolderName == catalogFolder.Name
&& operation.ProjectName == project.Name
&& operation.Status == Operation.ServerOperationStatus.Running);
if (!runningOperations.Any())
{
break;
}
// [..] sleep and timeout logic here
}
catalog.Executions.Refresh() 调用有时会导致死锁问题。该文档还说“不要直接引用此方法......”。
需要刷新,否则执行集合会被缓存并返回 0 个新事务。并且当它在没有死锁的情况下运行时,它会正确返回正在运行的包的数量。
所以我试图找到一种方法来查看所有包是否都已完成运行。我正在运行的包是启动多个其他包的“主”包。否则我可以简单地获取执行 ID 并从目录中获取操作状态,但在这种情况下这是不可能的。
【问题讨论】:
标签: c# sql-server ssis