8

SQL Server 2000 エージェント ジョブのステータスとジョブが発生したときの情報を監視するためのアプリケーションを作成する必要があります。これは、Windows アプリケーション イベント ログに表示されるのと同じです。現在、接続文字列を介して既にデータベースに接続していますが、ジョブからステータスと情報を取得する方法がわかりません。

テキストボックスにステータスと情報を表示する必要があります。

あなたは何をする方法を提案しますか。

開発者ツール :

  1. MS SQL サーバー 2000 SP4
  2. MS Visual Studio 2008 (C#)

私は新人プログラマーです。

4

6 に答える 6

5

私はすでにこれを行うことができます...

データベース「msdb」のフォームテーブル「Sysjobserver」を選択して、必要なジョブのステータス、日付、時刻を読み取ります。

このコードを使用してください

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

皆様、大変お世話になりました。:-D

于 2011-03-11T03:39:39.060 に答える
3

SQL Server 2008 では、msdb システム データベースに対する db_owner 権限がない限り、クエリの SQL ストアド プロシージャはシステム データを提供しません。したがって、上記の方法は通常、ジョブを表示または管理するアプリケーションでは機能しません。ただし、SMO 名前空間は、多くの SQL Server 管理機能のマネージ コード ソリューションを提供します。これには、通常はアプリケーション ユーザー用に並べ替えられる SQLServerAgent* アクセス許可のみを必要とする SQL Server エージェント機能が含まれます。SMO クラスを使用してジョブを操作するための適切な紹介は、次のとおりです。

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

私は現在、同様のタスクに取り組んでおり、SQL クエリでアクセスが拒否されましたが、C# コードと Microsoft.SqlServer.Management.Smo.Agent 名前空間を使用して、次のコードですべてのジョブを一覧表示しました。

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);
            }
        }
    }
}
于 2012-05-15T16:55:40.650 に答える
2

これは、T-SQL を使用して SQL エージェント ジョブを見つける方法を見つけるための出発点として適しています。

TSQL を使用した SQL エージェント ジョブの表示 (および無効化)

スクリプトは、データベース上のすべてのジョブを一覧表示し、次にいつ実行するかなどを示します。

job_name を使用すると、サーバー上のデータベースでSQL Server エージェント ストアド プロシージャを使用して、ジョブの詳細を確認することもできmsdbます。

于 2010-09-21T05:21:40.203 に答える
1

SQL Server 2005 以降では、システム ストアド プロシージャ msdb.dbo.sp_help_job を使用して、ステータスを含む SQL Server エージェント ジョブに関する情報を取得できます。sp_help_job の詳細については、 http ://msdn.microsoft.com/en-us/library/ms186722(v=SQL.90).aspx を参照してください。

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=SERVERNAME;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();
}
于 2011-12-19T17:30:13.780 に答える
0

この SELECT を使用して、すべてのサーバー ジョブのリストを取得できます。

SELECT [name] FROM msdb.dbo.sysjobs

現在実行中のジョブとその情報のリストを取得したい場合は、アプリケーションが呼び出すストアド プロシージャを SQL で作成することをお勧めします。ここで使用できる良いデモンストレーションがあります...

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

幸運を!

于 2010-09-21T05:34:42.037 に答える