在我启动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并从目录中获取操作状态,但在这种情况下这是不可能的。
答案 0 :(得分:0)
通过回忆整合服务并获取新目录解决了这个问题。这会自动刷新它:
// get all executions for this project that are currently running
var runningPackagesBefore = catalog.Executions.Select(operation => operation.Id).ToList();
// [..] logic to execute the package
while (true)
{
var integrationServices = new IntegrationServices(sqlConnection);
Catalog refreshedCatalog = integrationServices.Catalogs[catalogName];
// get all packages that are running
var runningOperations = refreshedCatalog.Executions.Where(
operation => operation.Status == Operation.ServerOperationStatus.Running);
// get all packages that are new
var newRunningOperations = runningOperations.Where(
operation => !runningPackagesBefore.Contains(operation.Id));
if (!newRunningOperations.Any())
{
break;
}
// [..] sleep and timeout logic here
}