Ras*_*ika 2 c# sql-server ssis business-intelligence sql-agent-job
在互联网上搜索上述主题时,我找到了两种方法,两种方法都很好,但我需要知道两者之间的区别,哪一种适合什么场合等...我们的工作需要一些时间,我需要一个在下一个C#行执行之前等待Job完成的方法.
方法一
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);
}
}
Run Code Online (Sandbox Code Playgroud)
方法二
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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
sp_start_job - 样本1
您的第一个示例通过sp_start_job系统存储过程调用您的作业.请注意,它会异步启动作业,并且线程会在继续之前休眠一段任意时间(5秒),而不管作业是成功还是失败.
SQL Server管理对象(SMO) - 示例2
您的第二个示例使用(因此依赖于)SQL Server管理对象来实现相同的目标.
在第二种情况下,作业也开始异步运行,但后续循环监视作业状态,直到它不再执行为止.请注意,"isStopped"标志似乎没有用处,并且循环可以在某种程度上重构为:
job.Start();
do
{
Thread.Sleep(1000);
job.Refresh();
} while (job.CurrentRunStatus == JobExecutionStatus.Executing);
Run Code Online (Sandbox Code Playgroud)
您可能希望在一段时间后添加该循环的分组.
其他考虑因素
您的每个示例似乎都需要相同的权限; 本质上,使用SMO的解决方案是sp_start_job的包装器,但为您提供(可以说)更健壮的代码,其具有更清晰的目的.
如果性能受到关注,请使用最适合您的方式,或进行一些分析并选择最有效的方法.
归档时间: |
|
查看次数: |
4222 次 |
最近记录: |