2016年6月16日 星期四

【ADO.NET】Make full backup by ADO.NET and T-SQL cmd

工作上需要用到程式自動備份與還原資料庫,一開始查到的大部分是教要用 SMO 工具可是這樣要額外裝東西,感覺蠻麻煩的,直覺可以直接跑 T-SQL 命令做掉,花了一點時間查,以下是做法


備份
  1. private void BackupDB(string dbName, string saveAt)
  2. {
  3. using (SqlConnection conn = new SqlConnection(CONN_STR)) {
  4. conn.Open();
  5. SqlCommand cmd = new SqlCommand(" BACKUP DATABASE @DBName TO DISK = @PATH WITH STATS = 5", conn);
  6.  
  7. cmd.Parameters.AddWithValue("@DBName", dbName);
  8. cmd.Parameters.AddWithValue("@PATH", saveAt);
  9. cmd.CommandTimeout = 86400000;
  10.  
  11. cmd.ExecuteNonQuery();
  12. }
  13. }

還原
  1. public void RestoreDB(string dbName, string loadBakFilePath)
  2. {
  3. using (SqlConnection conn = new SqlConnection(CONN_STR)) {
  4. SqlConnectionStringBuilder connStrBuilder = new SqlConnectionStringBuilder(CONN_STR);
  5. connStrBuilder.InitialCatalog = "master";
  6. conn.ConnectionString = connStrBuilder.ConnectionString;
  7. conn.Open();
  8.  
  9. SqlCommand cmd = new SqlCommand();
  10. cmd.CommandText = "ALTER DATABASE " + dbName + " SET Single_User WITH Rollback Immediate; RESTORE DATABASE " +
  11. dbName + " FROM DISK = @PATH WITH REPLACE; ALTER DATABASE " + dbName + " SET Multi_User;";
  12. cmd.CommandTimeout = 86400000;
  13. cmd.Parameters.AddWithValue("@DBName", dbName);
  14. cmd.Parameters.AddWithValue("@PATH", loadBakFilePath);
  15. cmd.Connection = conn;
  16. cmd.ExecuteNonQuery();
  17. }
  18. }

ref:CaveDweller

沒有留言:

張貼留言