如何从Windows应用程序调用SQL Server代理中的作业

use*_*910 21 c# sql-server winforms

我已xyz在SQL Server作业代理中安排了一个作业.现在我想从我的Windows应用程序调用该作业.

小智 29

拨打电话sp_start_job.

exec msdb.dbo.sp_start_job @job_name = 'YourJobName'
Run Code Online (Sandbox Code Playgroud)

MSDN参考 sp_start_job

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 sp_start_job 的方法是有效的,但它会遇到一个问题,因为您不知道作业何时完成。该方法将在调用后立即返回,而不是在完成时返回。如果这对您很重要,这里有一个使用 SQL Server 管理对象 (SMO) 的函数,该函数仅在作业完成时才返回。您需要添加对以下类的引用:

\n\n
Microsoft.SqlServer.Management.Sdk.Sfc\nMicrosoft.SqlServer.Smo\nMicrosoft.SqlServer.SqlEnum\xc2\xa0\nMicrosoft.SqlServer.ConnectionInfo\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

这是代码:

\n\n
Imports System.Data.SqlClient\nImports Microsoft.SqlServer.Management.Common\nImports Microsoft.SqlServer.Management.Smo\nImports Microsoft.SqlServer.Management.Smo.Agent\n\npublic void RunSQLAgentJob(string JobName)\n{\n    SqlConnection DbConn = new SqlConnection(connectionstring);\n    ServerConnection conn;\n    Job job;\n    Server server;\n\n    using (DbConn) {\n        conn = new ServerConnection(DbConn);\n        server = new Server(conn);\n        job = server.JobServer.Jobs(JobName);\n        // make sure it\'s not already running before starting it\n        if (job.CurrentRunStatus == JobExecutionStatus.Idle) \n            job.Start();\n        while (job.CurrentRunStatus == JobExecutionStatus.Executing) {\n            job.Refresh();\n            Console.WriteLine($"Current status of {JobName} is {job.CurrentRunStatus.ToString}");\n            System.Threading.Thread.Sleep(3000);\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n