2015-11-05 139 views
2

在上面的主题上搜索互联网时,我发现两种方法,两者都工作正常,但我需要知道两者之间的区别,哪一个适合什么场合等。 。我们的工作需要一些时间,我需要一种方法来等待作业完成,然后再执行下一个C#行。从C运行Sql Server代理作业#

一种用法

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

所以阅读代码@Rasika,你不明白什么......你知道代码在做什么..?这是非常直接的.. – MethodMan

+0

当然,第一个使用“sp_start_job”,第二个不是。可能是有利弊的。它使用不同的库来做同样的事情的两种不同的方法。我想知道哪一个适合什么场合等等......可能是第二种方法是最新的,这就是为什么要问。 – Rasika

+0

然后查看'MSDN sp_start_job'也看起来像一个SQL代理正在运行第二个进程vs第一个你实际上通过C#代码明确调用一个Sql存储过程的东西我只能看到如果一个或另一个停止..那么这就是我认为唯一的办法,你可以告诉哪个更好,也可以做一些分析,看看哪一个更快运行,资源更少。 – MethodMan

回答

4

sp_start_job - 样品1

你的第一个例子调用通过sp_start_job系统存储过程你的工作。 请注意,它会异步启动作业,并且在继续执行任意一段时间(5秒)之前,无论作业是成功还是失败,线程都会休眠。

SQL Server管理对象(SMO) - 样品2

你的第二个例子使用(并因此具有的依赖关系)的SQL Server Management Objects来达到同样的目的。

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

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

你可能想的一定时间后添加一个突破的是循环的。

其他注意事项

似乎相同的权限是由您的每一个实例必需的;本质上,使用SMO的解决方案是sp_start_job的一个包装,但为您提供(更合理的)更健壮的代码,其目的更明确。

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