从C#运行Sql Server代理作业

时间:2015-11-05 23:00:26

标签: c# sql-server ssis business-intelligence sql-agent-job

在互联网上搜索上述主题时,我找到了两种方法,两种方法都运行良好,但我需要知道两者之间的区别,哪一种适合什么场合等...我们的工作需要一些时间和在下一个C#行执行之前,我需要一种等待Job完成的方法。

接近一个

        var dbConn = new SqlConnection(myConString);
        var execJob = new SqlCommand
        {
            CommandType = CommandType.StoredProcedure,
            CommandText = "msdb.dbo.sp_start_job"
        };
        execJob.Parameters.AddWithValue("@job_name", p0);
        execJob.Connection = dbConn;

        using (dbConn)
        {
            dbConn.Open();
            using (execJob)
            {
                execJob.ExecuteNonQuery();
                Thread.Sleep(5000);
            }
        }

接近两个

        using System.Threading;
        using Microsoft.SqlServer.Management.Smo;
        using Microsoft.SqlServer.Management.Smo.Agent;

        var server = new Server(@"localhost\myinstance");
        var isStopped = false;
        try
        {
            server.ConnectionContext.LoginSecure = true;
            server.ConnectionContext.Connect();
            var job = server.JobServer.Jobs[jobName];
            job.Start();
            Thread.Sleep(1000);
            job.Refresh();
            while (job.CurrentRunStatus == JobExecutionStatus.Executing)
            {
                Thread.Sleep(1000);
                job.Refresh();
            }
            isStopped = true;
        }
        finally
        {
            if (server.ConnectionContext.IsOpen)
            {
                server.ConnectionContext.Disconnect();
            }
        }

1 个答案:

答案 0 :(得分:5)

sp_start_job - 样本1

您的第一个示例通过sp_start_job系统存储过程调用您的作业。 请注意,它会异步启动作业,并且线程会在任意时间段(5秒)内休眠,然后无论作业成功与否,都会继续。

SQL Server管理对象(SMO) - 示例2

您的第二个示例使用(因此依赖于)SQL Server Management Objects来实现相同的目标。

在第二种情况下,作业也开始异步运行,但后续循环会监视作业状态,直到它不再执行为止。请注意," isStopped" flag似乎没有用处,循环可以在某种程度上重构为:

        job.Start();
        do
        {
            Thread.Sleep(1000);
            job.Refresh();
        } while (job.CurrentRunStatus == JobExecutionStatus.Executing);

您可能希望在一段时间后添加该循环的分组。

其他注意事项

每个示例似乎都需要相同的权限;本质上,使用SMO的解决方案是sp_start_job的包装器,但为您提供(可以说)更健壮的代码,它具有更清晰的目的。

使用最适合您的方式,或者进行一些分析,如果性能问题,请选择最有效的方法。