C# 从C运行Sql Server代理作业#

C# 从C运行Sql Server代理作业#,c#,sql-server,ssis,business-intelligence,sql-agent-job,C#,Sql Server,Ssis,Business Intelligence,Sql Agent Job,在互联网上搜索上述主题时,我发现了两种方法,都很有效,但我需要知道这两种方法的区别,哪种方法适合什么场合等等。。。我们的工作需要一些时间,我需要一种方法,在下一个C#line执行之前,等待工作完成 方法一 var dbConn = new SqlConnection(myConString); var execJob = new SqlCommand { CommandType = CommandType.StoredPro

在互联网上搜索上述主题时,我发现了两种方法,都很有效,但我需要知道这两种方法的区别,哪种方法适合什么场合等等。。。我们的工作需要一些时间,我需要一种方法,在下一个C#line执行之前,等待工作完成

方法一

        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();
            }
        }

sp_启动_作业-样本1

第一个示例通过系统存储过程调用作业。 请注意,它异步启动作业,线程在继续之前休眠任意时间段(5秒),而不管作业成功与否

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

您的第二个示例使用(因此依赖)实现相同的目标

在第二种情况下,作业也开始异步运行,但随后的循环监视作业状态,直到不再执行为止。请注意,“isStopped”标志似乎没有任何作用,循环可以重构为:

        job.Start();
        do
        {
            Thread.Sleep(1000);
            job.Refresh();
        } while (job.CurrentRunStatus == JobExecutionStatus.Executing);
您可能希望在一段时间后添加一个中断循环

其他注意事项

似乎每个示例都需要相同的权限;从本质上说,使用SMO的解决方案是围绕sp_start_作业的包装器,但它为您提供(可以说)更健壮的代码,目的更明确


选择最适合你的,或者做一些分析,如果性能是一个问题,选择最有效的。

那么阅读代码@Rasika,你还不明白什么。。你知道代码在做什么吗。。?这很直截了当。当然,第一个使用“sp_start_job”,第二个不使用。在这方面可能有正反两面。使用不同的库来做同样的事情有两种不同的方法。我想知道哪一个适合什么场合等等。。。可能是第二种方法是最新的,这就是为什么要问。然后看看
MSDN sp_start_job
看起来sql代理正在运行第二个进程,而第一个进程实际上是通过C#code显式调用sql存储过程。我唯一能看到的是,如果其中一个进程或另一个进程出现故障。。那么,在我看来,这是唯一一种可以告诉你哪一个更好的方法,也可以做一些分析,看看哪一个运行更快,资源更少。。