2012-03-23 19 views

risposta

8

Il seguente Link ha spiegato i dettagli completi su come eseguire il database SQL Server 2008 utilizzando C#

di backup di database SQL può essere fatto utilizzando molti modi. È possibile utilizzare i comandi Sql come nell'altra risposta oppure creare la propria classe per eseguire il backup dei dati.

Ma queste sono diverse modalità di backup.

  1. backup completo del database
  2. backup differenziale del database
  3. Backup log delle transazioni
  4. Backup con compressione

Ma lo svantaggio di questo metodo è che si ha bisogno del tuo studio di gestione di SQL per essere installato sul tuo sistema client.

+2

SMO implica oggetti di gestione di SQL installati localmente sulla macchina in cui l'esecuzione del programma di backup .NET , la soluzione SQL pura no. –

19

è possibile connettersi al database utilizzando SqlConnection e SqlCommand ed eseguire il seguente testo del comando, ad esempio:

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

Vedi here per gli esempi.

12

E 'una buona pratica di utilizzare un file di configurazione come questa:

<?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> 

tuo codice C# sarà qualcosa di simile:

// 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

Qui potrei sbagliarmi, ma questo non implica che il programma C# debba essere eseguito sullo stesso server del database? –

+1

@Eric Wu - La stringa di connessione nel file di configurazione può fare riferimento a qualsiasi server SQL, non deve essere sulla stessa macchina. – michaelmsm89

+0

Vero. Ho pensato che stesse manipolando il file in qualche modo a livello di applicazione. Sembra che _backupfolder_ si riferisca ad un percorso nel server di database. –

11

funziona per me:

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

grazie per questo codice. risparmiato un sacco di tempo. –

+0

Perfetto .. Grazie per aver condiviso .. –

0

È possibile utilizzare le seguenti query per il backup e il ripristino, è necessario modificare il percorso per il backup

nome del database = [i dati]

Backup:

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 

Restore:

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

In che modo questa risposta è diversa da [questa risposta] (http://stackoverflow.com/a/9835597/660921) che è stata sul fuoco da quattro anni? – 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"); 
      } 
Problemi correlati