gpt4 book ai didi

c# - 从 C# 运行 Sql Server 代理作业

转载 作者:行者123 更新时间:2023-12-01 18:53:17 26 4
gpt4 key购买 nike

在互联网上搜索上述主题时,我发现了两种方法,两种方法都工作正常,但我需要知道两者之间的区别,哪种适合什么场合等等...我们的工作需要一些时间和我需要一种方法来等待作业完成,然后再执行下一个 C# 行。

方法一

        var dbConn = new SqlConnection(myConString);
var execJob = new SqlCommand
{
CommandType = CommandType.StoredProcedure,
CommandText = "msdb.dbo.sp_start_job"
};
execJob.Parameters.AddWithValue("@job_name", p0);
execJob.Connection = dbConn;

using (dbConn)
{
dbConn.Open();
using (execJob)
{
execJob.ExecuteNonQuery();
Thread.Sleep(5000);
}
}

方法二

        using System.Threading;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Smo.Agent;

var server = new Server(@"localhost\myinstance");
var isStopped = false;
try
{
server.ConnectionContext.LoginSecure = true;
server.ConnectionContext.Connect();
var job = server.JobServer.Jobs[jobName];
job.Start();
Thread.Sleep(1000);
job.Refresh();
while (job.CurrentRunStatus == JobExecutionStatus.Executing)
{
Thread.Sleep(1000);
job.Refresh();
}
isStopped = true;
}
finally
{
if (server.ConnectionContext.IsOpen)
{
server.ConnectionContext.Disconnect();
}
}

最佳答案

sp_start_job - 示例 1

您的第一个示例通过 sp_start_job 调用您的工作系统存储过程。请注意,它异步启 Action 业,并且无论作业成功还是失败,线程都会在继续之前休眠任意时间(5 秒)。

SQL Server 管理对象 (SMO) - 示例 2

您的第二个示例使用(因此依赖于)SQL Server Management Objects达到同样的目标。

在第二种情况下,作业也开始异步运行,但后续循环会监视作业状态,直到它不再执行。请注意,“isStopped”标志似乎没有任何作用,循环可以重构为:

        job.Start();
do
{
Thread.Sleep(1000);
job.Refresh();
} while (job.CurrentRunStatus == JobExecutionStatus.Executing);

您可能希望在一段时间后添加该循环的中断。

其他注意事项

您的每个示例似乎都需要相同的权限;本质上,使用 SMO 的解决方案是 sp_start_job 的包装器,但为您提供了(可以说)更健壮的代码,其目的更明确。

使用最适合您的选项,或者进行一些分析并在考虑性能时选择最有效的选项。

关于c# - 从 C# 运行 Sql Server 代理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com