创建 SQL 代理作业失败且没有错误
Creating SQL Agent job is failing with no errors
我正在尝试使用 C# 通过命令行步骤创建 SQL 代理作业。 Web API 正在调用包含该方法的 class,当单步执行代码时,不会抛出任何错误并且所有变量都有值,但在查看我的 SQL 实例时不会创建作业(我是 运行 SQL Server 2016 的本地实例)。我在调用的 class 中有 2 个方法; CreateJob() 和 AddCommandLineStep()。源代码目前看起来像这样:
class 方法
public SQLAgentJobHelper CreateJob(string JobName)
{
// Create Job
foreach (Job job in jobServer.Jobs)
{
if (job.Name.Equals(JobName))
{
job.Drop();
break;
}
}
server.ConnectionContext.BeginTransaction();
job = new Job(jobServer, JobName);
job.Create();
job.ApplyToTargetServer(server.Name);
server.ConnectionContext.CommitTransaction();
return this;
}
public void AddCommandLineStep(string StepName, string Executable, string CommandLine, List<NameValue> paramList, bool isLast = false)
{
try
{
if (job == null)
throw new Exception("First call CreateJob before adding steps");
var jobStep = new JobStep(job, StepName);
var paramString = CommandLine;
paramList.ForEach(param => paramString += $"/{param.Name} {param.Value} ");
jobStep.Command = $"\"{Executable}\" {paramString}";
jobStep.SubSystem = AgentSubSystem.CmdExec;
if (isLast)
jobStep.OnSuccessAction = StepCompletionAction.QuitWithSuccess;
else
jobStep.OnSuccessAction = StepCompletionAction.GoToNextStep;
jobStep.OnFailAction = StepCompletionAction.QuitWithFailure;
jobStep.Create();
lastJobStep = jobStep;
}
catch (Exception ex)
{
}
}
API 调用
jobHelper.CreateJob(jobName)
jobHelper.AddCommandLineStep("Step 1", @"C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTEXEC.exe", @"C:\SSIS\CopyDataView.dtsx", Enumerable.Empty<NameValue>().ToList());
我知道空捕获和路径将被变量替换,这只是让代码按要求运行的粗略尝试。
[更新]
我可以肯定地说这些方法有效,在进行单元测试时我能够在同一个 SQL 实例上创建一个作业。在更详细地研究了这个问题之后,我发现大约有。解决方案中的 30 个项目。是否有可能是在另一个项目中引用了某些 dll 导致创建作业失败?
API 现在可以正常工作了!在这种情况下,有必要显式完成 API 事务。使用 TransactionScope 命名空间及其 .Complete() 方法,代码现在类似于:
using (var txscope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
using (SQLAgentJobHelper jobHelper = new SQLAgentJobHelper(ServerConnection))
{
jobHelper.CreateJob(jobName)
jobHelper.AddCommandLineStep("Step 1", @"C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTEXEC.exe", C:\SSIS\CopyDataView.dtsx", Enumerable.Empty<NameValue>().ToList());
}
txscope.Complete();
return Ok(1);
}
catch (Exception ex)
{
txscope.Dispose();
return Ok(ex.StackTrace.ToString());
}
}
我正在尝试使用 C# 通过命令行步骤创建 SQL 代理作业。 Web API 正在调用包含该方法的 class,当单步执行代码时,不会抛出任何错误并且所有变量都有值,但在查看我的 SQL 实例时不会创建作业(我是 运行 SQL Server 2016 的本地实例)。我在调用的 class 中有 2 个方法; CreateJob() 和 AddCommandLineStep()。源代码目前看起来像这样:
class 方法
public SQLAgentJobHelper CreateJob(string JobName)
{
// Create Job
foreach (Job job in jobServer.Jobs)
{
if (job.Name.Equals(JobName))
{
job.Drop();
break;
}
}
server.ConnectionContext.BeginTransaction();
job = new Job(jobServer, JobName);
job.Create();
job.ApplyToTargetServer(server.Name);
server.ConnectionContext.CommitTransaction();
return this;
}
public void AddCommandLineStep(string StepName, string Executable, string CommandLine, List<NameValue> paramList, bool isLast = false)
{
try
{
if (job == null)
throw new Exception("First call CreateJob before adding steps");
var jobStep = new JobStep(job, StepName);
var paramString = CommandLine;
paramList.ForEach(param => paramString += $"/{param.Name} {param.Value} ");
jobStep.Command = $"\"{Executable}\" {paramString}";
jobStep.SubSystem = AgentSubSystem.CmdExec;
if (isLast)
jobStep.OnSuccessAction = StepCompletionAction.QuitWithSuccess;
else
jobStep.OnSuccessAction = StepCompletionAction.GoToNextStep;
jobStep.OnFailAction = StepCompletionAction.QuitWithFailure;
jobStep.Create();
lastJobStep = jobStep;
}
catch (Exception ex)
{
}
}
API 调用
jobHelper.CreateJob(jobName)
jobHelper.AddCommandLineStep("Step 1", @"C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTEXEC.exe", @"C:\SSIS\CopyDataView.dtsx", Enumerable.Empty<NameValue>().ToList());
我知道空捕获和路径将被变量替换,这只是让代码按要求运行的粗略尝试。
[更新]
我可以肯定地说这些方法有效,在进行单元测试时我能够在同一个 SQL 实例上创建一个作业。在更详细地研究了这个问题之后,我发现大约有。解决方案中的 30 个项目。是否有可能是在另一个项目中引用了某些 dll 导致创建作业失败?
API 现在可以正常工作了!在这种情况下,有必要显式完成 API 事务。使用 TransactionScope 命名空间及其 .Complete() 方法,代码现在类似于:
using (var txscope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
using (SQLAgentJobHelper jobHelper = new SQLAgentJobHelper(ServerConnection))
{
jobHelper.CreateJob(jobName)
jobHelper.AddCommandLineStep("Step 1", @"C:\Program Files\Microsoft SQL Server0\DTS\Binn\DTEXEC.exe", C:\SSIS\CopyDataView.dtsx", Enumerable.Empty<NameValue>().ToList());
}
txscope.Complete();
return Ok(1);
}
catch (Exception ex)
{
txscope.Dispose();
return Ok(ex.StackTrace.ToString());
}
}