2012-03-23 59 views

Trả lời

8

sau đây Link đã giải thích chi tiết đầy đủ về cách sao lưu cơ sở dữ liệu sql server 2008 sử dụng C#

Sql Cơ sở dữ liệu sao lưu có thể được thực hiện bằng nhiều cách. Bạn có thể sử dụng lệnh Sql như trong câu trả lời khác hoặc đã tạo lớp của riêng bạn để sao lưu dữ liệu.

Nhưng đây là các chế độ sao lưu khác nhau.

  1. Full Database Backup
  2. Cơ sở dữ liệu Differential Backup
  3. Transaction Log Sao lưu
  4. Sao lưu với Compression

Nhưng nhược điểm với phương pháp này là nó cần studio quản lý sql của bạn phải được cài đặt trên hệ thống khách hàng của bạn.

+2

SMO ngụ ý đối tượng quản lý SQL cài đặt cục bộ trên máy tính này nơi .NET sao lưu thực thi chương trình , giải pháp SQL thuần túy thì không. –

19

bạn có thể kết nối với cơ sở dữ liệu sử dụng SqlConnection và SqlCommand và thực hiện các văn bản lệnh sau ví dụ:

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

Xem here cho ví dụ.

12

Đó là một thực hành tốt để sử dụng một tập tin cấu hình như thế này:

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

Mã của bạn C# sẽ là một cái gì đó như thế này:

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

Tôi có thể sai ở đây, nhưng không có nghĩa là chương trình C# phải chạy trên cùng một máy chủ với cơ sở dữ liệu? –

+1

@Eric Wu - Chuỗi kết nối trong tệp cấu hình có thể trỏ tới bất kỳ máy chủ SQL nào, nó không phải nằm trên cùng một máy. – michaelmsm89

+0

Đúng. Tôi nghĩ rằng nó đã được thao tác các tập tin trong một số cách ở cấp ứng dụng. Có vẻ như _backupfolder_ đề cập đến một đường dẫn trong máy chủ cơ sở dữ liệu. –

11

trình cho tôi:

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

cảm ơn bạn đã nhập mã này. tiết kiệm rất nhiều thời gian. –

+0

Hoàn hảo .. Cảm ơn bạn đã chia sẻ .. –

0

Bạn có thể sử dụng các truy vấn sau đây để Sao lưu và Khôi phục, bạn phải thay đổi đường dẫn cho bản sao lưu của bạn

Database name = [dữ liệu]

sao lưu:

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

Câu trả lời này khác với [câu trả lời này] (http://stackoverflow.com/a/9835597/660921) đã bị cháy trong bốn năm như thế nào? – 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"); 
      } 
Các vấn đề liên quan