天天看點

C#中運用SQLDMO備份和恢複Microsoft SQL Server資料庫

C#中運用SQLDMO備份和恢複Microsoft SQL Server資料庫

【轉】  http://hi.baidu.com/zzj05142129/blog/item/6f50f53ef1d02ec47c1e7140.html

當不使用要恢複的資料庫時以上方法可行,但當你使用了資料庫時就必須殺死該程序  

代碼如下:  

///   <summary>  

///   還原資料庫函數  

///   </summary>  

///   <param   name="strDbName">資料庫名</param>  

///   <param   name="strFileName">資料庫備份檔案的完整路徑名</param>  

///   <returns></returns>  

public   bool   RestoreDB(string   strDbName,string   strFileName)    

{    

//PBar   =   pgbMain   ;    

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

try    

{    

//伺服器名,資料庫使用者名,資料庫使用者名密碼  

svr.Connect("localhost","sa","hai")   ;  

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   ;    

}    

                                  //殺死使用strDbName資料庫的程序  

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   ;    

res.Files   =   strFileName   ;    

res.Database   =   strDbName   ;    

res.ReplaceDatabase   =   true   ;    

res.SQLRestore(svr)   ;    

return   true   ;    

}    

catch  

{    

return   false;  

}    

finally    

{    

svr.DisConnect()   ;    

}    

}