备份数据库
1/// <summary>
2 /// 备份配置文件config.xml中数据库
3 /// </summary>
4 /// <param name="backupFolder">备份文件路径</param>
5 /// <returns></returns>
6 public static bool DataBackupConfigDB(string backupFolder)
7 {
8 //获取配置文件中sql数据库名
9 string dbName = "SqlDB";
10 string name = dbName + DateTime.Now.ToString("yyyyMMddHHmmss");
11 string procname;
12 string sql;
13 //创建连接对象
14 SqlConnection conn = new SqlConnection(GetConnStr());
15 conn.Open(); //打开数据库连接
16 //删除逻辑备份设备,但不会删掉备份的数据库文件
17 procname = "sp_dropdevice";
18 SqlCommand sqlcmd1 = new SqlCommand(procname, conn);
19 sqlcmd1.CommandType = CommandType.StoredProcedure;
20 SqlParameter sqlpar = new SqlParameter();
21 sqlpar = sqlcmd1.Parameters.Add("@logicalname", SqlDbType.VarChar, 20);
22 sqlpar.Direction = ParameterDirection.Input;
23 sqlpar.Value = dbName;
24 try //如果逻辑设备不存在,略去错误
25 {
26 sqlcmd1.ExecuteNonQuery();
27 }
28 catch
29 {
30 MessageBox.Show("错误的备份文件目录");
31 }
32 //创建逻辑备份设备
33 procname = "sp_addumpdevice";
34 SqlCommand sqlcmd2 = new SqlCommand(procname, conn);
35 sqlcmd2.CommandType = CommandType.StoredProcedure;
36 sqlpar = sqlcmd2.Parameters.Add("@devtype", SqlDbType.VarChar, 20);
37 sqlpar.Direction = ParameterDirection.Input;
38 sqlpar.Value = "disk";
39 sqlpar = sqlcmd2.Parameters.Add("@logicalname", SqlDbType.VarChar, 20);//逻辑设备名
40 sqlpar.Direction = ParameterDirection.Input;
41 sqlpar.Value = dbName;
42 sqlpar = sqlcmd2.Parameters.Add("@physicalname", SqlDbType.NVarChar, 260);//物理设备名
43 sqlpar.Direction = ParameterDirection.Input;
44 sqlpar.Value = backupFolder + name + ".bak";
45 try
46 {
47 int i = sqlcmd2.ExecuteNonQuery();
48 }
49 catch (Exception err)
50 {
51 string str = err.Message;
52 }
53 //备份数据库到指定的数据库文件(完全备份)
54 sql = "BACKUP DATABASE " + dbName + " TO " + dbName + " WITH INIT";
55 SqlCommand sqlcmd3 = new SqlCommand(sql, conn);
56 sqlcmd3.CommandType = CommandType.Text;
57 try
58 {
59 sqlcmd3.ExecuteNonQuery();
60 }
61 catch (Exception err)
62 {
63 string str = err.Message;
64 conn.Close();
65 return false;
66 }
67 conn.Close();//关闭数据库连接
68 return true;
69 }
还原数据库时如果使用RESTORE DATABASE dbName(数据库名) from DISK = 'e:\' to replace
sql错误提示:RESTORE 无法处理数据库dbName 因为它正由此会话使用 建议在执行此操作时使用 master 数据库
在网上终于找到了解决方法,具体代码如下:
1 /// <summary>
2 /// 还原数据库文件
3 /// </summary>
4 /// <param name="dbFile">数据库备份文件(含路径)</param>
5 /// <returns></returns>
6 public static bool DataRestoreConfigDB(string dbFile)
7 {
8 //sql数据库名
9 string dbName = "SqlDB";
10 //创建连接对象
11 SqlConnection conn = new SqlConnection(GetConnStr());
12 //还原指定的数据库文件
13 string sql =string.Format("use master ;declare @s varchar(8000);select @s=isnull(@s,'')+' kill '+rtrim(spID) from master..sysprocesses where dbid=db_id('{0}');select @s;exec(@s) ;RESTORE DATABASE {1} FROM DISK = N'{2}' with replace",dbName,dbName,dbFile);
14 SqlCommand sqlcmd = new SqlCommand(sql, conn);
15 sqlcmd.CommandType = CommandType.Text;
16 conn.Open();
17 try
18 {
19 sqlcmd.ExecuteNonQuery();
20 }
21 catch (Exception err)
22 {
23 string str = err.Message;
24 conn.Close();
25 return false;
26 }
27 conn.Close();//关闭数据库连接
28 return true;
29 }