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 /// 數(shù)據(jù)庫(kù)操作幫助類(lèi) 10 /// </summary> 11 public class DatabaseHelper 12 { 13 private const string SQL_DATABASE_BACK = " BACKUP DATABASE {0} TO DISK = '{1}' " ; // 數(shù)據(jù)庫(kù)備份語(yǔ)句 14 private const string SQL_DATABASE_RESTORE = " RESTORE DATABASE {0} FROM DISK = '{1}' WITH REPLACE " ; // 數(shù)據(jù)庫(kù)還原語(yǔ)句 15 private const string SQL_SELECT_ALL_CONN = " SELECT spid FROM master..sysprocesses WHERE dbid=db_id('{0}') " ; // 獲取指定數(shù)據(jù)庫(kù)所有鏈接語(yǔ)句 16 17 /// <summary> 18 /// 實(shí)例數(shù)據(jù)庫(kù)操作 19 /// </summary> 20 /// <param name="masterConnectionString"> master數(shù)據(jù)庫(kù)鏈接字符串 </param> 21 public DatabaseHelper( string masterConnectionString) 22 { 23 this .MasterConnectionString = masterConnectionString; 24 } 25 26 /// <summary> 27 /// master數(shù)據(jù)庫(kù)鏈接字符串 28 /// </summary> 29 private string MasterConnectionString { get ; set ; } 30 31 /// <summary> 32 /// SQLServer數(shù)據(jù)庫(kù)備份 33 /// </summary> 34 /// <param name="connectionString"> 數(shù)據(jù)庫(kù)連接字符串 </param> 35 /// <param name="backName"> 備份文件名稱(chēng),不包含后綴名 </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 // 設(shè)置存放備份文件的完整物理路徑 51 string backPath = path + " \\ " + backName + " .bak " ; 52 53 // 設(shè)置數(shù)據(jù)庫(kù)備份的T-SQL語(yǔ)句 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 // 開(kāi)始備份 62 cmd.ExecuteNonQuery(); 63 64 return true ; 65 } 66 } 67 } 68 catch 69 { 70 return false ; 71 } 72 } 73 74 /// <summary> 75 /// SQLServer數(shù)據(jù)庫(kù)還原 76 /// </summary> 77 /// <param name="dbName"> 要進(jìn)行還原的數(shù)據(jù)庫(kù)名稱(chēng) </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 // 設(shè)置數(shù)據(jù)庫(kù)還原的T-SQL語(yǔ)句 92 string t_sql_restore = string .Format(SQL_DATABASE_RESTORE, dbName, fullPath); 93 94 // 設(shè)置查詢(xún)指定數(shù)據(jù)庫(kù)的所有連接 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 // 獲取指定數(shù)據(jù)庫(kù)所有連接 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 // 執(zhí)行還原操作 116 cmd = new SqlCommand(t_sql_restore, conn); 117 cmd.ExecuteNonQuery(); 118 119 // 清空當(dāng)前連接池,這個(gè)很主要,如果不清空還原后第一次訪(fǎng)問(wèn)會(huì)出現(xiàn)“在向服務(wù)器發(fā)送請(qǐng)求時(shí)發(fā)生傳輸級(jí)錯(cuò)誤。 (provider: 共享內(nèi)存提供程序, error: 0 - 管道的另一端上無(wú)任何進(jìn)程。)”錯(cuò)誤 120 SqlConnection.ClearPool(conn); 121 return true ; 122 } 123 124 } 125 catch 126 { 127 return false ; 128 } 129 } 130 } 131 }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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