1 using System; 2 using System.Data.SqlClient; 3 using System.Data; 4 using System.IO; 5 6 namespace NET.Common 7 { 8 /// <summary> 9 /// 數據庫操作幫助類 10 /// </summary> 11 public class DatabaseHelper 12 { 13 private const string SQL_DATABASE_BACK = " BACKUP DATABASE {0} TO DISK = '{1}' " ; // 數據庫備份語句 14 private const string SQL_DATABASE_RESTORE = " RESTORE DATABASE {0} FROM DISK = '{1}' WITH REPLACE " ; // 數據庫還原語句 15 private const string SQL_SELECT_ALL_CONN = " SELECT spid FROM master..sysprocesses WHERE dbid=db_id('{0}') " ; // 獲取指定數據庫所有鏈接語句 16 17 /// <summary> 18 /// 實例數據庫操作 19 /// </summary> 20 /// <param name="masterConnectionString"> master數據庫鏈接字符串 </param> 21 public DatabaseHelper( string masterConnectionString) 22 { 23 this .MasterConnectionString = masterConnectionString; 24 } 25 26 /// <summary> 27 /// master數據庫鏈接字符串 28 /// </summary> 29 private string MasterConnectionString { get ; set ; } 30 31 /// <summary> 32 /// SQLServer數據庫備份 33 /// </summary> 34 /// <param name="connectionString"> 數據庫連接字符串 </param> 35 /// <param name="backName"> 備份文件名稱,不包含后綴名 </param> 36 /// <param name="path"> 備份文件存放的物理路徑 </param> 37 public bool Back( string dbName, string backName, string path) 38 { 39 // 判斷存放備份文件的目錄是否存在 40 if (! Directory.Exists(path)) 41 { 42 // 不存在,新建目錄 43 Directory.CreateDirectory(path); 44 } 45 46 try 47 { 48 using (SqlConnection conn = new SqlConnection(MasterConnectionString)) 49 { 50 // 設置存放備份文件的完整物理路徑 51 string backPath = path + " \\ " + backName + " .bak " ; 52 53 // 設置數據庫備份的T-SQL語句 54 string t_sql_back = string .Format(SQL_DATABASE_BACK, dbName, backPath); 55 56 using (SqlCommand cmd = new SqlCommand(t_sql_back, conn)) 57 { 58 cmd.CommandType = CommandType.Text; 59 conn.Open(); 60 61 // 開始備份 62 cmd.ExecuteNonQuery(); 63 64 return true ; 65 } 66 } 67 } 68 catch 69 { 70 return false ; 71 } 72 } 73 74 /// <summary> 75 /// SQLServer數據庫還原 76 /// </summary> 77 /// <param name="dbName"> 要進行還原的數據庫名稱 </param> 78 /// <param name="fullPath"> 備份文件的完整物理路徑 </param> 79 public bool Restore( string dbName, string fullPath) 80 { 81 // 判斷還原使用的文件是否存在 82 if (! File.Exists(fullPath)) 83 { 84 return false ; 85 } 86 87 try 88 { 89 using (SqlConnection conn = new SqlConnection(MasterConnectionString)) 90 { 91 // 設置數據庫還原的T-SQL語句 92 string t_sql_restore = string .Format(SQL_DATABASE_RESTORE, dbName, fullPath); 93 94 // 設置查詢指定數據庫的所有連接 95 string t_sql_select_all_conn = string .Format(SQL_SELECT_ALL_CONN, dbName); 96 97 string t_sql_kill; 98 99 conn.Open(); 100 101 // 獲取指定數據庫所有連接 102 SqlCommand cmd = new SqlCommand(t_sql_select_all_conn, conn); 103 SqlDataAdapter reSDA = new SqlDataAdapter(cmd); 104 DataTable dtConn = new DataTable(); 105 reSDA.Fill(dtConn); 106 107 // 逐一刪除連接 108 for ( int i = 0 ; i < dtConn.Rows.Count; i++ ) 109 { 110 t_sql_kill = " kill " + dtConn.Rows[i][ 0 ].ToString(); 111 cmd = new SqlCommand(t_sql_kill, conn); 112 cmd.ExecuteNonQuery(); 113 } 114 115 // 執行還原操作 116 cmd = new SqlCommand(t_sql_restore, conn); 117 cmd.ExecuteNonQuery(); 118 119 // 清空當前連接池,這個很主要,如果不清空還原后第一次訪問會出現“在向服務器發送請求時發生傳輸級錯誤。 (provider: 共享內存提供程序, error: 0 - 管道的另一端上無任何進程。)”錯誤 120 SqlConnection.ClearPool(conn); 121 return true ; 122 } 123 124 } 125 catch 126 { 127 return false ; 128 } 129 } 130 } 131 }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
