2012-03-23 16 views

Odpowiedz

8

Poniższy Link wyjaśnił wszystkie szczegóły dotyczące wykonywania kopii bazy danych SQL Server 2008 przy użyciu C#

kopii zapasowej bazy danych SQL można zrobić za pomocą wielu sposób. Możesz użyć poleceń Sql, jak w drugiej odpowiedzi, lub utworzyć własną klasę do tworzenia kopii zapasowych danych.

Ale to inny tryb tworzenia kopii zapasowej.

  1. kopii pełnej bazy
  2. Database Backup różnicowy
  3. dziennika transakcji kopii zapasowych
  4. backup z kompresją

Jednak wadą tej metody jest to, że musi swoje studio zarządzania SQL być zainstalowany w systemie klienta.

+2

SMO oznacza obiektów zarządzania SQL zainstalowanych lokalnie na komputerze, na którym będzie wykonywał kopii zapasowej programu .NET , czyste rozwiązanie SQL nie. –

19

można połączyć się z bazą danych przy użyciu SqlConnection i SqlCommand i wykonać następujący tekst polecenia na przykład:

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

Zobacz here przykłady.

12

Jest to dobra praktyka, aby użyć pliku konfiguracyjnego tak:

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

Twój kod C# będzie coś takiego:

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

Może się mylę, ale czy to nie oznacza, że ​​program C# musi działać na tym samym serwerze co baza danych? –

+1

@Eric Wu - Ciąg połączenia w pliku konfiguracyjnym może wskazywać dowolny serwer SQL, nie musi znajdować się na tym samym komputerze. – michaelmsm89

+0

Prawda. Myślałem, że to manipuluje plikiem w jakiś sposób na poziomie aplikacji. Wygląda na to, że _backupfolder_ odnosi się do ścieżki na serwerze bazy danych. –

11

działa na mnie:

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

dziękuję za ten kod. zaoszczędzony dużo czasu. –

+0

Idealny .. Dziękujemy za udostępnienie .. –

0

Możesz użyć następujących zapytań do tworzenia kopii zapasowych i przywracania, musisz zmienić ścieżkę kopii zapasowej

Nazwa bazy danych = [dane]

zapasowa:

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

Czym różni się ta odpowiedź od [tej odpowiedzi] (http://stackoverflow.com/a/9835597/660921), która płonie od czterech lat? – 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"); 
      } 
Powiązane problemy