65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Agent:作业调度程序框架

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (96投票s)

2006 年 8 月 30 日

GPL3

3分钟阅读

viewsIcon

1434573

downloadIcon

13684

一个易于使用的 .NET 解决方案,用于作业调度,带有可插入的动作,运行在 Windows 服务上。备份您的 SQL Server Express 等等!

引言

在我的最后一个项目中,我使用了最新免费版的 SQL Server,称为 SQL Server Express Edition,可在此处获取。我立即注意到自前一版本以来,数据库调度器已被移除。我觉得创建自己的 SQL Agent 非常有趣。在本文中,我将向您展示如何创建一个通用的 Windows 服务调度器。该调度器将能够接受可插入的动作,我们可以稍后开发并实现一个自定义接口。

背景

本文是关于作业调度的。您需要具备运行和安装使用 Microsoft .NET Framework v2.0 的 Windows 服务的基础知识。为了理解可插入动作,还需要具备面向对象编程、接口和反射的良好知识。

安装!

本文提供的解决方案包含四个项目

  • SQLAgent,一个封装调度器的 Windows 服务
  • SQLAgentUI,一个用于从系统托盘控制服务的 Windows 应用程序
  • EventScheduler,一个包含组成调度器和配置其窗体的所有类的类库
  • EventSchedulerAction,一个用于调度器作业的可插入动作的类库

您可以使用附带的安装程序进行安装,或者使用下面的命令进行安装。

SQLAgent.exe -i

运行它!

启动 SQLAgentUI 的执行,然后按 SQL Server Agent 标签旁边的 运行 按钮。如果您在运行系统托盘应用程序时遇到问题,请返回服务安装过程。按 配置 SQL Server Agent 按钮访问配置页面。将显示以下页面

您现在可以配置您的作业了!

Using the Code

项目核心库是 EventScheduler。事实上,事件调度器允许我们调度作业,通过无缝的界面配置它们,并通过 XML 文件存储设置。所有这些功能都触手可及。我们只需要实现库定义的 IActionable 接口。以下是 SQL 备份作业的实现。

Imports Microsoft.SqlServer.Management
Imports EventScheduler
Public Class MSSQLBackup
Implements IActionable

#Region "Implements IActionable"
    Protected Shared DefaultParameters() As ActionParameter = _
        {New ActionParameter("Server", _
        ".\SQLExpress"), _
        New ActionParameter("Database", ""), _
        New ActionParameter("Backup Folder", _
        "C:\Backup\")}

    Public ReadOnly Property ActionParameters() As _
        EventScheduler.ActionParameter() _
        Implements IActionable.ActionParameters
        Get
            Return MSSQLBackup.DefaultParameters.Clone
        End Get
    End Property

    Public Sub ActionRun(ByVal s As EventScheduler.Schedule) _
        Implements IActionable.ActionRun
        Dim oParameters() As ActionParameter = s.GetActionParameters
        BackupDatabase(oParameters(0).Value, _
            oParameters(1).Value, _
            oParameters(2).Value)
    End Sub

    Public ReadOnly Property ActionText() As String _
        Implements IActionable.ActionText
        Get
            Return "SQL Server Backup"
        End Get
    End Property
#End Region

#Region "Private Methods"
    Protected Sub BackupDatabase(ByVal ServerName As String, _
        ByVal DatabaseName As String, _
        ByVal BackupFolder As String)
        Try
            Dim srv As New Smo.Server(ServerName)
            Dim bkp As New Smo.Backup
            bkp.Action = Smo.BackupActionType.Database
            bkp.Database = DatabaseName

            Dim filePath As String = BackupFolder
            filePath = System.IO.Path.Combine(BackupFolder, _
                DatabaseName & "-" & Now.Year() & _
                "-" & Now.Month.ToString("00") & _
                "-" & Now.Day.ToString("00") & _
                "-" & Now.Hour.ToString("00") & _
                "-" & Now.Minute.ToString("00") & _
                "-" & Now.Second.ToString("00") & _
                ".bak")

            bkp.Devices.AddDevice(filePath, Smo.DeviceType.File)
            bkp.SqlBackup(srv)

            Catch ex As Exception
        End Try
    End Sub
#End Region

End Class

以下是作业调度器设置页面的截图

请注意,事件调度器使用 IActionable 接口来检索加载动作列表所需的数据,以及参数列表。动作设置界面将如下所示

XML 文件将具有以下外观

<?xml version="1.0"?>
    <ArrayOfSchedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Schedule xsi:type="DailySchedule" Name="Daily Backup" 
            Active="false" Interval="0">
            <StartTime>2006-08-30T12:45:30.15625+02:00</StartTime>
            <NextInvokeTime>2006-08-31T12:45:30.15625+02:00
            </NextInvokeTime>
            <LastInvokeTime>2006-08-30T12:45:40.84375+02:00
            </LastInvokeTime>
            <Action>0</Action>
            <ActionParameters>
                <ActionParameter>
                    <Name>Server</Name>
                    <Value xsi:type="xsd:string">.\SQLExpress
                    </Value>
                    <Type>NormalActionParameter</Type>
                </ActionParameter>
                <ActionParameter>
                    <Name>Database</Name>
                    <Value xsi:type="xsd:string">MyDatabase</Value>
                    <Type>NormalActionParameter</Type>
                </ActionParameter>
                <ActionParameter>
                    <Name>Backup Folder</Name>
                    <Value xsi:type="xsd:string">C:\Backup\</Value>
                    <Type>NormalActionParameter</Type>
                </ActionParameter>
            </ActionParameters>
            <WeekDays>
                <boolean>false</boolean>
                <boolean>true</boolean>
                <boolean>true</boolean>
                <boolean>true</boolean>
                <boolean>true</boolean>
                <boolean>true</boolean>
                <boolean>false</boolean>
            </WeekDays>
            <BeginValidTime>2006-08-30T00:00:00+02:00</BeginValidTime>
            <EndValidTime>2006-08-30T00:00:00+02:00</EndValidTime>
        </Schedule>
    </ArrayOfSchedule>

配置!

SQLAgentSQLAgentUI 已配置为使用默认的 SQL Server Express 实例运行。但是,也可以将其配置为使用 SQL Server 的命名实例。配置主要基于两个文件

  • SQLAgent.exe.config
  • SQLAgentUI.exe.config

扩展!

事件调度器的可插入动作实际上为我们的 Windows 服务定义了一个框架。这使得应用程序真正可扩展!在此版本中,我包含了

  • 使用 SMO 进行 SQL Server 数据库备份
  • 使用 SMO 进行 SQL Server 数据库收缩
  • 执行 SQL 命令
  • 发送电子邮件(当用作 PostAction 时,可以在消息文本中包含 [RESULTSET] 标签)
  • 使用 Esendex Web 服务发送 SMS(当用作 PostAction 时,可以在消息文本中包含 [RESULTSET] 标签)

请通过发送您的动作来为本项目做出贡献!

最终注释

希望您觉得本文有用。如果您觉得本文愚蠢、令人讨厌或不正确,请通过您认为合适的方式给文章评分来表达您的观点。最后,我们随时欢迎您通过提出改进建议、提交代码或其他材料来自由贡献本项目。

致谢

  • 感谢 Gonzalo Brusella 的反射实现
  • 感谢 Lukasz Swiatkowski 的炫酷玻璃按钮
  • 感谢 Nick Wälti 的精美渐变面板
  • 感谢 Sriram Chitturi 的事件调度文章

参考文献

历史

  • 2006 年 8 月 30 日 – 首次提交
  • 2007 年 4 月 6 日 – 项目更新
  • 2007 年 8 月 10 日 – 项目更新
  • 2007 年 9 月 4 日 - 项目更新
  • 2007 年 9 月 18 日 - 项目更新
  • 2008 年 5 月 6 日 - 项目更新
© . All rights reserved.