Respaldar bases de datos de SQL Server con Visual Basic .
NET
Por Juan Carlos Rojas Vargas <Kubical ORG, Costa Rica>
Introducción
Generalmente cuando se desarrolla una aplicación para un cliente, una de las
preguntas importantes que se nos hacen es: ¿Y los respaldos de la base de datos?
Con SQL Server tenemos la posibilidad de crear planes de mantenimiento a los que
podemos indicarles ciertas opciones, como por ejemplo, la notificación por correo
electrónico. De esta forma dejamos de lado el trabajo de incluir en nuestro
proyecto un módulo u otra aplicación externa para llevar a cabo los respaldos de
información.
Personalmente, la desventaja de crear un plan de mantenimiento es que éste se
ejecutará con base a los parámetros que le hayamos establecido y no cuando el
cliente desee crear un respaldo de su base de datos. También, para modificar y/o
ejecutar un plan de mantenimiento (en el momento que se decida), es necesario
que el cliente (o el usuario final de la aplicación) tenga un poco de conocimientos
de SQL Server, lo cual, si el mismo no cuenta con los conocimientos, significaría
realizar una capacitación en esa área y como consecuencia perderíamos tiempo y
nuestro cliente deberá desembolsar más dinero.
Este pequeño documento se ha creado para indicar a los desarrolladores como
llevar a cabo un respaldo de una base de datos utilizando Transact-SQL y Visual
Basic .NET. Cabe mencionar que, actualmente con la tecnología .NET es posible
crear planes de mantenimiento desde nuestra aplicación, pero este no es nuestro
caso, ya que lo haremos directamente con Transact-SQL.
Pasos para crear un respaldo desde nuestra aplicación
Esta es una breve lista de los pasos que debemos llevar a cabo para desarrollar
una aplicación sencilla que nos permita generar respaldos de forma fácil (pensado
para usuarios finales sin muchos conocimientos):
1. Obtener la lista de servidores SQL de la red
2. Suministrar los datos de conexión (entiéndase como usuario y contraseña)
3. Obtener el nombre de las bases de datos almacenadas en el servidor
4. Indicar la ubicación y el nombre del respaldo (generalmente el nombre de
un respaldo es: el nombre de la base de datos con la fecha y la hora en que
se realiza (también incluye la extensión .bak), por ejemplo: kubicalorg-
20090320-134706.bak)
5. Crear el respaldo de la base de datos seleccionada
6. Informar al usuario de lo sucedido
Página 1 de 6
Respaldar bases de datos de SQL Server con Visual Basic .NET
Por Juan Carlos Rojas Vargas <Kubical ORG, Costa Rica>
Creación de la interfaz de la aplicación
En la siguiente imagen puede observarse la apariencia de la aplicación:
Cada uno le da la apariencia que desee, o que crea más conveniente para que el
usuario se sienta más cómodo. Lo importante es que, para desarrollar el ejemplo,
la interfaz cuente con todos los controles que se muestran en la imagen anterior.
A continuación se presenta una lista con los tipos, nombres y propiedades de los
controles más importantes que vamos a utilizar:
LISTA DE CONTROLES A UTILIZAR
TIPO NOMBRE PROPIEDAD VALOR
ComboBox cboServidor DropDownStyle DropDownList
cboBD DropDownStyle DropDownList
TextBox txtUsuario
txtContrasena
txtDestino ReadOnly Trae
BackColor Window
Button btnConectar Text C&onectar
btnRespaldar Text &Respaldar
btnCerrar Text &Cerrar
Página 2 de 6
Respaldar bases de datos de SQL Server con Visual Basic .NET
Por Juan Carlos Rojas Vargas <Kubical ORG, Costa Rica>
Programando la utilidad de respaldos
Ya que tenemos lista la interfaz procederemos a agregar el código para darle vida
a nuestro programa. Pero antes, debemos agregar las siguientes referencias:
1. Microsoft.SQLServer.ConnectionInfo
2. Microsoft.SQLServer.Smo
3. Microsoft.SQLServer.SmoEnum
Para agregar las referencias podemos hace clic en la opción Agregar referencia,
ubicada en el menú Proyecto. En el formulario que se nos presenta buscamos el
nombre de las mencionadas anteriormente y listo.
También, vamos a agregar al inicio de nuestra clase (o formulario) las siguientes
líneas:
Imports Microsoft.SqlServer.Management.Smo
Imports system.Data.SqlClient
Con todo esto listo, comenzaremos a escribir el código necesario para que la
aplicación comience a funcionar. Lo primero que programaremos será un
procedimiento con el cual vamos a obtener el nombre de los servidores SQL.
Private Sub psServidores()
Me.cboServidor.Items.Clear()
For Each svrServidor As RegisteredServers.RegisteredServer In _
SmoApplication.SqlServerRegistrations.EnumRegisteredServers
Me.cboServidor.Items.Add(svrServidor.Name)
Next
If Me.cboServidor.Items.Count > 0 Then _
Me.cboServidor.SelectedIndex = 0
End Sub
Para cargar nuestro ComboBox con la lista de servidores, llamamos al
procedimiento psServidores en el evento Load del formulario:
Private Sub frmPrincipal_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Call Me.psServidores()
End Sub
Ahora vamos a programar el evento Click del botón btnConectar. Por medio del
siguiente código verificamos que se haya seleccionado un servidor SQL y
proporcionado el nombre de usuario (la contraseña no se verifica, ya que en
muchos casos hay personas que la dejan en blanco; un gran riesgo de seguridad).
Página 3 de 6
Respaldar bases de datos de SQL Server con Visual Basic .NET
Por Juan Carlos Rojas Vargas <Kubical ORG, Costa Rica>
Con el siguiente código obtenemos el nombre de las bases de datos almacenadas
en el servidor seleccionado por el usuario:
Private Sub btnConectar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnConectar.Click
If Me.cboServidor.Text <> "" And Me.txtUsuario.Text.Trim <> "" Then
Dim svrServidor As New Server(Me.cboServidor.Text)
Me.cboBD.Items.Clear()
Try
With svrServidor
.ConnectionContext.LoginSecure = False
.ConnectionContext.Login = Me.txtUsuario.Text.Trim
.ConnectionContext.Password = Me.txtContrasena.Text.Trim
For Each bdBase As Database In svrServidor.Databases
Me.cboBD.Items.Add(bdBase.Name)
Next
End With
If Me.cboBD.Items.Count > 0 Then Me.cboBD.SelectedIndex = 0
Catch ex As Exception
Me.cboBD.Items.Clear()
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
Else
If Me.cboServidor.Text.Trim = "" Then
If MsgBox("No se encontraron servidores SQL ¿Desea " _
& "actualizar la lista?", MsgBoxStyle.Exclamation + _
MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
Call Me.psServidores()
End If
Else
MsgBox("Por favor, digite el nombre de usuario.", _
MsgBoxStyle.Critical)
Me.txtUsuario.Clear() : Me.txtUsuario.Focus()
End If
End If
End Sub
Perfecto, ya nuestra aplicación obtiene el nombre de los servidores SQL
encontrados y además, nos muestra el nombre de las bases de datos almacenadas
en cualquiera de ellos.
Vamos a agregar el código para el evento Click del botón btnExaminar, así
permitiremos al usuario elegir el directorio donde se almacenará el respaldo:
Private Sub btnExaminar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnExaminar.Click
Dim dlgDestino As New FolderBrowserDialog
With dlgDestino
.Description = "Seleccione el directorio de destino:"
If .ShowDialog = Windows.Forms.DialogResult.OK Then
Página 4 de 6
Respaldar bases de datos de SQL Server con Visual Basic .NET
Por Juan Carlos Rojas Vargas <Kubical ORG, Costa Rica>
Dim strDestino As String = .SelectedPath.ToString
If Not strDestino.EndsWith("\") Then
strDestino = strDestino & "\"
End If
Me.txtDestino.Text = strDestino
End If
End With
End Sub
Casi lista la aplicación; lo único que nos falta es crear el respaldo de la base de
datos seleccionada por el usuario. Para ello vamos a crear una conexión al servidor
SQL y ejecutar el comando de Transact-SQL que nos permitirá crearlo. Además,
realizaremos una verificación para determinar si el usuario ha seleccionado una
base de datos y especificado el directorio de destino del respaldo.
El nombre del respaldo será asignado automáticamente, el formato será el
siguiente: nombreoriginal-fecha-hora.bak.
Private Sub btnRespaldar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRespaldar.Click
If Me.cboBD.Text <> "" And Me.txtDestino.Text.Trim <> "" Then
Dim conConexion As New SqlConnection("data source=" _
& Me.cboServidor.Text & ";user id=" & Me.txtUsuario.Text.Trim _
& ";password=" & Me.txtContrasena.Text.Trim & ";initial " _
& "catalog=" & Me.cboBD.Text & ";")
Try
Dim strNombre_Respaldo As String = Me.cboBD.Text _
& "-" & Date.Now.ToString("yyyyMMdd") & "-" _
& Date.Now.ToString("HHmmss") & ".bak"
conConexion.Open()
Dim coSQL As New SqlCommand("BACKUP DATABASE [" _
& Me.cboBD.Text & "] TO DISK='" & Me.txtDestino.Text _
& strNombre_Respaldo & "'", conConexion)
coSQL.ExecuteNonQuery()
MsgBox("Respaldo creado correctamente :)", _
MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
Finally
conConexion.Close()
End Try
Else
If Me.cboBD.Text = "" Then
If Me.cboServidor.Text <> "" Then
MsgBox("Por favor, conéctese al servidor.", _
MsgBoxStyle.Critical)
Me.btnConectar.Focus()
End If
Else
Página 5 de 6
Respaldar bases de datos de SQL Server con Visual Basic .NET
Por Juan Carlos Rojas Vargas <Kubical ORG, Costa Rica>
MsgBox("Especifique el destino del respaldo.", _
MsgBoxStyle.Critical)
Me.btnExaminar.Focus()
End If
End If
End Sub
Notas finales del autor
Este es el final del artículo, el código no está comentado ni tampoco se da mucha
información acerca de para que sirve cada cosa; pero en fin, espero que haya sido
de su ayuda. El código ha sido desarrollado de la forma más simple para que todos
los entiendan.
Para obtener más información acerca del comando BACKUP de Transact-SQL,
puede consultar la siguiente información en la ayuda de SQL Server 2005:
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/89a4658a-62f1-4289-
8982-f072229720a1.htm
Esto lo he dejado para el final, el ejemplo se ha desarrollado utilizando Visual Basic
.NET 2005 y SQL Server 2005, pero debería funcionar con cualquier versión de las
aplicaciones mencionadas.
Si usted tiene dudas acerca de lo mencionado en este documento, sugerencias,
correcciones u otras inquietudes, por favor, póngase en contacto con el autor por
medio de correo electrónico.
Este documento puede distribuirse completa o parcialmente por cualquier medio,
siempre y cuando se mencionen los datos del autor.
Juan Carlos Rojas Vargas
Kubical ORG, Costa Rica
E-mail: [email protected]
Página 6 de 6