Codigo en C# para crear un respaldo de una base de datos en SQL server y restaurarla

Aquí les dejo un codigo en C# muy útil para cuando hagan sus aplicaciones con bases de datos en SQL server puedan respaldar la base de datos y restaurarla.

Codigo para un botón respaldar:

 

  private void button1_Click(object sender, EventArgs e)
        {
            bool desea_respaldar = true;

            //poner cursor de relojito mintras respalda
            Cursor.Current = Cursors.WaitCursor; 

             if (Directory.Exists(@"c:\ Respaldo"))
                {
                    if (File.Exists(@"c:\ Respaldo\resp.bak"))
                    {
                        if (MessageBox.Show(@"Ya habia un respaldo anteriormente ¿desea remplazarlo?", "Respaldo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                        {
                            File.Delete(@"c:\ Respaldo\resp.bak");
                        }
                        else
                            desea_respaldar = false;
                    }
                }
                else
                    Directory.CreateDirectory(@"c:\ Respaldo");

                if (desea_respaldar)
                {
                    //esto puede ser un método aparte de conexion a la base de datos-----------
                    SqlConnection connect;
                    string con = "Data Source = localhost; Initial Catalog=BD ;Integrated Security = True;";
                    connect = new SqlConnection(con);
                    connect.Open();
                    //-------------------------------------------------------------------------

                    //esto puede ser un método aparte para ejecutar comandos SQL---------------
                    SqlCommand command;
                    command = new SqlCommand(@"backup database BD to disk ='c:\ Respaldo\resp.bak' with init,stats=10", connect);
                    command.ExecuteNonQuery();
                    //-------------------------------------------------------------------------

                    connect.Close();

                    MessageBox.Show("El Respaldo de la base de datos fue realizado satisfactoriamente", "Respaldo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
        }

Código para un botón restaurar:

   private void button5_Click(object sender, EventArgs e)
        {
            //poner cursor de relojito
            Cursor.Current = Cursors.WaitCursor;

            try
            {
                if (File.Exists(@"c:\ Respaldo\resp.bak"))
                {
                    if (MessageBox.Show("¿Está seguro de restaurar?", "Respaldo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        //esto puede ser un método aparte de conexion a la base de datos-----------
                        SqlConnection connect;
                        string con = "Data Source = localhost; Initial Catalog=master ;Integrated Security = True;";
                        connect = new SqlConnection(con);
                        connect.Open();
                        //--------------------------------------------------------------------------

                        //esto puede ser un método aparte para ejecutar comandos SQL----------------
                        SqlCommand command;
		                command = new SqlCommand("use master", connect);
  		                command.ExecuteNonQuery();
                        command = new SqlCommand(@"restore database BD1 from disk = 'c:\ Respaldo\resp.bak'", connect);
                        command.ExecuteNonQuery();
                        //--------------------------------------------------------------------------
                        connect.Close();

                        MessageBox.Show("Se ha restaurado la base de datos", "Restauración", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                    MessageBox.Show(@"No haz hecho ningun respaldo anteriormente (o no está en la ruta correcta)", "Restauracion", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
            }

        }

Obviamente esta es la forma basica, pueden agregar mas try y catch para prevenir fallas o cambiar la ruta donde se almacena y restaura la base de datos de forma dinamica con un OpenFileDialog u otras formas. Espero les sea útil.

También te podría gustar...

30 Respuestas

  1. ANTONIO dice:

    eXCELENTE EJEMPLO. MIRA, PERO COMO HACER PARA SELECCIONAR UNA CARPETA O DISCO DONDE GUARDAR EL RESPALDO O DE DONDE RECUPERARLO.
    GRACIAS
    ANTONIO

  2. cuales son la variables, de esta clase, soy inexperto en c# y pues esto es lo q estaba buscando, pero no me funciona, me tira siempre error nose q estoy haciendo mal

  3. Sak dice:

    como se crea el Directory.Exists porque intento implementar el codigo y me marca errores en esa parte

  4. Hello! This post could not be written any better! Reading through this post reminds me of my good
    old room mate! He always kept chatting about this.

    I will forward this post to him. Fairly certain he will have a good read.
    Thanks for sharing!

  5. Thonny dice:

    Que tal estoy haciendo un back up pero el problema esta en que me genera un error.
    Cannot perform a backup or restore operation within a transaction.
    BACKUP DATABASE is terminating abnormally.

    alguna idea de como lo puedo arreglar.

  6. Anónimo dice:

    no sabes como hacer eso mismo pero cada cierto tiempo y de forma automatica?

  7. Anónimo dice:

    me sale error en la parte de Directory.Exists File.Exists SqlConnection SqlCommand
    Error 2 El nombre ‘Directory’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 26 16 proyecto
    Error 5 El nombre ‘Directory’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 39 19 proyecto
    Error 3 El nombre ‘File’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 28 23 proyecto
    Error 4 El nombre ‘File’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 32 27 proyecto
    Error 8 No se puede encontrar el tipo o el nombre de espacio de nombres ‘SqlCommand’ (¿falta una directiva using o una referencia de ensamblado?) E:\Proyecto\proyecto\proyecto\Form1.cs 51 19 proyecto
    Error 9 No se puede encontrar el tipo o el nombre de espacio de nombres ‘SqlCommand’ (¿falta una directiva using o una referencia de ensamblado?) E:\Proyecto\proyecto\proyecto\Form1.cs 52 33 proyecto
    Error 6 No se puede encontrar el tipo o el nombre de espacio de nombres ‘SqlConnection’ (¿falta una directiva using o una referencia de ensamblado?) E:\Proyecto\proyecto\proyecto\Form1.cs 44 19 proyecto
    Error 7 No se puede encontrar el tipo o el nombre de espacio de nombres ‘SqlConnection’ (¿falta una directiva using o una referencia de ensamblado?) E:\Proyecto\proyecto\proyecto\Form1.cs 46 33 proyecto
    Error 1 Se esperaba una definición de tipo o espacio de nombres, o el fin del archivo E:\Proyecto\proyecto\proyecto\Form1.cs 63 1 proyecto

    como corrijo esto estos errores te lo agradeceria

    • Moises dice:

      tengo estos errores no se como correguirlos

      Error 1 El nombre ‘Directory’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 28 16 proyecto
      Error 4 El nombre ‘Directory’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 41 19 proyecto
      Error 2 El nombre ‘File’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 30 23 proyecto
      Error 3 El nombre ‘File’ no existe en el contexto actual E:\Proyecto\proyecto\proyecto\Form1.cs 34 27 proyecto

      como deberia definir Directory y File telo agradeceria

  8. vite dice:

    agrega la libreria
    using System.Data.SqlClient;
    using System.IO;

  9. charlie dice:

    excelente

  10. Nigel dice:

    hola, una pregunta ¿como haria para el caso de oracle? el mismo procedmiento? estoy trabajando c# con oracle 10g

  11. Max dice:

    El respaldo me lo crea, pero a la hora de intentar restaurar, mi base de datos queda igual, en el respaldo donde dice «use master» que debo poner ahi? El nombre de mi usuario? porque lo intente, se supone que si la restauro, hasta me da el aviso y todo pero no pasa nada. Gracias de antemano

  12. Cristian dice:

    Sin duda un excelente post, esto me ha servido una barbaridad, mil gracias por publicarlo.

    Saludes..!!

  13. jonathan dice:

    grasias me sirvio mucho solo tengop un proble co el cursor.waitcursor
    sale error no se q liberia abrir aber si me ayudas con eso g
    grasias

  14. jonathan dice:

    por que no me deja resaturar, me eniva un mensaje donde dice que la base de datos esta siendo usado actualmente y no restaura
    gracias espero su pronta respuesta.

  15. Hugo dice:

    Hola

    Estoy tratando de hacer lo del ejemplo, y me surge la siguiente duda,¿el usuario con el cual se conecta a la base de datos debe tener algún permiso en especial, o solo con ser owner es suficiente?

  16. Wilmer dice:

    Solos necesita agregar a la librería «Directory»….

  17. Anónimo dice:

    por favor necesito el codigo para respaldar una base de datos oracle desde c#

  18. abc dice:

    por favor necesito e codigo para respaldar una base de datos de oracle desde c#

  19. Guillermo Lapettina dice:

    Habrá alguna forma de restaurar la misma base de datos??? Me dice que no puede restaurarla porque está en uso en ésta sesión.

Escribeme un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *