在ASP.NET页面中实现数据库备份和恢复功能
2024-07-10 13:05:52
供稿:网友
 
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()   ;     
  }     
  }     
  }   
  }   
 
网站运营seo文章大全提供全面的站长运营经验及seo技术!