Domanda

I am trying to Invoke a SQL agent job from my C# Application.

I want to be able to.

  • On the Press of a button be able to Execute the Job.

But i also want to have some sort of message for when the job is finished running or fails.

The Below Code sampe from another Answer will not work for me as i need access to the local MSDB database.

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();
}
È stato utile?

Soluzione

Using ADO.NET is not appropriate for what you want to do. You should be using the SQL Server Management Objects API (SMO), which is preferred when doing administrative tasks this way.

More exactly, you should have a look at SMO's Job.Start method. There's a sample in the article on how to use it. The Job class provides some events (such as SuccessAction) to notify you when the job is finished executing.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top