2010-09-21 37 views
6

Tôi cần phải tạo một ứng dụng để theo dõi trạng thái và thông tin công việc của tác nhân SQL Server 2000 khi công việc xảy ra giống như hiển thị trên nhật ký sự kiện ứng dụng Windows. Bây giờ tôi kết nối với cơ sở dữ liệu đã thông qua một chuỗi kết nối, nhưng tôi không biết làm thế nào để có được trạng thái và thông tin từ công việc.Làm thế nào để giám sát SQL Server Agent Thông tin công việc trong C#

Tôi cần hiển thị trạng thái và thông tin trên Hộp văn bản.

Bạn đề xuất cách thực hiện.

công cụ phát triển:

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

Tôi là một lập trình viên tân binh.

+3

Bạn sẽ không lãng phí thời gian của người dân - Stackoverflow là ở đây đặc biệt để có thể hỏi cộng đồng để được giúp đỡ! –

+0

ok thankyou, Stackoverflow là rất tốt Kiến thức và giúp đỡ nhiều người^_^ – Fernatit

+0

Câu trả lời đúng có thể được chọn xin vui lòng? Việc sử dụng SQL trực tiếp có thể hoạt động hoặc thư viện SQLServer SMO C# cũng sẽ hoạt động. Một số trong số này có thể được chấp nhận làm câu trả lời. – DtechNet

Trả lời

2

này phải là một điểm khởi đầu tốt để tìm hiểu làm thế nào để tìm được việc làm SQL Agent của bạn sử dụng T-SQL:

View (and disable) SQL Agent Jobs with TSQL

Các kịch bản sẽ liệt kê ra tất cả các công việc của bạn trên cơ sở dữ liệu của bạn, và khi họ sẽ được chạy tiếp theo và tiếp tục.

Sử dụng job_name, bạn cũng có thể tìm hiểu chi tiết về công việc của mình bằng cách sử dụng SQL Server Agent Stored Procedures trong cơ sở dữ liệu msdb trên máy chủ của bạn.

+1

Ngoài ra, hãy xem trang MSDN này http://msdn.microsoft.com/en-us/library/aa260604%28v=SQL.80%29.aspx - cụ thể là các Bảng Đại lý của Máy chủ SQL. –

0

Bạn có thể có được một danh sách tất cả các công việc máy chủ bằng lệnh SELECT:

SELECT [name] FROM msdb.dbo.sysjobs 

Nếu bạn muốn để có được một danh sách các công việc hiện đang chạy và thông tin của họ, tôi sẽ khuyên bạn nên viết một thủ tục lưu trữ trong SQL mà ứng dụng của bạn gọi. Có một cuộc biểu tình tốt ở đây bạn có thể sử dụng ...

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

Chúc may mắn!

+0

Nếu bạn đăng mã hoặc XML, ** vui lòng ** làm nổi bật những dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mã" (101 010) trên thanh công cụ trình soạn thảo để định dạng và cú pháp tô sáng nó! –

+0

cảm ơn mọi đề xuất, Mặc dù tôi có chút bối rối vì tôi là một tân binh nhưng tôi sẽ cố gắng làm theo mọi đề xuất. – Fernatit

4

tôi có thể làm điều này đã ...

tôi chọn bảng mẫu "Sysjobserver" trong cơ sở dữ liệu "msdb" cho tình trạng đọc, ngày, giờ công việc mà tôi muốn.

sử dụng mã này

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

cảm ơn bạn cho tất cả mọi người giúp đỡ rất nhiều. :-D

+0

Truy vấn này yêu cầu quyền sở hữu db trên cơ sở dữ liệu hệ thống msdb, mà không phải ai cũng có. Việc có thể thực hiện được thông qua SQL Server Agent có vai trò chuyên dụng để sử dụng nó và không yêu cầu quyền của chủ sở hữu trên cơ sở dữ liệu hệ thống. –

1

Trên SQL Server 2005 trở lên, bạn có thể sử dụng quy trình lưu trữ hệ thống msdb.dbo.sp_help_job để nhận thông tin, bao gồm trạng thái, về Tác vụ đại lý máy chủ SQL. Bạn có thể đọc thêm về sp_help_job tại http://msdn.microsoft.com/en-us/library/ms186722(v=SQL.90).aspx.

Đây là mã mẫu để thực hiện việc này từ C#.

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 được lưu trữ thủ tục truy vấn không cung cấp cho bạn bất kỳ dữ liệu hệ thống trừ khi bạn có quyền db_owner trên cơ sở dữ liệu hệ thống msdb, ở thuê trong SQL Server 2008. phương pháp Do đó đề cập thường không làm việc cho các ứng dụng mà bạn muốn hiển thị hoặc quản lý công việc.Tuy nhiên không gian tên SMO cung cấp cho bạn giải pháp mã được quản lý cho nhiều tính năng quản lý SQL Server, bao gồm các hàm Tác nhân của SQL Server chỉ yêu cầu quyền SQLServerAgent * mà bạn thường có thể được sắp xếp cho người dùng ứng dụng của bạn. Một giới thiệu tốt của việc sử dụng các lớp học SMO để làm việc với các công việc được đưa ra ở đây:

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

tôi làm việc trên một nhiệm vụ tương tự như bây giờ và trong khi truy vấn SQL cho tôi truy cập bị từ chối, với C# mã và Microsoft.SqlServer.Management. Smo.Agent namespace tôi chỉ liệt kê tất cả các công việc với mã này:

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

}

Các vấn đề liên quan