2012-03-23 26 views

Respuesta

8

La siguiente Link ha explicado más detalles acerca de cómo realizar una copia de base de datos SQL Server 2008 utilizando C#

SQL copia de seguridad de base de datos se puede hacer uso de muchas maneras. Puede usar Comandos Sql como en la otra respuesta o crear su propia clase para hacer una copia de seguridad de los datos.

Pero estos son diferente modo de copia de seguridad.

  1. base de datos completa de copia de seguridad
  2. Base de Datos de copia de seguridad diferencial
  3. registro de transacciones de copia de seguridad
  4. de copia de seguridad con compresión

embargo, la desventaja de este método es que necesita su estudio de administración de SQL para ser instalado en tu sistema de cliente

+2

SMO implica instalados localmente en la máquina de objetos de administración de SQL donde se ejecuta el programa de copia de seguridad .NET , la solución SQL pura no. –

19

se puede conectar a la base de datos utilizando SqlConnection y SqlCommand y ejecute el siguiente texto de comando, por ejemplo:

BACKUP DATABASE [MyDatabase] TO DISK = 'C:\....\MyDatabase.bak' 

Ver here de ejemplos.

12

Es una buena práctica utilizar un archivo de configuración de esta manera:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <connectionStrings> 
    <add name="MyConnString" connectionString="Data Source=(local);Initial Catalog=MyDB; Integrated Security=SSPI" ;Timeout=30"/> 
    </connectionStrings> 
    <appSettings> 
    <add key="BackupFolder" value="C:/temp/"/> 
    </appSettings> 
</configuration> 

su código C# será algo como esto:

// read connectionstring from config file 
var connectionString = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 

// read backup folder from config file ("C:/temp/") 
var backupFolder = ConfigurationManager.AppSettings["BackupFolder"]; 

var sqlConStrBuilder = new SqlConnectionStringBuilder(connectionString); 

// set backupfilename (you will get something like: "C:/temp/MyDatabase-2013-12-07.bak") 
var backupFileName = String.Format("{0}{1}-{2}.bak", 
    backupFolder, sqlConStrBuilder.InitialCatalog, 
    DateTime.Now.ToString("yyyy-MM-dd")); 

using (var connection = new SqlConnection(sqlConStrBuilder.ConnectionString)) 
{ 
    var query = String.Format("BACKUP DATABASE {0} TO DISK='{1}'", 
     sqlConStrBuilder.InitialCatalog, backupFileName); 

    using (var command = new SqlCommand(query, connection)) 
    { 
     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 
+0

Podría estar equivocado aquí, pero ¿eso no implica que el programa C# debe ejecutarse en el mismo servidor que la base de datos? –

+1

@Eric Wu - La cadena de conexión en el archivo de configuración puede apuntar a cualquier servidor SQL, no tiene que estar en la misma máquina. – michaelmsm89

+0

Es cierto. Pensé que estaba manipulando el archivo de alguna manera a nivel de aplicación. Parece que _backupfolder_ se refiere a una ruta en el servidor de la base de datos. –

11

funciona para mí:

public class BackupService 
{ 
    private readonly string _connectionString; 
    private readonly string _backupFolderFullPath; 
    private readonly string[] _systemDatabaseNames = { "master", "tempdb", "model", "msdb" }; 

    public BackupService(string connectionString, string backupFolderFullPath) 
    { 
     _connectionString = connectionString; 
     _backupFolderFullPath = backupFolderFullPath; 
    } 

    public void BackupAllUserDatabases() 
    { 
     foreach (string databaseName in GetAllUserDatabases()) 
     { 
      BackupDatabase(databaseName); 
     } 
    } 

    public void BackupDatabase(string databaseName) 
    { 
     string filePath = BuildBackupPathWithFilename(databaseName); 

     using (var connection = new SqlConnection(_connectionString)) 
     { 
      var query = String.Format("BACKUP DATABASE [{0}] TO DISK='{1}'", databaseName, filePath); 

      using (var command = new SqlCommand(query, connection)) 
      { 
       connection.Open(); 
       command.ExecuteNonQuery(); 
      } 
     } 
    } 

    private IEnumerable<string> GetAllUserDatabases() 
    { 
     var databases = new List<String>(); 

     DataTable databasesTable; 

     using (var connection = new SqlConnection(_connectionString)) 
     { 
      connection.Open(); 

      databasesTable = connection.GetSchema("Databases"); 

      connection.Close(); 
     } 

     foreach (DataRow row in databasesTable.Rows) 
     { 
      string databaseName = row["database_name"].ToString(); 

      if (_systemDatabaseNames.Contains(databaseName)) 
       continue; 

      databases.Add(databaseName); 
     } 

     return databases; 
    } 

    private string BuildBackupPathWithFilename(string databaseName) 
    { 
     string filename = string.Format("{0}-{1}.bak", databaseName, DateTime.Now.ToString("yyyy-MM-dd")); 

     return Path.Combine(_backupFolderFullPath, filename); 
    } 
} 
+1

gracias por este código. ahorró mucho tiempo. –

+0

Perfecto .. Gracias por compartir .. –

0

Puede usar las siguientes consultas para Hacer copia de seguridad y restaurar, debe cambiar la ruta de su copia de seguridad

Nombre de la base = [datos]

de copia de seguridad:

BACKUP DATABASE [data] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\data.bak' WITH NOFORMAT, NOINIT, NAME = N'data-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 
GO 

Restaurar:

RESTORE DATABASE [data] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\data.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10 
GO 
+1

¿En qué se diferencia esta respuesta de [esta respuesta] (http://stackoverflow.com/a/9835597/660921) que ha estado en el fuego durante cuatro años? – Carpetsmoker

2
  SqlConnection con = new SqlConnection(); 
      SqlCommand sqlcmd = new SqlCommand(); 
      SqlDataAdapter da = new SqlDataAdapter(); 
      DataTable dt = new DataTable(); 

      con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConString"].ConnectionString; 
      string backupDIR = "~/BackupDB"; 
      string path = Server.MapPath(backupDIR); 

      try 
      { 
       var databaseName = "MyFirstDatabase"; 
       con.Open(); 
       string saveFileName = "HiteshBackup"; 
       sqlcmd = new SqlCommand("backup database" +databaseName.BKSDatabaseName + "to disk='" + path + "\\" + saveFileName + ".Bak'", con); 
       sqlcmd.ExecuteNonQuery(); 
       con.Close();     


       ViewBag.Success = "Backup database successfully"; 
       return View("Create"); 
      } 
      catch (Exception ex) 
      { 
       ViewBag.Error = "Error Occured During DB backup process !<br>" + ex.ToString(); 
       return View("Create"); 
      } 
Cuestiones relacionadas