• C#代码备份还原MSSQL数据库


    备份数据库

    1///<summary>
    2/// 备份配置文件config.xml中数据库
    3///</summary>
    4///<param name="backupFolder">备份文件路径</param>
    5///<returns></returns>
    6publicstaticbool DataBackupConfigDB(string backupFolder)
    7 {
    8//获取配置文件中sql数据库名
    9string dbName ="SqlDB";
    10string name = dbName + DateTime.Now.ToString("yyyyMMddHHmmss");
    11string procname;
    12string 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;
    24try//如果逻辑设备不存在,略去错误
    25 {
    26 sqlcmd1.ExecuteNonQuery();
    27 }
    28catch
    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";
    45try
    46 {
    47int i = sqlcmd2.ExecuteNonQuery();
    48 }
    49catch (Exception err)
    50 {
    51string 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;
    57try
    58 {
    59 sqlcmd3.ExecuteNonQuery();
    60 }
    61catch (Exception err)
    62 {
    63string str = err.Message;
    64 conn.Close();
    65returnfalse;
    66 }
    67 conn.Close();//关闭数据库连接
    68returntrue;
    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  publicstaticbool 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 returnfalse;
    26 }
    27 conn.Close();//关闭数据库连接
    28 returntrue;
    29 }
  • 相关阅读:
    C#调用C++代码遇到的问题总结
    ASP.NET MVC Controller的激活
    利用fis3自动化处理asp.net项目静态资源时遇到的一个编码问题
    工作中遇到的一个多线程下导致RCW无法释放的问题
    在mongoose中使用$match对id失效的解决方法
    passport源码研究
    android手机旋转屏幕时让GridView的列数与列宽度自适应
    git 版本回退
    梦之解读:如何成为牛人
    DataTable与DTO对象的简易转换类
  • 原文地址:https://www.cnblogs.com/12go/p/2317944.html
Copyright © 2020-2023  润新知