//引用:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo.Agent;
using Microsoft.SqlServer.Management.Smo.Broker;
using Microsoft.SqlServer.Management.Smo.Internal;
using Microsoft.SqlServer.Management.Smo.Mail;
using Microsoft.SqlServer.Management.Smo.SqlEnum;
using System.Data.OleDb;
using System.IO;
using System.Data.SqlClient;
/// <summary>
/// 注释:使用SMO需要引用下面的dll文件,文件路径:C:/Program Files/Microsoft SQL Server/100/SDK/Assemblies/
/// Microsoft.SqlServer.ConnectionInfo.dll
/// Microsoft.SqlServer.Smo.dll
/// Microsoft.SqlServer.Management.Sdk.Sfc.dll
/// Microsoft.SqlServer.SqlEnum.dll
/// </summary>
#region 创建包含步骤和计划的作业
/// <summary>
/// 创建包含步骤和计划的作业
/// </summary>
/// <param name="databaseName">数据库名</param>
/// <param name="jobName">作业名称</param>
/// <param name="description">作业说明</param>
/// <param name="strSQl">SQL命令</param>
/// <param name="startDate">开始日期,为null表示当前时间</param>
/// <param name="endDate">截止日期,为null表示无截止日期</param>
/// <param name="FrequencyType">计划频率,每天、每周、每月、只运行一次</param>
public Guid Create(string databaseName, string jobName, string description, string strSQl,
DateTime startDate, DateTime endDate, FrequencyTypes FrequencyType)
{
#region 创建作业
ServerConnection conn = new ServerConnection("dev-db", "sa", "sqlserver");
Server myServer = new Server(conn);
//调用删除job方法,传入job名称
DeleteJob(jobName);
Job jb = new Job(myServer.JobServer, jobName);
jb.Description = description;
jb.Create();
#endregion 创建作业
#region 作业步骤
JobStep jbstp = new JobStep(jb, "作业步骤");
//数据库
jbstp.DatabaseName = databaseName;
//计划执行的SQL命令
jbstp.Command = strSQl;
//成功时执行的操作
jbstp.OnSuccessAction = StepCompletionAction.QuitWithSuccess;
//失败时执行的操作
jbstp.OnFailAction = StepCompletionAction.QuitWithFailure;
//创建 SQL 代理实例的作业步骤.
jbstp.Create();
#endregion 作业步骤
#region 作业计划属性
JobSchedule jbsch = new JobSchedule(jb, "作业计划");
//计划频率,每几天一次
//每天一次,指定时间运行
//--Daily [每天]
//--Weekly [每周]
//--Monthly [每月]
//--Run Once [只运行一次]
//jbsch.FrequencyTypes = FrequencyTypes.Daily;
jbsch.FrequencyTypes = FrequencyType;
jbsch.FrequencyInterval = 1;
jbsch.FrequencySubDayTypes = FrequencySubDayTypes.Once;
jbsch.ActiveStartTimeOfDay = new TimeSpan(12, 37, 0);
//每天多次,每隔指定时间一次
//jbsch.FrequencySubDayTypes = FrequencySubDayTypes.Hour;
//jbsch.FrequencySubDayInterval = 1;
//jbsch.ActiveStartTimeOfDay = new TimeSpan(0, 0, 0);
//jbsch.ActiveEndTimeOfDay = new TimeSpan(23, 59, 59);
//持续时间
if (startDate != null)
{ //开始时间
jbsch.ActiveStartDate = startDate;
}
else
{
jbsch.ActiveStartDate = DateTime.Now;
}
if (endDate != null)
{
//结束时间,null表示无结束日期
jbsch.ActiveEndDate = endDate;
}
//创建SQL代理实例的作业调度
jbsch.Create();
//创建成功后立刻执行一次开始
jb.ApplyToTargetServer(myServer.JobServer.Name);
jb.Start();
//创建成功后立刻执行一次结束
#endregion 作业计划属性
//返回作业GUID
return jb.JobID;
}
#endregion
#region 删除job
/// <summary>
/// 删除job
/// </summary>
/// <param name="jobName">job名称</param>
/// <returns></returns>
public int DeleteJob(string jobName)
{
//记录返回值
int count = 0;
try
{
//获取Web.config数据库连接
string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(ConnectionString);
//打开
con.Open();
string strSQL = "EXEC msdb.dbo.sp_delete_job @job_name=" + jobName;
SqlCommand cmd = new SqlCommand(strSQL, con);
//执行命令
count = cmd.ExecuteNonQuery();
//关闭
con.Close();
}
catch (Exception)
{
return count;
throw;
}
return count;
}
#endregion
///
#region 启动Agent服务
/// <summary>
/// 启动Agent服务,返回一个 int值,如果大于0成功,否则失败
/// </summary>
/// <returns></returns>
public int StartServices()
{
int count = 0;
try
{
//获取Web.config数据库连接
string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(ConnectionString);
//打开
con.Open();
//启动Agent
string strSQL = "exec master..xp_cmdshell 'net start SQLServerAgent '";
SqlCommand cmd = new SqlCommand(strSQL, con);
//执行命令
count = cmd.ExecuteNonQuery();
//关闭
con.Close();
}
catch (Exception)
{
return count;
throw;
}
return count;
}
#endregion