Home > Articles > Data > SQL Server

SQL Server Reference Guide

Hosted by

Toggle Open Guide Table of ContentsGuide Contents

Close Table of ContentsGuide Contents

Close Table of Contents

Data Management Objects: Server Object Methods

Last updated Mar 28, 2003.

We've been exploring SQL Data Management Object (SQL-DMO) programming in our last few articles. If you're just joining us, you might want to read the previous two articles to bring you up to where we are today.

The program we have so far uses the SQLServer object. This object has been around for quite a while, all the way back to SQL Server version 7. In SQL Server 2000, the DMO model was extended to have even more properties and a few more methods. Instead of changing the SQLServer object, Microsoft added another object: SQLServer2. This object "inherits" all the things that the SQLServer object can do. From here on, I use the SQLServer2 object, but if you're running SQL Server version 7 you'll need to stick with the older object.

I'll need to change my comments to reflect these changes, so here's how the code looks now:

' dmo.vbs
' Created:     12/10/04 - Buck Woody
' Change Log:    
'12/11/04 - Buck Woody - Added comments, InputBox.
'12/17/04 - Buck Woody - Changed Server object to 
'SQLServer2 and added two new properties to show


' Variable to hold Server Name
Dim ServerNameVar
' Variables for the text boxes
Dim MsgBoxVar
Dim MsgTxtVar

' Ask for the name
ServerNameVar = InputBox("Enter Server Name:")
    If ServerNameVar = "" Then
        ServerName = "(local)"
    End If

' Create the server object using SQL-DMO
Set oServer = CreateObject("SQLDMO.SQLServer2")
' Login with current Windows account
oServer.LoginSecure = True
oServer.Connect ServerNameVar

' Fill the variable with server properties
MsgTxtVar = "Name: " & oServer.Name & VbCRLf _
    & "ANSI Nulls: " & oServer.AnsiNulls & VbCRLf _
    & "Host: " & oServer.HostName & VbCRLf _ 
    & "Service Name (2): " & oServer.ServiceName & VbCRLf _ 
    & "Auto-Start (2): " & oServer.AutoStart & VbCRLf _ 
    & "Version: " & oServer.VersionMajor & "." _
    & oServer.VersionMinor & VbCRLf _ 
    & oServer.VersionString

' Get the message box
MsgBoxVar = MsgBox(MsgTxtVar, 64, "SQL Server Info")

' Clean up
Set oServer = Nothing

This is a bit better, since I now have access to a few more properties, but the program still doesn't do very much. In this article, I extend its functionality to do a shutdown of the SQL Server service on that system.

To accomplish that I use a method. By now, you'll remember that the SQL-DMO library gives us access to properties (settings to set and display) and methods (actions to perform). A method is simple enough to call. It's similar to what I've already shown you with properties; you just preface the method with the object name. The method may require various parameters, depending on what it does. I'll show you a few of those as we move along, and you can always refer to the Microsoft reference site for the full listing.

The .Shutdown method has only one parameter: Wait. This parameter can be either TRUE or FALSE, and it's optional. If Wait is set to TRUE (the default) then the server performs a clean, orderly shutdown. If Wait is set to FALSE, then the service shuts down no matter what.

NOTE

If a parameter is used, you have to put it in between parenthesis. If you don't use a parameter, you don't need them.

So to shutdown a server is nothing more than this line:

oServer.Shutdown

That's fine, but it might be better to offer the user a chance to request that shutdown, just in case they don't know what the program does when they start it. To do that, we need to get more input from the user. We could use another variable, but in this case I'll just use the built-in functionality of the MsgBox() function in VBScript.

Recall that I set the type of the message box with a number in this line:

' Get the message box
MsgBoxVar = MsgBox(MsgTxtVar, 64, "SQL Server Info")

The "64" sets the box to "information." Other numbers set the box to do more things. You can also use words (called vb-constants) instead of the numbers, so we'll do that for better readability. Here's a handy chart:

VBOKOnly

0

Show OK button

VBOKCancel

1

Show OK and cancel buttons

VBAbortRetryIgnore

2

Show abort, retry, ignore buttons

VBYesNoCancel

3

Show yes, no cancel buttons

VBYesNo

4

Show yes, no buttons

VBRetryCancel

5

Show retry, cancel buttons

VBCritical

16

Show critical message icon

VBQuestion

32

Show warning query button

VBExclamation

48

Show warning message icon

VBInformation

64

Show information message icon

VBDefaultButton1

0

First button is default

VBDefaultButton2

256

Second button is default

VBDefaultButton3

512

Third button is default

VBDefaultButton4

768

Fourth button is default

VBApplicationModal

0

Demands that the user respond to the dialog before allowing continuation of work in current application

VBSystemModal

4096

Causes suspension of all applications until the user responds to the dialog


We need to change our code to show a different kind of message box, give the user a choice about shutting the server down, evaluate what they tell us, and act accordingly.

Let's do each of those steps in order. First, I change the message box to display yes, no, and cancel buttons:

' Get the message box
MsgBoxVar = MsgBox(MsgTxtVar, VBYesNo, "SQL Server Info")

Hmmm. I don't like the MsgBoxVar variable name anymore, since it's no longer just a display. I'm actually performing an action on the server, and the variable now stores what the user wants to do. So, I change the variable name to reflect that:

' Variables for the text boxes
Dim ControlVar
Dim MsgTxtVar

And then I change the variable in the message box area as well:

ControlVar = MsgBox(MsgTxtVar, 4, "SQL Server Info")

That's better. Now the ControlVar variable holds the number that represents the button the user clicked. If you change a variable name, it's important to change it everywhere, at the same time. Missing a variable is one of the top coding mistakes!

I need to tell the user that clicking on the Yes button will shut the server down. I put that at the end of the MsgTxt variable:

' Fill the variable with server properties
MsgTxtVar = "Name: " & oServer.Name & VbCRLf _
    & "ANSI Nulls: " & oServer.AnsiNulls & VbCRLf _
    & "Host: " & oServer.HostName & VbCRLf _ 
    & "Service Name (2): " & oServer.ServiceName & VbCRLf _ 
    & "Auto-Start (2): " & oServer.AutoStart & VbCRLf _ 
    & "Version: " & oServer.VersionMajor & "." _
    & oServer.VersionMinor & VbCRLf _ 
    & oServer.VersionString & VbCRLf _ 
    & VbCRLf & "Shut Down SQL Server Service?"

Notice that I put one more VbCRLf in there, so that it really sets the text off and makes it more visible.

When the user clicks a button, the number corresponding to that button is now stored in the ControlVar variable. All we have left to do is take the captured value and perform a SQL Server shutdown, if that's what is requested. Here's a chart of possible values from a message box:

VBOK

1

OK

VBCancel

2

Cancel

VBAbort

3

Abort

VBRetry

4

Retry

VBIgnore

5

Ignore

VBYes

6

Yes

VBNo

7

No


Now I create another "if" block to perform the action:

If ControlVar = VBYes then
    oServer.Shutdown
End If

When the user runs this code, the system generates an error. The reason for this is that you've removed the object that you've been referencing, so VBScript gets a little confused as to what you're talking about. It's kind of like talking to someone that you think is in the room when they've already left.

I'm OK with this error, though, because it's descriptive enough to let the user know that the server is off now. If we wanted to have a more orderly shutdown out of our VBScript program, we'd handle this a bit differently. For now, this works.

Let's take a look at the final code:

' dmoInfoAndShutDown.vbs
' Created:     12/10/04 - Buck Woody
' Change Log:    
'12/11/04 - Buck Woody - Added comments, InputBox.
'12/17/04 - Buck Woody - Changed Server object to 
'SQLServer2 and added two new properties to show. Also
'added the ability to shut down the server.
    
        

' Variable to hold Server Name
Dim ServerNameVar
' Variables for the text boxes
Dim ControlVar
Dim MsgTxtVar

' Ask for the name
ServerNameVar = InputBox("Enter Server Name:")
    If ServerNameVar = "" Then
        ServerName = "(local)"
    End If

' Create the server object using SQL-DMO
Set oServer = CreateObject("SQLDMO.SQLServer2")
' Login with current Windows account
oServer.LoginSecure = True
oServer.Connect ServerNameVar

' Fill the variable with server properties
MsgTxtVar = "Name: " & oServer.Name & VbCRLf _
    & "ANSI Nulls: " & oServer.AnsiNulls & VbCRLf _
    & "Host: " & oServer.HostName & VbCRLf _ 
    & "Service Name (2): " & oServer.ServiceName & VbCRLf _ 
    & "Auto-Start (2): " & oServer.AutoStart & VbCRLf _ 
    & "Version: " & oServer.VersionMajor & "." _
    & oServer.VersionMinor & VbCRLf _ 
    & oServer.VersionString & VbCRLf _ 
    & VbCRLf & "Shut Down Server Service?"

' Get the message box
ControlVar = MsgBox(MsgTxtVar, VBYesNo, "SQL Server Info")

If ControlVar = VBYes then
    oServer.Shutdown
End If

' Clean up
Set oServer = Nothing

Notice that I changed the program's filename to reflect what it does. Using more powerful languages such as C#, you could make these functions into separate parts of the program, and call them from a better interface. We'll continue to use VBScript for our examples, and just make each one a separate file.

The same code I'll show you, however, would work inside a Visual Basic program (assuming you give the variables a type and set a reference to the SQL-DMO library).

And here's what the code looks like when it runs:

Figure 142Figure 142

Next time, we'll explore the database object. See you then!

Online Resources

The full documentation for the Server Object Library can be found here.

If you're anxious to get started with deeper programming, you can find a great site on SQL Development here.

InformIT Tutorials and Sample Chapters

Sharon Dooley discusses SQL-DMO in her book called SQL Server 7 Essential Reference that you can read right here on Safari.