代码之家  ›  专栏  ›  技术社区  ›  BabyDoll

创建SQL代理作业失败,没有错误

  •  0
  • BabyDoll  · 技术社区  · 6 年前

    我正在尝试使用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?

    1 回复  |  直到 6 年前
        1
  •  0
  •   BabyDoll    6 年前

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