2015-11-05 163 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的一個包裝,但爲您提供(更合理的)更健壯的代碼,其目的更明確。

使用哪個最適合你,或者做一些分析,並選擇最有效的性能是一個問題。