簡體   English   中英

如何從Windows應用程序調用SQL Server代理中的作業

[英]How to invoke the job in SQL Server agent from windows application

我在SQL Server作業代理中安排了一個作業xyz 現在我想從我的Windows應用程序調用該作業。

調用sp_start_job

exec msdb.dbo.sp_start_job @job_name = 'YourJobName'

sp_start_job MSDN參考

SqlConnection DbConn = new SqlConnection(YourConnectionString);
SqlCommand ExecJob = new SqlCommand();
ExecJob.CommandType = CommandType.StoredProcedure;
ExecJob.CommandText = "msdb.dbo.sp_start_job";
ExecJob.Parameters.AddWithValue("@job_name", "YourJobName")
ExecJob.Connection = DbConn; //assign the connection to the command.

using (DbConn)
{
    DbConn.Open();
    using (ExecJob)
    {
        ExecJob.ExecuteNonQuery();
    }
}

使用sp_start_job的方法有效,但遇到的問題是您不確切知道作業何時完成。 該方法將在調用后立即返回,而不是在完成時返回。 如果這對您很重要,那么這是一個使用SQL Server管理對象(SMO)的功能,它只會在作業完成時返回。 您需要添加對以下類的引用:

Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SqlEnum 
Microsoft.SqlServer.ConnectionInfo

這是代碼:

Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Management.Common
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Smo.Agent

public void RunSQLAgentJob(string JobName)
{
    SqlConnection DbConn = new SqlConnection(connectionstring);
    ServerConnection conn;
    Job job;
    Server server;

    using (DbConn) {
        conn = new ServerConnection(DbConn);
        server = new Server(conn);
        job = server.JobServer.Jobs(JobName);
        // make sure it's not already running before starting it
        if (job.CurrentRunStatus == JobExecutionStatus.Idle) 
            job.Start();
        while (job.CurrentRunStatus == JobExecutionStatus.Executing) {
            job.Refresh();
            Console.WriteLine($"Current status of {JobName} is {job.CurrentRunStatus.ToString}");
            System.Threading.Thread.Sleep(3000);
        }
    }
}

代理作業通常只是運行查詢的腳本。 有什么理由你不能只運行代理作業正在運行的查詢?

代理只處理調度和失敗通知等。這有點過於簡化,但代理主要是一個帶有運行查詢的警報的調度程序。 嘗試編寫代理作業腳本,看看是否可以移動到代理和應用程序運行的存儲過程。

文檔描述了所有選項。 如果不想使用TSQL,可以使用C#中的SMO Job類或其他.NET語言。

using Microsoft.SqlServer.Management.Smo;

Server server = new Server("your_server_address");
server.JobServer.Jobs["job_name"]?.Start();

示例可在以下網址找到: https//www.craftedforeveryone.com/start-stop-manage-ms-sql-server-agent-jobs-using-c-sharp/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM