2010-09-21 16 views
6

Necesito crear una aplicación para supervisar el estado e información del trabajo del Agente SQL Server 2000 cuando se produce el trabajo igual que en el registro de eventos de la aplicación Windows. Ahora me conecto a la base de datos a través de una cadena de conexión, pero no sé cómo obtener el estado y la información de Job.Cómo supervisar la información del trabajo del Agente SQL Server en C#

Necesito mostrar el estado y la información en el cuadro de texto.

¿Qué sugerencia de cómo hacer.

Herramientas para desarrolladores:

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

yo soy un programador novato.

+3

no estamos perdiendo el tiempo de la gente - Stackoverflow es aquí específicamente para ser capaz de pedir ayuda a la comunidad! –

+0

ok gracias, Stackoverflow es muy bueno Conocimiento y ayuda a muchas personas^_^ – Fernatit

+0

¿Se puede elegir la respuesta correcta por favor? Usar SQL directamente podría funcionar o la biblioteca SQLServer SMO C# también funcionaría. Varios de estos podrían ser aceptados como la respuesta. – DtechNet

Respuesta

2

Esto debería ser un buen punto de partida para encontrar la manera de encontrar sus trabajos del Agente SQL utilizando T-SQL:

View (and disable) SQL Agent Jobs with TSQL

La secuencia de comandos mostrará todos sus puestos de trabajo en su base de datos, y cuando se ejecutará a continuación y así sucesivamente.

Utilizando el nombre_trabajo, también debería poder encontrar detalles sobre sus trabajos utilizando el SQL Server Agent Stored Procedures en la base de datos msdb en su servidor.

+1

Como alternativa, eche un vistazo a esta página MSDN http://msdn.microsoft.com/en-us/library/aa260604%28v=SQL.80%29.aspx, específicamente las Tablas del Agente SQL Server. –

0

Usted puede obtener una lista de todos los trabajos de servidor utilizando este selecto:

SELECT [name] FROM msdb.dbo.sysjobs 

Si desea obtener una lista de los trabajos que se están ejecutando y su información, le recomiendo escribir un procedimiento almacenado en SQL a cuál llama tu aplicación. Hay una buena demostración aquí se podría utilizar ...

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

Buena suerte!

+0

Si publica código o XML, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "código" (101 010) en la barra de herramientas del editor para formatear y resaltar la sintaxis. –

+0

gracias por cada sugerencia, aunque estoy un poco confundido porque soy realmente un novato, pero intentaré seguir cada sugerencia. – Fernatit

4

que puedo hacer esto ya ...

i seleccione Clasificación de la forma "Sysjobserver" en la base de datos "msdb" del estado de lectura, la fecha, la hora del trabajo que quiero.

uso este código

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

gracias por todo el mundo ayudará mucho. :-D

+0

Esta consulta requiere derechos de propietario db? En la base de datos del sistema msdb, que no todos tienen. La obtención de trabajos es posible a través del Agente SQL Server que tiene roles dedicados para usarlo y no requiere derechos de propietario en las bases de datos del sistema. –

1

En SQL Server 2005 y superior, puede utilizar el procedimiento almacenado del sistema msdb.dbo.sp_help_job para obtener información, incluido el estado, sobre los trabajos del Agente SQL Server. Puede leer más sobre sp_help_job en http://msdn.microsoft.com/en-us/library/ms186722(v=SQL.90).aspx.

Aquí está el código de ejemplo para hacer esto desde 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

procedimientos almacenados de SQL de consultas no le otorga ninguna datos del sistema a menos que tenga los derechos de db_owner en la base de datos del sistema msdb, en arrendamiento en SQL Server 2008. Por lo tanto los métodos mencionados normalmente no funcionan para aplicaciones donde se quiero mostrar o administrar trabajos.Sin embargo, el espacio de nombres SMO le proporciona una solución de código administrado para muchas funciones de administración de SQL Server, incluidas las funciones del Agente SQL Server que solo requieren permisos SQLServerAgent * que normalmente podría clasificar para el usuario de su aplicación. Una buena introducción del uso de clases SMO para trabajar con los empleos se da aquí:

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

Yo trabajo en una tarea similar ahora y mientras consultas SQL Dame acceso denegado, con el código C# y Microsoft.SqlServer.Management. Smo.Agent espacio de nombres que acabo de enumerar todos los puestos de trabajo con este código:

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

}

Cuestiones relacionadas