2010-09-21 25 views
6

nasıl izlenir? Windows uygulama olay günlüğünde gösteri ile aynı işi gerçekleştirdiğinde, SQL Server 2000 Ajan İş durumunu ve bilgileri izlemek için bir uygulama oluşturmanız gerekir. Şimdi bir bağlantı dizesi üzerinden zaten veritabanına bağlanıyorum, ancak durum ve bilgileri İş'ten nasıl alacağımı bilmiyorum.SQL Server Agent iş bilgisi C#

Metin kutusuna durum ve bilgi göstermem gerekiyor.

Nasıl yapılacağını öneriyorsunuz.

Geliştirici araçları:

  1. MS SQL Sever 2000 SP4
  2. MS Visual Studio 2008 (C#)

çaylakken programcı değilim.

View (and disable) SQL Agent Jobs with TSQL

komut dosyası veritabanı üzerinde tüm işlerinizi liste halinde ve onlar:

+3

insanların zaman israf değiliz - Stackoverflow burada özellikle topluluktan yardım istemeye muktedir! –

+0

tamam teşekkürler, Stackoverflow çok iyi Bilgi ve birçok insana yardım^_^ – Fernatit

+0

Doğru cevap seçilebilir mi lütfen? SQL kullanarak doğrudan çalıştırabilir veya SQLServer SMO C# kitaplığı da çalışır. Bunlardan birkaçı cevap olarak kabul edilebilir. – DtechNet

cevap

2

Bu T-SQL kullanarak SQL Ajan iş bulmak için öğrenmek için iyi bir başlangıç ​​noktası olmalı sonraki ve daha sonra çalıştırılacak.

İş_adını kullanarak, sunucunuzdaki msdb veritabanında SQL Server Agent Stored Procedures kullanarak işlerinizle ilgili ayrıntıları da öğrenebilirsiniz.

+1

Alternatif olarak, bu MSDN sayfasına bir göz atın http://msdn.microsoft.com/en-us/library/aa260604%28v=SQL.80%29.aspx - özellikle SQL Server Agent Tabloları. –

0

Bu SEÇ kullanan tüm sunucu işlerin bir listesini alabilirsiniz:

SELECT [name] FROM msdb.dbo.sysjobs 

Bir anda çalışan işlerin listesi ve bunların bilgi almak isterseniz, ben SQL içinde depolanmış yordam yazma tavsiye ederim uygulamanızın çağrıları. Eğer ullanabileceğimiz iyi gösteri ...

http://feodorgeorgiev.com/blog/2010/03/how-to-query-currently-running-sql-server-agent-jobs/

İyi şanslar var! ben zaten bunu yapabilirsiniz

+0

Kod veya XML gönderirseniz, ** lütfen metin düzenleyicideki satırları vurgulayın ve güzel bir biçimde biçimlendirmek ve sözdizimini vurgulamak için editör araç çubuğundaki "kod" düğmesine (101 010) tıklayın! –

+0

Her öneri için teşekkürler, Biraz kafamda olsa da gerçekten bir çaylak olduğum için ama her öneriyi yapmaya çalışacağım. – Fernatit

4

...

i okuma durumu, tarih, istediğim işin kez veritabanı "msdb" nde "Sysjobserver" formu tabloyu seçin.

kullanımı bu kod

public void GetJobsAndStatus() 
     { 
      string sqlJobQuery = "select j.job_id, j.name, j.enabled, jh.run_status," + 
      " js.last_outcome_message, jh.run_date, jh.step_name, jh.run_time" + 
      " from sysjobs j left join sysjobhistory jh on (j.job_id = jh.job_id)" + 
      " left join sysjobservers js on (j.job_id = js.job_id)" + 
      " where jh.run_date = (select Max(run_date) from sysjobhistory)" + 
      " and jh.run_time = (select Max(run_time) from sysjobhistory)"; 

      // create SQL connection and set up SQL Command for query 
      using (SqlConnection _con = new SqlConnection("server=10.15.13.70;database=msdb;user id=sa;pwd=")) 
      using (SqlCommand _cmd = new SqlCommand(sqlJobQuery, _con)) 

      { 

       try 
       { 
       // open connection 
       _con.Open(); 
       SqlConnection.ClearPool(_con); 

       // create SQL Data Reader and grab data 
       using (SqlDataReader rdr = _cmd.ExecuteReader()) 
       { 
        // as long as we get information from the reader 
        while (rdr.Read()) 
        { 
         Guid jobID = rdr.GetGuid(0);    // read Job_id 
         string jobName = rdr.GetString(1);  // read Job name 
         byte jobEnabled = rdr.GetByte(2);  // read Job enabled flag 
         int jobStatus = rdr.GetInt32(3);   // read last_run_outcome from sysjobserver 
         string jobMessage = rdr.GetString(4); // read Message from sysjobserver 
         int jobRunDate = rdr.GetInt32(5);  // read run_date from sysjobhistory 
         string jobStepName = rdr.GetString(6); // read StepName from sysjobhistory 
         int jobRunTime = rdr.GetInt32(7);  // read run_time from sysjobhistory 


         String[] lviData = new String[] // ตัวแปรอะเรย์ชื่อ lviData 
        { 
         jobID.ToString(), 
         jobName.ToString(), 
         jobStepName.ToString(), 
         jobMessage.ToString(), 
         jobStatus.ToString(), 
         jobRunDate.ToString(), 
         jobRunTime.ToString(), 
         //jobEnabled.ToString(), 

        }; 

         newData = lviData; 

         DisplayList(); // for display data on datagridview 


        } 

        rdr.Close(); 
       } 
      } 

herkes çok yardımcı için teşekkür ederiz. : -D

+0

Bu sorgu, herkesin sahip olmadığı msdb sistem veritabanında db sahip hakları gerektirir. SQL Server Agent üzerinden, işleri kullanmak için özel rolleri olan ve sistem veritabanlarında sahiplik hakları gerektirmeyen işlerin alınması mümkündür. –

1

SQL Server 2005 ve üzeri'da, SQL Server Agent İşleri hakkında durum bilgisi de dahil olmak üzere sistem saklı yordamını msdb.dbo.sp_help_job kullanabilirsiniz. Sp_help_job hakkında daha fazla bilgiyi http://msdn.microsoft.com/en-us/library/ms186722(v=SQL.90).aspx numaralı telefondan okuyabilirsiniz.

Bunu C# ile yapmak için örnek kod. Eğer 2008. Bu nedenle sözü edilen yöntemler normalde uygulamalar nereye için çalışmaz, SQL Server kira, msdb sistem veritabanı db_owner haklara sahip olmadıkları sürece size herhangi bir sistem verilerini vermeyin sorguları

private Dictionary<int, string> ExecutionStatusDictionary = new Dictionary<int, string>() 
{ 
    {0, "Not idle or suspended"}, 
    {1, "Executing"}, 
    {2, "Waiting for thread"}, 
    {3, "Between retries"}, 
    {4, "Idle"}, 
    {5, "Suspended"}, 
    {7, "Performing completion actions"} 
}; 

public string GetStatus() 
{ 
    SqlConnection msdbConnection = new SqlConnection("Data Source=GACDTL01CR585M;Initial Catalog=msdb;Integrated Security=SSPI"); 
    System.Text.StringBuilder resultBuilder = new System.Text.StringBuilder(); 

    try 
    { 
     msdbConnection.Open(); 

     SqlCommand jobStatusCommand = msdbConnection.CreateCommand(); 

     jobStatusCommand.CommandType = CommandType.StoredProcedure; 
     jobStatusCommand.CommandText = "sp_help_job"; 

     SqlParameter jobName = jobStatusCommand.Parameters.Add("@job_name", SqlDbType.VarChar); 
     jobName.Direction = ParameterDirection.Input; 
     jobName.Value = "LoadRegions"; 

     SqlParameter jobAspect = jobStatusCommand.Parameters.Add("@job_aspect", SqlDbType.VarChar); 
     jobAspect.Direction = ParameterDirection.Input; 
     jobAspect.Value = "JOB"; 

     SqlDataReader jobStatusReader = jobStatusCommand.ExecuteReader(); 

     while (jobStatusReader.Read()) 
     { 
      resultBuilder.Append(string.Format("{0} {1}", 
       jobStatusReader["name"].ToString(), 
       ExecutionStatusDictionary[(int)jobStatusReader["current_execution_status"]] 
      )); 
     } 
     jobStatusReader.Close(); 
    } 
    finally 
    { 
     msdbConnection.Close(); 
    } 

    return resultBuilder.ToString(); 
} 
3

SQL saklı yordamları işleri göstermek veya yönetmek istiyorum.Ancak SMO ad alanı, uygulama kullanıcınız için normal olarak sıralayabileceğiniz SQLServerAgent * izinlerini gerektiren SQL Server Agent işlevleri de dahil olmak üzere birçok SQL Server yönetim özelliği için yönetilen kod çözümü sağlar.

http://www.codeproject.com/Tips/367470/Manage-SQL-Server-Agent-Jobs-using-Csharp

Şimdi benzer bir görev üzerinde çalışmak ve C# kodu ve Microsoft.SqlServer.Management ile reddedildi SQL sorguları bana erişimi vermek ederken: işlerde çalışmak için SMO sınıfları kullanmanın iyi bir intro burada verilmektedir. Smo.Agent ad sadece bu kod ile tüm işleri listelenmiş:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common; 
using Microsoft.SqlServer.Management.Smo.Agent; 

namespace SmoTest 
{ 
class Program 
{ 
    static readonly string SqlServer = @"SQL01\SQL01"; 

    static void Main(string[] args) 
    { 
     ServerConnection conn = new ServerConnection(SqlServer); 
     Server server = new Server(conn); 
     JobCollection jobs = server.JobServer.Jobs; 
     foreach (Job job in jobs) 
     { 
      Console.WriteLine(job.Name); 
     } 
    } 
} 

}