【问题标题】:Creating SQL Agent job is failing with no errors创建 SQL 代理作业失败且没有错误
【发布时间】:2018-03-27 06:39:10
【问题描述】:

我正在尝试使用 C# 通过命令行步骤创建 SQL 代理作业。 Web API 正在调用一个包含该方法的类,在单步执行代码时不会引发错误,并且所有变量都有值,但在查看我的 SQL 实例时未创建作业(我正在运行 SQL Server 2016 的本地实例)。我在调用的同一个类中有 2 个方法; CreateJob() 和 AddCommandLineStep()。源码现在是这样的:

类方法

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 Server\130\DTS\Binn\DTEXEC.exe", @"C:\SSIS\CopyDataView.dtsx", Enumerable.Empty<NameValue>().ToList());

我知道空捕获,路径将被变量替换,这只是让代码按要求运行的粗略尝试。

[更新]

我可以肯定地说这些方法有效,在进行单元测试时,我能够在同一个 SQL 实例上创建一个作业。在对这个问题进行了更详细的研究后,我发现大约有。解决方案中的 30 个项目。是否有可能在另一个项目中引用了某些 dll 导致作业创建失败?

【问题讨论】:

    标签: c# api sql-server-2016 sql-agent-job .net-4.7


    【解决方案1】:

    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 Server\130\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());
                }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2022-01-02
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 2018-10-26
      相关资源
      最近更新 更多