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

远程管理 SQL Server - 第二部分

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.50/5 (2投票s)

2001年11月5日

5分钟阅读

viewsIcon

70258

downloadIcon

734

创建用于远程管理 SQL Server 的组件,创建在完成分配的任务后会自动从计划程序中删除的任务。

引言

我建议您在阅读本文之前先阅读本文的第一部分。SQLDMO 的主要细节已在本文的第一部分进行了讨论。我们已将组件升级为与 SQL Server 7.0 一起使用。上一篇文章中的代码仅适用于 SQL Server 6.5 版本。新组件中进行了更多增强,新组件能够一旦任务完成就自动删除任务。在以前的版本中,一旦创建了任务,就必须通过执行名为“RemoveTask”的方法手动删除该任务,但在新组件中不再需要这样的方法,因为它将在成功完成后删除任务。此外,以前任务在每次到达特定日期时都会执行,但现在任务仅在用户提供给组件的特定日期执行一次。此外,我们还演示了如何在同一作业中添加两个步骤。在上一篇文章中,作业只包含一个步骤,但使用新组件创建的新任务应包含多个作业步骤,即用户可以在同一任务中完成多个作业。现在,让我们逐步分析代码。

Private Sub Class_Initialize()
    
    On Error Resume Next
    
    NL = Chr$(13) & Chr$(10)
        
    Set oSQLServer = New SQLDMO.SQLServer
    
    oSQLServer.LoginTimeout = 10
    
End Sub

当类初始化时创建主对象,同样,当类终止时,此对象将从内存中删除。

我们的主方法称为 AddTask,此方法将向任务计划程序添加一个新任务。请注意,我们没有直接将参数传递给函数,而是使用了属性从用户那里获取输入。

Public Function AddTask()


    On Error GoTo errhandler
        
    oSQLServer.DisConnect

Disconnect the server if its already connected. 
        
    If Server = "" Then
        ErrDesc = "You must enter server name."
        Exit Function
    ElseIf UserID = "" Then
        ErrDesc = "You must enter a valid User ID"
        Exit Function
    ElseIf Password = "" Then
        Password = ""
    End If

从用户那里获取重要参数的值,这些值是连接到 SQL Server 所必需的。

 'Connect to the server!
    oSQLServer.Connect CStr(Server), CStr(UserID), CStr(Password)
    
    Dim oJob As New SQLDMO.Job
    Dim idStep As Integer

Idstep 将用于定义要包含在任务中的步骤总数。

 'Set the schedule name
    oJob.Name = JobID

为作业分配名称。

    'objSQLServer.Executive.Tasks.Add oJob
    oSQLServer.JobServer.Jobs.Add oJob

将新创建的作业添加到作业服务器。JobServer 对象公开与 SQL Server Agent 相关的属性。SQL Server Agent 负责执行计划的作业,并在 SQL Server 出现错误条件或其他 SQL Server 执行或作业状态时通知操作员。

'Use the code below to change the task!!!
    oJob.BeginAlter
    'idStep = 0

最初,我们将步骤 ID 设置为零。因为我们打算在任务中添加两个步骤,所以我们循环两次。

    For idStep = 0 To 2
        
        Dim oJobStep As SQLDMO.JobStep
        Set oJobStep = New SQLDMO.JobStep

我们在上面的语句中创建了一个新的 JobStep 对象。JobStep 对象公开单个 SQL Server Agent 可执行作业步骤的属性。SQL Server Agent 作业包含一个或多个称为步骤的执行单元。每个作业步骤都包含一个文本命令、指定命令解释的执行类型以及确定步骤成功或失败时作业行为的逻辑。

idStep = idStep + 1
        
        oJobStep.Name = JobID & idStep
        oJobStep.StepID = idStep
        
        'Set the job step executable subsystem.
        oJobStep.SubSystem = "TSQL"

子系统属性指定用于解释作业步骤任务定义文本的 SQL Server Agent 执行子系统。

 If DatabaseName <> "" Then
           oJobStep.DatabaseName = DatabaseName
        Else
            oJobStep.DatabaseName = "yourdatabase"
        End If

如果用户未能从前端传递数据库名称,则该组件将拾取硬编码的数据库名称,前提是您已在代码中硬编码了数据库名称。

If idStep = "1" Then
            If CommandText <> "" Then
                oJobStep.Command = CommandText
            Else
                oJobStep.Command = "select * from table1"
                oJobStep.OnSuccessAction = SQLDMOJobStepAction_GotoNextStep
            End If
        Else
        
            oJobStep.StepID = 2
            If Commandtext2 <> "" Then
                oJobStep.Command = Commandtext2
            Else
                oJobStep.Command = "delete from table2"
                oJobStep.OnSuccessAction = SQLDMOJobStepAction_QuitWithSuccess
            End If
       End If
       

我们将两个命令添加到作业中,一个将从表中返回所有记录,第二个将删除表中所有记录。这只是为了给您一个示例,您可以通过从前端传递命令文本或如上所示在代码中硬编码命令文本来对数据库表执行任何操作。

        oJob.JobSteps.Add oJobStep
    Next

将单个作业步骤添加到 JobSteps 集合中。

'Set the Target Server
oJob.ApplyToTargetServer (CStr(Server))

applytotargetserver 方法将执行目标添加到引用的 SQL Server Agent 作业维护的目标列表中。

现在,这是重要部分,即作业的计划,作业已创建,但现在我们必须计划该作业,以便它在特定的日期和时间运行。

JobSchedule 对象公开单个 SQL Server Agent 可执行作业计划的属性。

    Dim oJobSchedule As SQLDMO.JobSchedule
    
    Set oJobSchedule = New SQLDMO.JobSchedule
    
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    'Schedule the task!
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

您可以计算任务开始执行的任何时间和日期,这完全取决于您的选择或要求。我们分别计算了年、月和日。

  Dim startyear, startmonth, startday
    
    'Indicate execution scheduled for everyday by using
    'the FrequencyType and FrequencyInterval properties.
    oJobSchedule.Name = JobID
    oJobSchedule.Schedule.FrequencyType = SQLDMOFreq_OneTime

我们只想执行一次任务,因此我们将频率类型设置为一次。

 'Set the ActiveStartDate to indicating the date on
    'which the schedule becomes active. Start date is
    'today's date
    
    Dim mydate
    mydate = DateAdd("h", CInt(Num_Of_Hours), Now())
        
    Dim hr, min, sec
    hr = Hour(mydate)
    min = Minute(mydate)
    sec = Second(mydate)
    
    Dim mytime
    mytime = hr & min & sec
    
    startyear = DatePart("yyyy", mydate)
    startmonth = DatePart("m", mydate)
    startday = DatePart("d", mydate)
    
    If Len(startmonth) < 2 Then startmonth = "0" & startmonth
    If Len(startday) < 2 Then startday = "0" & startday
    
    oJobSchedule.Schedule.ActiveStartDate = _
       startyear & startmonth & startday

Activestartdate 属性表示计划的第一个生效日期。

'Set the ActiveStartTimeOfDay property to indicate the
    'scheduled execution time on each day
    
    oJobSchedule.Schedule.ActiveStartTimeOfDay = mytime

Activestarttimeofday 属性表示计划的开始时间。

'Indicate that the schedule never expires
    oJobSchedule.Schedule.ActiveEndDate = SQLDMO_NOENDDATE
    oJobSchedule.Schedule.ActiveEndTimeOfDay = SQLDMO_NOENDTIME

同样,我们必须为作业提供有效的结束日期和时间。我们将这些属性设置为 SQLDMO_NOENDDATESQLDMO_NOENDTIME,这意味着在执行之前,作业永远不会过期。

  'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    'Add task to scheduler
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    oJob.JobSchedules.Add oJobSchedule

现在,这是巧妙的部分,即如何自动从计划程序中删除任务,有一个名为 DeleteLevel 的属性,该属性控制 SQL Server Agent 作业的执行后处理。

'Automatically delete job after successful completion
    oJob.DeleteLevel = SQLDMOComp_Success

如果作业成功,我们则从计划程序中删除该作业。

   oJobStep.OnFailAction = SQLDMOJobStepAction_QuitWithFailure
    
    If SQLDMOJobStepAction_QuitWithFailure = True Then
        ErrDesc = "Failure"
    Else
        ErrDesc = "Success"
    End If
    
    oJob.StartStepID = 1
    
    'Alter the job
    oJob.DoAlter
    
    'Clear references to the created objects
    Set oJob = Nothing
    Set oJobStep = Nothing
    Set oJobSchedule = Nothing
    
    Exit Function
    
errhandler:
    
    'Clear references to the created objects
    Set oJob = Nothing
    Set oJobStep = Nothing
    Set oJobSchedule = Nothing
    
    ErrDesc = "Failure: " & "'" & Err.Source _
      & "'" & " " & Err.Number & " " & Err.Description
    
End Function

其余代码与我们在第一部分看到的类似,在类终止时销毁对象。编译 DLL 并从您的 VB 项目或 ASP 代码中访问该组件。它运行良好且高效。您可以自定义该组件以添加更多功能或根据自己的需求更改功能。

摘要

SQLOLE 和 SQLDMO 之间存在差异,SQLOLE.DLL 库随 SQL Server 6.5 一起提供,而 SQLDMO.DLL 库随 SQL Server 7.0 一起提供。您必须包含正确的库引用。就本文而言,请添加对 SQLDMO.DLL 的引用。

© . All rights reserved.