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 }