关闭

在ASP.NET页面中实现数据库备份和恢复功能

315人阅读 评论(0) 收藏 举报
using   System;  
  using   SQLDMO;  
  using   System.Drawing;  
  using   System.Collections;  
  using   System.ComponentModel;  
  using   System.Windows.Forms;  
  using   System.Data;  
   
  namespace   bakServe040907  
  {  
   
  ///   <summary>  
  ///   数据库备份类说明  
  ///   </summary>  
  public   class   bakServer  
  {  
  string   ServerName;       //数据服务器名称  
  string   UserName;           //用户名称  
  string   Password;           //用户密码  
  string   message;             //消息提示    
  ProgressBar   PBar;         //状态条控件  
   
  public   bakServer()  
  {  
   
  }  
   
  ///   <summary>  
  ///   取得数据库服务器列表  
  ///   </summary>  
  ///   <returns>数据库服务器列表</returns>  
  public   ArrayList   GetServerList()    
  {    
  ArrayList   alServers   =   new   ArrayList()   ;    
  SQLDMO.Application   sqlApp   =   new   SQLDMO.ApplicationClass()   ;    
  try    
  {    
  SQLDMO.NameList   serverList   =   sqlApp.ListAvailableSQLServers()   ;    
  for(int   i   =   1;i<=   serverList.Count;i++)    
  {    
  alServers.Add(serverList.Item(i))   ;    
  }    
  }    
  catch(Exception   e)    
  {    
  // throw(new   Exception("取数据库服务器列表出错:"+e.Message))   ;    
  message   =   "取数据库服务器列表出错:"   +e.Message;  
   
  }    
  finally    
  {    
  sqlApp.Quit()   ;    
  }    
  return   alServers   ;    
  }    
   
   
  ///   <summary>  
  ///   错误消息处理  
  ///   </summary>  
  ///   <returns>消息信息</returns>  
  public   string   Msg()  
  {  
  return   message;  
  }  
   
  ///   <summary>  
  ///   取得指定数据库列表  
  ///   </summary>  
  ///   <param   name="strServerName">服务器名称</param>  
  ///   <param   name="strUserName">用户名称</param>  
  ///   <param   name="strPwd">用户密码</param>  
  ///   <returns>数据库列表</returns>  
  public   ArrayList   GetDbList(string   strServerName,string   strUserName,string   strPwd)    
  {    
  ServerName   =   strServerName   ;    
  UserName   =   strUserName   ;    
  Password   =   strPwd   ;    
   
   
  ArrayList   alDbs   =   new   ArrayList()   ;    
  SQLDMO.Application   sqlApp   =   new   SQLDMO.ApplicationClass()   ;    
  SQLDMO.SQLServer   svr   =   new   SQLDMO.SQLServerClass()   ;    
  try    
  {    
  svr.Connect(ServerName,UserName,Password)   ;    
  foreach(SQLDMO.Database   db   in   svr.Databases)    
  {    
  if(db.Name!=null)    
  alDbs.Add(db.Name)   ;    
  }    
  }    
  catch(Exception   err)    
  {    
  // throw(new   Exception("连接数据库出错:"+e.Message))   ;    
  message   =   "连接数据库出错:"   +err.Message;  
  }    
  finally    
  {    
  svr.DisConnect()   ;    
  sqlApp.Quit()   ;    
  }    
  return   alDbs   ;    
  }    
   
   
  //数据库的备份和实时进度显示代码:    
  ///   <summary>  
  ///   数据库的备份和实时进度显示  
  ///   </summary>  
  ///   <param   name="strDbName">数据库名称</param>  
  ///   <param   name="strFileName">备份文件名</param>  
  ///   <param   name="pgbMain">状态条控件名称</param>  
  ///   <param   name="strServerName">服务器名称</param>  
  ///   <param   name="strUserName">用户名称</param>  
  ///   <param   name="strPwd">密码</param>  
  ///   <returns>备份成功返回true   ,否则返回false</returns>  
  public   bool   BackUPDB(string   strDbName,string   strFileName,   ProgressBar   pgbMain,string   strServerName,string   strUserName,string   strPwd)    
  {    
  ServerName   =   strServerName   ;    
  UserName   =   strUserName   ;    
  Password   =   strPwd   ;    
   
  PBar   =   pgbMain;    
  SQLDMO.SQLServer   svr   =   new   SQLDMO.SQLServerClass()   ;    
  try    
  {    
  svr.Connect(ServerName,UserName,Password)   ;    
  SQLDMO.Backup   bak   =   new   SQLDMO.BackupClass();    
  bak.Action   =   0   ;    
  bak.Initialize   =   true   ;    
  SQLDMO.BackupSink_PercentCompleteEventHandler   pceh   =   new   SQLDMO.BackupSink_PercentCompleteEventHandler(Step);    
  bak.PercentComplete   +=   pceh;    
   
  bak.Files   =   strFileName;    
  bak.Database   =   strDbName;    
  bak.SQLBackup(svr);    
  return   true   ;    
  }    
  catch(Exception   err)    
  {    
  // throw(new   Exception("备份数据库失败"+err.Message))   ;    
  message   =   "备份数据库失败:"   +err.Message;  
                                  return   false   ;    
  }    
  finally    
  {    
  svr.DisConnect()   ;    
  }    
  }    
   
   
  ///   <summary>  
  ///   显示进度条的当前进度  
  ///   </summary>  
  ///   <param   name="message"></param>  
  ///   <param   name="percent"></param>  
  private   void   Step(string   message,int   percent)    
  {    
  PBar.Value   =   percent   ;    
  }    
  // 其中,这两个语句实现了进度的实时显示:    
  // SQLDMO.BackupSink_PercentCompleteEventHandler   pceh   =   new   SQLDMO.BackupSink_PercentCompleteEventHandler(Step);    
  // bak.PercentComplete   +=   pceh;    
  // Step就是上面private   void   Step(string   message,int   percent)   的方法名称,它用来显示进度条的当前进度。    
   
   
   
  ///   <summary>  
  ///   数据库的恢复和杀死进程  
  ///   </summary>  
  ///   <param   name="strDbName">数据库名称</param>  
  ///   <param   name="strFileName">备份文件名</param>  
  ///   <param   name="pgbMain">状态条控件名称</param>  
  ///   <param   name="strServerName">服务器名称</param>  
  ///   <param   name="strUserName">用户名称</param>  
  ///   <param   name="strPwd">密码</param>  
  ///   <returns>恢复成功返回true   ,否则返回false</returns>  
  public   bool   RestoreDB(string   strDbName,string   strFileName,   ProgressBar   pgbMain,string   strServerName,string   strUserName,string   strPwd   )    
  {    
  PBar   =   pgbMain   ;    
  SQLDMO.SQLServer   svr   =   new   SQLDMO.SQLServerClass()   ;    
  try    
  {    
  ServerName   =   strServerName   ;    
  UserName   =   strUserName   ;    
  Password   =   strPwd   ;    
   
  svr.Connect(ServerName,UserName,Password)   ;    
  SQLDMO.QueryResults   qr   =   svr.EnumProcesses(-1)   ;    
  int   iColPIDNum   =   -1   ;    
  int   iColDbName   =   -1   ;    
  for(int   i=1;i<=qr.Columns;i++)    
  {    
  string   strName   =   qr.get_ColumnName(i)   ;    
  if   (strName.ToUpper().Trim()   ==   "SPID")    
  {    
  iColPIDNum   =   i   ;    
  }    
  else   if   (strName.ToUpper().Trim()   ==   "DBNAME")    
  {    
  iColDbName   =   i   ;    
  }    
  if   (iColPIDNum   !=   -1   &&   iColDbName   !=   -1)    
  break   ;    
  }    
   
  for(int   i=1;i<=qr.Rows;i++)    
  {    
  int   lPID   =   qr.GetColumnLong(i,iColPIDNum)   ;    
  string   strDBName   =   qr.GetColumnString(i,iColDbName)   ;    
  if   (strDBName.ToUpper()   ==   strDbName.ToUpper())    
  svr.KillProcess(lPID)   ;    
  }    
   
  SQLDMO.Restore   res   =   new   SQLDMO.RestoreClass()   ;    
  res.Action   =   0   ;    
  SQLDMO.RestoreSink_PercentCompleteEventHandler   pceh   =   new   SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);    
  res.PercentComplete   +=   pceh;    
  res.Files   =   strFileName   ;    
   
  res.Database   =   strDbName   ;    
  res.ReplaceDatabase   =   true   ;    
  res.SQLRestore(svr)   ;    
  return   true   ;    
  }    
  catch(Exception   err)    
  {    
  // throw(new   Exception("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message))   ;    
  message   =   "恢复数据库失败,请关闭所有和该数据库连接的程序!"   +err.Message;  
  return   false;  
  }    
  finally    
  {    
  svr.DisConnect()   ;    
  }    
  }    
  }  
  } 
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:109993次
    • 积分:2022
    • 等级:
    • 排名:第19656名
    • 原创:68篇
    • 转载:76篇
    • 译文:0篇
    • 评论:2条
    文章分类
    文章存档
    最新评论