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

    技术2022-05-11  79

    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)