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 }