备份数据库
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 }
|
请发表评论