通过Windows服务c#运行SQL脚本

时间:2017-03-08 06:29:46

标签: c# sql windows-services taskscheduler

我正在尝试在我的Windows服务中安排任务,每周运行脚本。 我不想通过sql工作。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Quartz调度库。它支持CRON触发器。所以你可以定义一个简单的工作,如:

public class Sqljob : IJob
{
    #region Constructors

    public Sqljob()
    {       
    }

    #endregion

    #region IJob members

    public void Execute(IJobExecutionContext context)
    {
        // Perform your SQl work here
    }

    #endregion
}

并有一个调度程序来实例化和安排作业以及触发器:

public class TaskScheduler : ITaskScheduler
{
    #region Private fields

    private readonly IScheduler _scheduler;

    #endregion

    #region Constructors

    public TaskScheduler(IScheduler scheduler)
    {
        _scheduler = scheduler;
    }

    #endregion

    #region ITaskScheduler members

    public string Name
    {
        get { return this.GetType().Name; }
    }

    public void Run()
    {
        ScheduleSqlJob();

        _scheduler.Start();
    }

    public void Stop()
    {
        if (_scheduler != null) _scheduler.Shutdown(true);
    }

    #endregion

    #region Private methods

    private void ScheduleSqlJob()
    {
        var jobDetails = JobBuilder.Create<Sqljob>()
                                   .WithIdentity("Sqljob")
                                   .Build();
        var trigger = TriggerBuilder.Create()
                                    .StartNow()
                                    .WithCronSchedule("// Get your CRON expression here"))
                                    .Build();
        _scheduler.ScheduleJob(jobDetails, trigger);
    }       

    #endregion
}

您的服务可以调用调度程序,如:

public partial class MyService : ServiceBase
{
    #region Fields

    private readonly ITaskScheduler _taskScheduler;

    #endregion

    public MyService(ITaskScheduler taskScheduler)
    {
        InitializeComponent();
        _taskScheduler = taskScheduler;
    }

    protected override void OnStart(string[] args)
    {
        _taskScheduler.Run();
    }

    protected override void OnStop()
    {
        _taskScheduler.Stop();
    }
}