C#备份及还原数据库的实现

使用前要导入SQLDMO.dll

下载地址:http://down.51cto.com/data/853937

 

     1.在用户的配置时,我们需要列出当前局域网内所有的数据库服务器,并且要列出指定服务器的所有数据库,实现代码如下:

     取得数据库服务器列表:


  1. public ArrayList GetServerList()   

  2. {   

  3. ArrayList alServers = new ArrayList() ;   

  4. SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;   

  5. try   

  6. {   

  7. SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers() ;   

  8. for(int i = 1;i<= serverList.Count;i++)   

  9. {   

  10. alServers.Add(serverList.Item(i)) ;   

  11. }   

  12. }   

  13. catch(Exception e)   

  14. {   

  15. throw(new Exception("取数据库服务器列表出错:"+e.Message)) ;   

  16. }   

  17. finally   

  18. {   

  19. sqlApp.Quit() ;   

  20. }   

  21. return alServers ;   

  22. }   

 
取得指定数据库服务器的数据库列表   


  1. public ArrayList GetDbList(string strServerName,string strUserName,string strPwd)    

  2. {    

  3. ServerName = strServerName ;    

  4. UserName = strUserName ;    

  5. Password = strPwd ;    

  6.   

  7. ArrayList alDbs = new ArrayList() ;    

  8. SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;     

  9. SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;     

  10. try    

  11. {    

  12. svr.Connect(ServerName,UserName,Password) ;    

  13. foreach(SQLDMO.Database db in svr.Databases)    

  14. {    

  15. if(db.Name!=null)     

  16. alDbs.Add(db.Name) ;    

  17. }    

  18. }    

  19. catch(Exception e)    

  20. {    

  21. throw(new Exception("连接数据库出错:"+e.Message)) ;     

  22. }    

  23. finally    

  24. {    

  25. svr.DisConnect() ;    

  26. sqlApp.Quit() ;    

  27. }    

  28. return alDbs ;    

  29. }   

 

    2.数据库的备份和实时进度显示代码: 


  1. public bool BackUPDB(string strDbName,string strFileName, ProgressBar pgbMain)   

  2. {   

  3. PBar = pgbMain ;   

  4. SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;   

  5. try   

  6. {   

  7. svr.Connect(ServerName,UserName,Password) ;   

  8. SQLDMO.Backup bak = new SQLDMO.BackupClass();   

  9. bak.Action = 0 ;   

  10. bak.Initialize = true ;   

  11. SQLDMO.BackupSink_PercentCompleteEventHandler pceh = 

  12. new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);   

  13. bak.PercentComplete += pceh;   

  14. bak.Files = strFileName;   

  15. bak.Database = strDbName;   

  16. bak.SQLBackup(svr);   

  17. return true ;   

  18. }   

  19. catch(Exception err)   

  20. {   

  21. throw(new Exception("备份数据库失败"+err.Message)) ;   

  22. }   

  23. finally   

  24. {   

  25. svr.DisConnect() ;   

  26. }   

  27. }   

  28.  

  29. private void Step(string message,int percent)   

  30. {   

  31. PBar.Value = percent ;   

  32. }  


    其中,这两个语句实现了进度的实时显示:

    SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new      SQLDMO.BackupSink_PercentCompleteEventHandler(Step); 
    bak.PercentComplete  += pceh;

    Step就是上面private void Step(string message,int percent)  的方法名称,它用来显示进度条的当前进度。

    3.数据库的恢复和杀死进程的代码:


  1. public bool RestoreDB(string strDbName,string strFileName, ProgressBar pgbMain)   

  2. {   

  3. PBar = pgbMain ;   

  4. SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;   

  5. try   

  6. {   

  7. svr.Connect(ServerName,UserName,Password) ;   

  8. SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;   

  9. int iColPIDNum = -1 ;   

  10. int iColDbName = -1 ;   

  11. for(int i=1;i<=qr.Columns;i++)   

  12. {   

  13. string strName = qr.get_ColumnName(i) ;   

  14. if (strName.ToUpper().Trim() == "SPID")   

  15. {   

  16. iColPIDNum = i ;   

  17. }   

  18. else if (strName.ToUpper().Trim() == "DBNAME")   

  19. {   

  20. iColDbName = i ;   

  21. }   

  22. if (iColPIDNum != -1 && iColDbName != -1)   

  23. break ;   

  24. }   

  25.  

  26. for(int i=1;i<=qr.Rows;i++)   

  27. {   

  28. int lPID = qr.GetColumnLong(i,iColPIDNum) ;   

  29. string strDBName = qr.GetColumnString(i,iColDbName) ;   

  30. if (strDBName.ToUpper() == strDbName.ToUpper())   

  31. svr.KillProcess(lPID) ;   

  32. }   

  33.  

  34. SQLDMO.Restore res = new SQLDMO.RestoreClass() ;   

  35. res.Action = 0 ;   

  36. SQLDMO.RestoreSink_PercentCompleteEventHandler pceh = 

  37. new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);   

  38. res.PercentComplete += pceh;   

  39. res.Files = strFileName ;   

  40.  

  41. res.Database = strDbName ;   

  42. res.ReplaceDatabase = true ;   

  43. res.SQLRestore(svr) ;   

  44. return true ;   

  45. }   

  46. catch(Exception err)   

  47. {   

  48. throw(new Exception("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message)) ;   

  49. }   

  50. finally   

  51. {   

  52. svr.DisConnect() ;   

  53. }   

  54. }  


    其中这个语句取得了所有的进程列表:

    SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;

    下面的语句找到和要恢复数据库相关的进程并杀死:


  1. int iColPIDNum = -1 ;   

  2. int iColDbName = -1 ;   

  3. for(int i=1;i<=qr.Columns;i++)   

  4. {   

  5. string strName = qr.get_ColumnName(i) ;   

  6. if (strName.ToUpper().Trim() == "SPID")   

  7. {   

  8. iColPIDNum = i ;   

  9. }   

  10. else if (strName.ToUpper().Trim() == "DBNAME")   

  11. {   

  12. iColDbName = i ;   

  13. }   

  14. if (iColPIDNum != -1 && iColDbName != -1)   

  15. break ;   

  16. }   

  17.  

  18. for(int i=1;i<=qr.Rows;i++)   

  19. {   

  20. int lPID = qr.GetColumnLong(i,iColPIDNum) ;   

  21. string strDBName = qr.GetColumnString(i,iColDbName) ;   

  22. if (strDBName.ToUpper() == strDbName.ToUpper())   

  23. svr.KillProcess(lPID) ;   

  24. }  

posted @ 2013-06-28 16:38  hongsedigua  阅读(460)  评论(0编辑  收藏  举报