|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionFor my last project, I've been using the latest free version of SQL Server, called SQL Server Express Edition, available here. I immediately noticed that the database scheduler was removed since the previous version. I found it really interesting creating my own SQL Agent. In this article, I'll show you how to create a generic scheduler that runs on a Windows Service. The scheduler will be able to accept pluggable actions that we can develop, later implementing a custom interface. BackgroundThis article is about Jobs Scheduling. You're required to have basic knowledge of how to run and install a Windows Service that uses Microsoft .NET Framework v2.0. A good knowledge of OOP, Interfaces and Reflection is also required in order to understand pluggable actions. Install It!The solution provided with this article is composed of four projects:
You can install the service using the attached setup or, alternatively, using the command line as shown below: SQLAgent.exe -i
Run It!Start the execution of
You're now ready to configure your jobs! Using the CodeThe core library of the project is 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
The following is a screenshot of the Jobs Scheduler settings page:
Please note that the Event Scheduler retrieves the data necessary to load the action list using the
The XML file will have the following aspect: <?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>
Configure It!
Extend It!The pluggable actions for the Event Scheduler actually define a framework for our Windows Services. This makes the application really extensible! I've included in this release:
Please contribute to this project by sending your actions!!! Final NotesI hope that you find this article useful. If you find this article stupid, annoying or incorrect, express this fact by rating the article as you see fit. In the end, you're very welcome at any moment to freely contribute to this project by suggesting improvements, or by submitting code or other materials. Credits
References
History
|
||||||||||||||||||||||