天天看点

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()   ;    

}    

}