2015-11-05 2 views
2

При поиске по теме в Интернете я нашел два подхода: оба работают нормально, но мне нужно знать разницу между ними, какая из них подходит для какого случая и т. Д. Наши рабочие места занимают некоторое время, и мне нужно подождать, пока Иов закончит работу до следующей строки C#.Работающего агента сервера Sql от C#

подход Один

 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

поэтому читаем код @ Расика, что вы не понимаете .. знаете ли вы, что делает код ..? это довольно прямолинейно .. – MethodMan

+0

Конечно, первый использует «sp_start_job», а второй - нет. Может быть, есть плюсы и минусы. Его два разных подхода, чтобы сделать то же самое, используя разные библиотеки. Я хочу знать, какой из них подходит для какого случая и т. Д. Может быть, второй подход является последним, поэтому его спросили. – Rasika

+0

, то посмотрите на 'MSDN sp_start_job' также выглядит так, как sql-агент запускает второй процесс по сравнению с первым, где вы на самом деле явно вызываете хранимую процедуру Sql с помощью кода C#, только я вижу, что если один или другой отключен .. то это единственный способ, на мой взгляд, вы сможете сказать, что лучше и сделать профилирование, чтобы увидеть, какой из них выполняется быстрее и с меньшими ресурсами. – 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, но предоставляет вам (возможно) более надежный код, который имеет более четкую цель.

Используйте то, что вам подходит, или сделайте некоторое профилирование и выберите наиболее эффективные, если производительность будет проблемой.