C#, Copiar Base de Datos de SQL


inxunza

Hacer una Copia de una Base de Datos de SQL Mediante Código C#

En esta ocasión compartiré con ustedes una de las mil posibilidades para hacer una copia de una Base de Datos de SQL desde código, utilizando la libreria SMO (SQL Server Management Objects), lo cual nos permite hacerlo de una manera mucho mas rápida y con menos lineas de código.

Después de haber creado nuestro proyecto en el que agregaremos la funcionalidad, lo siguiente que tenemos que hacer, es referenciar las librerías necesarias. Para esto nos dirigimos a: C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies y elegimos las siguientes librerias

1.- Microsoft.SqlServer.ConnectionInfo.dll
2.- Microsoft.SqlServer.ConnectionInfo.dll
3.- Microsoft.SqlServer.ConnectionInfo.dll

Posteriormente agregaremos la referencia en el código

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

Ahora creamos la conexión con el servidor

// inicializacion del servidor
// . es para servidor local
Server servidor = new Server(@".\SQLEXPRESS");

Llenamos un ComboBox con la lista de BDs disponibles en ‘servidor’

// Recorremos todas las BDs en el Servidor
    foreach (Database db in servidor.Databases)
    {
       if (!db.IsSystemObject) // Las BD del Sistema NO las contemplamos
       {
          comboBox1.Items.Add(db.Name);
        }
     }

Finalmente, tenemos el método para copiar la BD

private void Copiar()
{
    try
    {
        // Obtener la BD que se va a Copiar
        Database db = servidor.Databases[comboBox1.Text];

        // Configurar las Opciones de la transaccion
        Transfer t = new Transfer(db);
        t.CopyAllObjects = true;                 // Todas las tablas
        t.DropDestinationObjectsFirst = true;    // Si existe la BD, limpiarla
        t.CopySchema = true;                     // Copiar estructura
        if (checkBox1.Checked) t.CopyData = true;// Copiar datos
        t.DestinationServer = @".\SQLEXPRESS";   // Servidor donde se creara la Copia
        t.DestinationDatabase = textBox1.Text;   // Nombre de la Copia
        t.Options.IncludeIfNotExists = true;     // Crear la BD si no existe
        t.Options.DriAllKeys = true;             // Copiar las Llaves
        t.Options.DriForeignKeys = true;         // Llaves foraneas
        t.Options.DriPrimaryKey = true;          // Llaves primarias
        t.Options.DriUniqueKeys = true;          // Llaves unicas

        // Realizar la transaccion
        t.TransferData();

        // Eliminarmos conexion al servidor
        // ** liberamos memoria **
        servidor = null;

        MessageBox.Show("La BD " + textBox1.Text + " se ha creado", "Listo!!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

Espero les sea de utilidad el post, y como siempre, se agradecerán todos los comentarios.

Descargar Codigo Fuente (VS2008)


Nota: Este sitio ya no tendra Actualizaciones de Post, para nuevos tutoriales dirigirse a http://elsotano.net/blog

9 thoughts on “C#, Copiar Base de Datos de SQL

  1. Hola que tal, oye me puedes decir como sería la conexion si tuviera una base de datos con usuario y contraseña, ya que le puse con “;” pero de ninguna manera he podido entrar al servidor, te agradeceria si me respondieras saludos.

  2. el punto y coma lo uso para separar atributos de credenciales, en ves de este codigo:

    Server servidor = new Server(@”.\SQLEXPRESS”);

    intente poner este otro:

    Server servidor = new Server(@”dominio\\SQLEXPRESS; User Id=USUARIO; Pasword = contraseña;”);

    pero no me conecta, no se que estare haciendo mal, ya que mi base de datos la manipulo desde otra base mi lap.

    • Hola Julio.

      Primero he de comentarte que el @ de ..Server(@“.\sqlexpress”);
      es para que la diagonal, la convierta en doble diagonal, y tu estas usando las dos opciones (@ y doble diagonal).

      Ahora, el error no esta en ese punto, para usar usuario y password seria:
      Server servidor = new Server(new ServerConnection(“dominio\\SQLEXPRESS”, “Usuario”, “Password”));

      Por ultimo, si es un servidor SQLEXPRESS “se supone que no admite conexiones externas”…

      Espero te sirva, y por favor hazmelo saber de cualquier forma, y si lo resolviste de alguna otra manera.

      Gracias por visitar el Blog

  3. Te agradezco mucho el dato me ha servido de mucho, tambien para comentarte que en efecto lo express en visual c# esta limitado a BD locales pero usando codigo no parece existir esa limitacion ya que yo uso estas versiones y realmente me sacan de mis apuros para manipular informacion de forma remota.

    El codigo que me has proporcionado funciona de lujo, me has sacado de un apuro, te agradezco y estamos en contacto para lo que se te ofrezca, saludos.

    • Hola Alex.

      Integration Services Component (SSIS) es un “servicio” del SQL Server, el cual NO se incluye en versiones Express del SQL, solo en versiones SQL Server 2005 Standard, Developer o Enterprise. Si tu version no es Express, lo unico que necesitas hacer es configurar este servicio.
      Para la configuracion te recomiendo: http://msdn.microsoft.com/es-es/library/ms143197(SQL.90).aspx
      o buscar en Google “Como activar SSIS”.

      Espero te sirva, y por favor hazmelo saber de cualquier forma, y si lo resolviste de alguna otra manera.

      Gracias por visitar el Blog

  4. Hola vi el post me parece interesante, pero quiero hacer un backup de una base de datos en sqlserver express 2005 ¿como lo haria?, gracias por anticipado y espero tu respuesta me urge hacer una copia urgente…
    Gracias

    • Hola Miguel.

      El ejemplo que muestro arriba es utilizando Integration Services Component (SSIS) es un “servicio” del SQL Server, el cual NO se incluye en versiones Express del SQL, solo en versiones SQL Server 2005 Standard, Developer o Enterprise.

      Como tu versión es Express Micro$oft dice que ese servicio no esta disponible, pero la verdad no me atrevo afirmar que asi sea, lo único que YO se es que no es posible configurarlo a simple vista, como en versiones de Pago de SQL.

      Si no puedes acceder a una version Estandar de SQL, te recomiendo buscar en Google “Como Activar SSIS en SQL Express”.

      Si lo anterior no te funciona, puedes hacer tu BackUp desde una consulta SQL, de tal manera que no utilices SSIS.

  5. Pingback: C#, Copiar Base de Datos de SQL | El Sotano .Net

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s