C#实现SQL SERVER数据库备份的两种方法比较

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Data.SqlClient;  
  5. using System.Data;  
  6. using System.Windows.Forms;  
  7. namespace DBAdmin  
  8. {  
  9.     public class DbBackUpAndRestore  
  10.     {  
  11.         /// <summary>  
  12.         /// 服务器  
  13.         /// </summary>  
  14.         private string server = "";  
  15.         public string Server  
  16.         {  
  17.             get { return this.server; }  
  18.             set { this.server = value; }  
  19.         }  
  20.         /// <summary>  
  21.         /// 登录名  
  22.         /// </summary>  
  23.         private string uid = "";  
  24.         public string UID  
  25.         {  
  26.             get { return this.uid; }  
  27.             set { this.uid = value; }  
  28.         }  
  29.         /// <summary>  
  30.         /// 登录密码  
  31.         /// </summary>  
  32.         private string pwd = "";  
  33.         public string PWD  
  34.         {  
  35.             get { return this.pwd; }  
  36.             set { this.pwd = value; }  
  37.         }  
  38.         /// <summary>  
  39.         /// 要操作的数据库  
  40.         /// </summary>  
  41.         private string database = "";  
  42.         public string Database  
  43.         {  
  44.             get { return this.database; }  
  45.             set { this.database = value; }  
  46.         }  
  47.         /// <summary>  
  48.         /// 数据库连接字符串  
  49.         /// </summary>  
  50.         private string conn = "";  
  51.         /// <summary>  
  52.         /// 备份路经  
  53.         /// </summary>  
  54.         private string backPath = "";  
  55.         public string BackPath  
  56.         {  
  57.             get { return this.backPath; }  
  58.             set { this.backPath = value; }  
  59.         }  
  60.         /// <summary>  
  61.         /// 还原文件路经  
  62.         /// </summary>  
  63.         private string restoreFile = "";  
  64.         public string RestoreFile  
  65.         {  
  66.             get { return this.restoreFile; }  
  67.             set { this.restoreFile = value; }  
  68.         }  
  69.         private ProgressBar bar;  
  70.   
  71.         public ProgressBar Bar  
  72.         {  
  73.             get { return bar; }  
  74.             set { bar = value; }  
  75.         }  
  76.         /// <summary>  
  77.         /// DbBackUpAndRestore类的构造函数  
  78.         /// </summary>  
  79.         public DbBackUpAndRestore()  
  80.         {  
  81.         }  
  82.         /// <summary>  
  83.         /// 切割字符串  
  84.         /// </summary>  
  85.         /// <param name="str"></param>  
  86.         /// <param name="bg"></param>  
  87.         /// <param name="ed"></param>  
  88.         /// <returns></returns>  
  89.         public string StringCut(string str, string bg, string ed)  
  90.         {  
  91.             string sub;  
  92.             sub = str.Substring(str.IndexOf(bg) + bg.Length);  
  93.             sub = sub.Substring(0, sub.IndexOf(";"));  
  94.             return sub;  
  95.         }  
  96.         /// <summary>  
  97.         /// 构造文件名  
  98.         /// </summary>  
  99.         /// <returns>文件名</returns>  
  100.         private void CreatePath()  
  101.         {  
  102.             string CurrTime = System.DateTime.Now.ToString();  
  103.             CurrTime = CurrTime.Replace("-""");  
  104.             CurrTime = CurrTime.Replace(":""");  
  105.             CurrTime = CurrTime.Replace(" """);  
  106.             CurrTime = CurrTime.Substring(0, 12);  
  107.             backPath += "//_db_" + CurrTime + ".BAK";  
  108.         }  
  109.         private void Step(string message, int percent)  
  110.         {  
  111.             Bar.Value = percent;  
  112.         }  
  113.         /// <summary>  
  114.         /// 数据库备份  
  115.         /// </summary>  
  116.         /// <returns>备份是否成功</returns>  
  117.         public bool DbBackup()  
  118.         {  
  119.             CreatePath();  
  120.             SQLDMO.Backup oBackup = new SQLDMO.BackupClass();  
  121.             SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();  
  122.             try  
  123.             {  
  124.                 oSQLServer.LoginSecure = false;  
  125.                 oSQLServer.Connect(server, uid, pwd);  
  126.                 oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;  
  127.                 SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);  
  128.                 oBackup.PercentComplete += pceh;  
  129.                 oBackup.Database = database;  
  130.                 oBackup.Files = backPath;  
  131.                 oBackup.BackupSetName = database;  
  132.                 oBackup.BackupSetDescription = "数据库备份";  
  133.                 oBackup.Initialize = true;  
  134.                 oBackup.SQLBackup(oSQLServer);  
  135.                 return true;  
  136.             }  
  137.             catch (Exception ex)  
  138.             {  
  139.                 return false;  
  140.                 throw ex;  
  141.             }  
  142.             finally  
  143.             {  
  144.                 oSQLServer.DisConnect();  
  145.             }  
  146.         }  
  147.         /// <summary>  
  148.         /// 数据库恢复  
  149.         /// </summary>  
  150.         public string DbRestore()  
  151.         {  
  152.             if (exepro() != true)  
  153.             {  
  154.                 return "操作失败";  
  155.             }  
  156.             else  
  157.             {  
  158.                 SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();  
  159.                 SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();  
  160.                 try  
  161.                 {  
  162.                     exepro();  
  163.                     oSQLServer.LoginSecure = false;  
  164.                     oSQLServer.Connect(server, uid, pwd);  
  165.                     oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;  
  166.                     SQLDMO.RestoreSink_PercentCompleteEventHandler pceh = new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);  
  167.                     oRestore.PercentComplete += pceh;  
  168.                     oRestore.Database = database;  
  169.                     ///自行修改  
  170.                     oRestore.Files = restoreFile;  
  171.                     oRestore.FileNumber = 1;  
  172.                     oRestore.ReplaceDatabase = true;  
  173.                     oRestore.SQLRestore(oSQLServer);  
  174.                     return "数据库恢复成功";  
  175.                 }  
  176.                 catch (Exception e)  
  177.                 {  
  178.                     return "恢复数据库失败,原因:" + e.Message;  
  179.                     throw e;  
  180.                 }  
  181.                 finally  
  182.                 {  
  183.                     oSQLServer.DisConnect();  
  184.                 }  
  185.             }  
  186.         }  
  187.         /// <summary>  
  188.         /// 杀死当前库的所有进程  
  189.         /// </summary>  
  190.         /// <returns></returns>  
  191.         private bool exepro()  
  192.         {  
  193.             bool success = true;  
  194.             SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass();  
  195.             try  
  196.             {  
  197.                 svr.Connect(server, uid, pwd);  
  198.                 //取得所有的进程列表  
  199.                 SQLDMO.QueryResults qr = svr.EnumProcesses(-1);  
  200.                 int iColPIDNum = -1;  
  201.                 int iColDbName = -1;  
  202.                 //找到和要恢复数据库相关的进程  
  203.                 for (int i = 1; i <= qr.Columns; i++)  
  204.                 {  
  205.                     string strName = qr.get_ColumnName(i);  
  206.                     if (strName.ToUpper().Trim() == "SPID")  
  207.                     {  
  208.                         iColPIDNum = i;  
  209.                     }  
  210.                     else if (strName.ToUpper().Trim() == "DBNAME")  
  211.                     {  
  212.                         iColDbName = i;  
  213.                     }  
  214.                     if (iColPIDNum != -1 && iColDbName != -1)  
  215.                         break;  
  216.                 }  
  217.                 //将相关进程关闭     
  218.                 for (int i = 1; i <= qr.Rows; i++)  
  219.                 {  
  220.                     int lPID = qr.GetColumnLong(i, iColPIDNum);  
  221.                     string strDBName = qr.GetColumnString(i, iColDbName);  
  222.                     if (strDBName.ToUpper() == database)  
  223.                         svr.KillProcess(lPID);  
  224.                 }  
  225.             }  
  226.             catch (Exception ex)  
  227.             {  
  228.                 success = false;  
  229.             }  
  230.             return success;  
  231.         }  
  232.         public bool Operate(bool isBackup)  
  233.         {  
  234.             //备份:use master;backup database @name to disk=@path;  
  235.             //恢复:use master;restore database @name from disk=@path;   
  236.             SqlConnection connection = new SqlConnection("Data Source=" + server + ";initial catalog=" + database + ";user id=" + uid + ";password=" + pwd + ";");  
  237.             if (!restoreFile.EndsWith(".bak"))  
  238.             {  
  239.                 restoreFile += ".bak";  
  240.             }  
  241.             if (isBackup)//备份数据库   
  242.             {  
  243.                 SqlCommand command = new SqlCommand("use master;backup database @name to disk=@path;", connection);  
  244.                 connection.Open();  
  245.                 command.Parameters.AddWithValue("@name", Database);  
  246.                 command.Parameters.AddWithValue("@path", restoreFile);  
  247.                 command.ExecuteNonQuery();  
  248.                 connection.Close();  
  249.             }  
  250.             else//恢复数据库   
  251.             {  
  252.                 SqlCommand command = new SqlCommand("use master;restore database @name from disk=@path;", connection);  
  253.                 connection.Open();  
  254.                 command.Parameters.AddWithValue("@name", Database);  
  255.                 command.Parameters.AddWithValue("@path", restoreFile);  
  256.                 command.ExecuteNonQuery();  
  257.                 connection.Close();  
  258.             }  
  259.             return true;  
  260.         }  
  261.     }  
  262. }  

第一种方法是利用库SQLDMO来进行数据库的备份和恢复。这种方法在恢复时,原数据不能正在使用当中,可以先把原数据库删除,适用于数据库误删除或者sql server数据库软件重装的情况下进行.当然这种情况下,发布时,必须把库SQLDMO打包。

 

第二种方式是通过调用sql指令来完成数据库的备份和还原。这种方法在恢复时,原数据必须存在,恢复时覆盖掉原数据库的数据。

 

备份的情况当然是数据库必须存在而且已经附加到数据库管理器中。

 

可以根据需要采用这两种方式


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值