Crear aplicación con Visual Basic .NET para respaldar bases de datos SQL Server

Aplicación para realizar respaldos y restauraciones de bases de datos en SQL Server. En esta primera parte se desarrolla el formulario de respaldos de bases de datos.


Publicado: Editado: Estado:

​Esta es un pequeño ejemplo (parte 1) de una aplicación para realizar respaldos y restauraciones de bases de datos en SQL Server. En esta primera parte se aborda el tema del respaldo para luego continuar en la parte 2 con las restauraciones. Los respaldos que se realizan en esta primera parte son completos (toda la base de datos) y no diferenciales.

Conocimientos previos necesarios

  • Programación en Visual Basic (aplicaciones Windows Forms)
  • Administración de base de datos con SQL Server Management Studio

Entorno de desarrollo (utilizado en este ejemplo)

  • Visual Studio 2015
  • SQL Server 2008 R2

Primeros pasos

Es necesario tener ya una base de datos de ejemplo con la que podamos hacer las pruebas de respaldo, si no tienes una podrás utilizar una de las que provee el sistema, por ejemplo: tempdb o master.

Lo primero que haremos es crearnos un proyecto de tipo Windows Form con el lenguaje Visual Basic en Visual Studio.

Luego, agregamos un formulario al proyecto o utilizamos el que aparece de forma predeterminada y procedemos a agregar los siguientes controles (grupo de controles de la izquierda ya que en esta captura ya he agregado los que utilizaremos más adelante):

CONTROL NOMBRE OBJETIVO
TextBox txtServer Obtener el nombre del servidor
TextBox

txtDB

Obtener el nombre de la base de datos
TextBox txtUsername Obtener el nombre de usuario
TextBox txtPassword Obtener la contraseña. Propiedad “PasswordChar = *”
Button btnTestConnection Probar la conexión a SQL Server
Propiedad “Enabled = FALSE”
PictureBox pbConnStatus Informar al usuario sobre el resultado de la prueba de conexión (visual y textual)
Label lblConnStatus
 

Por el momento, esos son los controles que necesitamos, además de las etiquetas informativas, para programar la parte de las pruebas de conexión. He agregado a un archivo de recursos 3 imágenes para mostrar de forma visual (pbConnStatus) los resultados de la prueba de conexión.

 

 

Mientras se realiza la prueba o cuando hagamos cambios en los parámetros de conexión, mostraremos el color amarillo, si se establece la conexión correctamente, mostramos el verde, si no, mostramos el rojo.

El botón Probar conexión está deshabilitado así que lo primero que haremos es validar que el usuario informe los parámetros de configuración en las cajas de texto: txtServer, txtDB, txtUsername y txtPassword. Si hay datos habilitamos el botón, para ello controlaremos el evento TextChanged de cada TextBox.

 

'Controlar los eventro de cambio de texto en las cajas de texto.
    Private Sub txts_TextChanged(sender As Object, e As EventArgs) Handles _
        txtServer.TextChanged, txtDB.TextChanged, txtUsername.TextChanged, txtPassword.TextChanged

        'Si los TextBox contienen información habilitamos btnTestConnection, de lo contrario lo deshabilitamos.
        If Not String.IsNullOrWhiteSpace(txtServer.Text) And Not String.IsNullOrWhiteSpace(txtDB.Text) And
                Not String.IsNullOrWhiteSpace(txtUsername.Text) And Not String.IsNullOrWhiteSpace(txtPassword.Text) Then
            btnTestConnection.Enabled = True
        Else
            btnTestConnection.Enabled = False
        End If

    End Sub

 

Cada cambio en el contenido provocará que el estado de la conexión sea “NoComprobada”. Para ello enumeraremos los 3 posibles estados: NoComprobada, Establecida y NoEstablecida dentro de la clase. También nos creamos una variable de tipo SqlConnectionStringBuilder para construir la cadena de conexión, aunque si lo deseas puedes construir la cadena de conexión de la forma habitual que es concatenando las propiedades con sus respectivos valores.

 

Private Enum Estado_Conexion
        NoComprobada
        Establecida
        NoEstablecida
    End Enum

    Dim EC As Estado_Conexion
    Dim CSBuilder As New SqlConnectionStringBuilder

 

Y cambiaremos de estados cuando el texto cambie (siempre dentro de txts_TextChanged(…)). Esto significa que cambiaremos la variable EC a uno de sus posibles estados (enumerados), a la caja de imágen le asignamos la imagen de fondo correspondiente para cada estado y mostramos en la etiqueta lblConnStatus el mensaje "Conexión no comprobada". Esto debe ser ubicado como primer bloque de código dentro txts_TextChanged(...).

 

EC = Estado_Conexion.NoComprobada
pbConnStatus.BackgroundImage = My.Resources.light_yellow
lblConnStatus.Text = "Conexión no comprobada."

 

Ahora procedemos con la prueba de conexión (al pulsar sobre btnTestConnection). Para ello intentaremos establecer conexión con los datos informados por el usuario.

Lo primero será importar el espacio de nombres del cliente SQL.

Imports System.Data.SqlClient

 

Ahora, a programar el botón “Probar conexión”. Lo más importante aquí es obtener la cadena de conexión que le pasaremos como parámetro a la conexión (SqlConnection) que crearemos (Cnx), e intentaremos abrir la conexión.

Lo hacemos dentro de un bloque Try-Catch para capturar cualquier error que se presente y mostramos los mensajes correspondientes.

 

Private Sub btnTestConnection_Click(sender As Object, e As EventArgs) Handles btnTestConnection.Click

        'Deshabilitamos btnTestConnection durante la prueba e informamos
        btnTestConnection.Enabled = False
        lblConnStatus.Text = "Comprobando la conexión..."
        lblConnStatus.Refresh()

        'Construimos la cadena de conexión
        With CSBuilder
            .DataSource = txtServer.Text : .InitialCatalog = txtDB.Text : .IntegratedSecurity = False
            .UserID = txtUsername.Text : .Password = txtPassword.Text
        End With

        Dim Cnx As New SqlConnection(CSBuilder.ConnectionString)

        Try
            'Intentamos establecer conexión con el servidor de datos.
            'Si no hay errores, cambiamos la información del estado de la conexión.
            'Y habilitamos las opciones de respaldo
            Cnx.Open()
            EC = Estado_Conexion.Establecida
            pbConnStatus.BackgroundImage = My.Resources.light_green
            lblConnStatus.Text = "Conexión establecida exitosamente."

            btnSelectDir.Enabled = True
            txtBackupName.Enabled = True

        Catch ex As Exception

            'Mostramos los errores que se hayan presentado y cambiamos el estado de la conexión
            MessageBox.Show(ex.Message, "Error en la conexión", MessageBoxButtons.OK, MessageBoxIcon.Error) 'Opcional
            EC = Estado_Conexion.NoEstablecida
            pbConnStatus.BackgroundImage = My.Resources.light_red
            lblConnStatus.Text = "Error en la conexión"

        Finally

            btnTestConnection.Enabled = True
            Cnx.Close()

        End Try

    End Sub

 

Ya en este puento hemos probado la conexión y si todo marcha bien podemos proseguir a lo importante del asunto: Realizar un respaldo de una base de datos específica.

  

Obtener el tamaño de la base de datos a respaldar

Despues de abrir la conexión (Cnx.Open()), lo que debemos hacer es declarar un nuevo comando SQL que ejecutrá un procedimiento almacenado del sistema (SQL Server) llamado sp_spaceused. Este procedimiento nos retornará los valores que mostraremos en las etiquetas informativas del contenedor derecho del formulario:

database_name database_size unallocated_space
Nombre de la base de datos Tamaño total de la base de datos Espacio sin asignar

Para obtener los datos, puedes usar cualquier método en .NET, en este caso yo lo tengo con un SqlDataAdapter y luego extraigo la primer y única fila que viene el resultado luego de ejecutar el comando:

 

Dim Cmd As New SqlCommand("sp_spaceused", Cnx)
Cmd.CommandType = CommandType.StoredProcedure

Dim Dt As New DataTable
Dim Da As SqlDataAdapter = New SqlDataAdapter(Cmd)

Da.Fill(Dt)

Dim Dr As DataRow = Dt.Rows.Item(0)

lblDBName.Text = Dr.Item("database_name").ToString.Trim
lblDBSize.Text = Dr.Item("database_size").ToString.Trim
lblUnallocatedSize.Text = Dr.Item("unallocated space").ToString.Trim

 

Ya con esto procedemos a probar, pero no sin antes cerrar la conexión dentro del bloque Finally. En este ejemplo me conecto a la base de datos master y obtengo que el tamaño es de 5.25 MB.

Por fin... A realizar el respaldo!!!

En la imagen superior puedes ver que a parte de las etiquetas para mostrar la información de la base de datos, hay otros controles para que el usuario seleccione el directorio donde quiere guardar el respaldo y también para ponerle un nombre.

CONTROL NOMBRE OBJETIVO
TextBox txtPath Aqui mostraremos la ruta del directorio donde se guardará el respaldo
Button btnSelectDir Mostrar un cuadro de diálogo para seleccionar una carpeta destino
TextBox txtBackupName Obtener el nombre con que se guardará el respaldo
Button btnBackup Realizar el proceso de respaldo de la base de datos

Para mostrar el cuadro de diálogo de selección de carpetas, declaramos un objeto de tipo FolderBrowserDialog. Llamamos al método ShowDialog() y a la vez comprobamos que el usuario haya aceptado para mostrar la dirección seleccionada (SelectedPath) y mostrarla en la caja de texto txtPath.

 

Private Sub btnSelectDir_Click(sender As Object, e As EventArgs) Handles btnSelectDir.Click
        'Mostramos un cuadro de diálogo para que el usuario seleccione la carpeta donde se guardará el respaldo
        Dim FBD As New FolderBrowserDialog
        If FBD.ShowDialog() = DialogResult.OK Then
            txtPath.Text = FBD.SelectedPath 'Asignamos la dirección de la carpeta a txtPath
        End If
    End Sub

 

Ahora que ya tenemos la ubicación de la carpeta donde guardar el respaldo, solo nos queda habilitar el botón Respaldar, una vez que el usuario escriba un nombre para el archivo de respaldo. Para ello lo hacemos controlando el evento TextChanged() de la caja de texto txtBackupName.

 

Private Sub txtBackupName_TextChanged(sender As Object, e As EventArgs) Handles txtBackupName.TextChanged
        If Not String.IsNullOrWhiteSpace(txtBackupName.Text) Then
            btnBackup.Enabled = True
        Else
            btnBackup.Enabled = False
        End If
    End Sub

Finalmente nos queda programar lo que sucede cuando se pulse el botón Respaldar. La sintaxis para hacer el respaldo en Transact SQL es:

USE master;
GO
BACKUP DATABASE master
TO DISK = 'F:\path\file_name.bak'
   WITH FORMAT,
      MEDIANAME = 'master_backup_test',
      NAME = 'Master Database Backup Test';
GO

 

En TO DISK es necesario especificar dónde se guardará el respaldo y con qué nombre. También se pueden agregar descripciones como se ve en el script y que son utilizados por el gestor de bases de datos de SQL Server. Este fragmento de código es el que adaptaremos para ejecutar el respaldo con la información proporcionada por el usuario a través de las cajas de texto.

 

Private Sub btnBackup_Click(sender As Object, e As EventArgs) Handles btnBackup.Click

        'Verificamos que la conexión sea válida
        If EC = Estado_Conexion.Establecida Then

            'Deshabilitando el botón btnBackup durante el respaldo
            btnBackup.Text = "Respaldando..."
            btnBackup.Enabled = False
            btnBackup.Refresh()

            'Variable de texto que contiene la consulta de respaldo a ejecutarse en el servidor
            Dim Query As String = "BACKUP DATABASE " & txtDB.Text.Trim & "
                                TO DISK = '" & txtPath.Text & "\" & txtBackupName.Text & ".bak'
                                   WITH FORMAT,
                                      MEDIANAME = '" & txtBackupName.Text & "',
                                      NAME = '" & txtBackupName.Text & "'"
            Try
                'Creamos la conexión y el comando que ejecutará la consulta 
                Dim Cnx As New SqlConnection(CSBuilder.ConnectionString)
                Dim Cmd As New SqlCommand(Query, Cnx)

                Cnx.Open()
                Cmd.ExecuteNonQuery()

                MessageBox.Show("Se ha respaldado la base de datos correctamente.", "Respaldo",
                                MessageBoxButtons.OK, MessageBoxIcon.Information)

            Catch ex As Exception

                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

            Finally

                btnBackup.Text = "Respaldar"
                btnBackup.Enabled = True

            End Try
        Else
            MessageBox.Show("No se ha establecido ninguna conexión con el servidor de datos.", "Error",
                            MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        End If

    End Sub

 

El código es bastante sencillo. Primero validamos que la conexión esté en Establecida. Luego cambiamos el texto del botón para que muestre que se está procesando la solicitud y lo deshabilitamos mientras termina de ejecutar la tarea. Declaramos la variable Query que contiene el script que vimos anteriormente y sustituímos los valores con los datos informados por el usuario. Creamos la conexión, el comando y le asignamos la consulta (Query) para ejecutarla en el servidor con el método ExecuteNonQuery(). Esto dentro de un Try-Catch para controlar los errrores que puedan surgir y mostramos los mensajes correspondientes.

Al pulsar sobre el botón btnSelectDir (...) nos pedirá que seleccionemos el directorio donde vamos a guardar el respaldo, la dirección seleccionada se mostrará en txtPath, al pulsar sobre Respaldar se efectuará la operación y luego podremos confirmar que el respaldo se encuentra en el directorio que seleccionamos.

Espero el ejemplo sea de utilidad y también comparto el proyectito a través de un repositorio público en GitHub.

 

Bibliografía

Microsoft Developer Network

Proyecto de mi autoría (descargar el proyecto completo desde el repositorio) o descarga el ejecutable (requiere .NET Framework 4.5)

Dar puntos de agradecimiento
Reportar esta publicación

Déjanos tu comentario

Comentarios

SirOne

(Administrador)

Intereses

Café (elixir de dioses), música, programación, diseño, "El lado oscuro de la luna", The Big Bang Theory, iZombie.

Puntos: 174 Votos: 126