参见在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库
http://dev.csdn.net/develop/article/28/28564.shtm
当不使用要恢复的数据库时以上方法可行,但当你使用了数据库时就必须杀死该进程
代码如下: /// <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() ; 


解决方案 »

  1.   

    sql server服务管理器
    sql server 关了吗? sql server agent也关了吗?
      

  2.   

    不行,还是执行它catch

    return false;

      

  3.   

    数据库恢复用独立的一个进程。。
    把其它使用这个数据库的进程kill掉。
      

  4.   

    确保关闭了你要备份的数据库的所有连接,然后连接到master数据库,备份/恢复别的数据库!
      

  5.   

    单用户下也许有用,多用户下根本没用的
    在服务器端设数据库成单用户模式,瞬间就把一切连接给你断开.用下面这个存储过程ALTER DATABASE 数据库名
          SET SINGLE_USER
          with rollback immediate
    然后开始你的还原工作,完成后.就用下面这个把数据库恢复成多用户ALTER DATABASE 数据库名
          SET MULTI_USER最后用调用服务把SQL2000给关了,
    默认的服务名为MSSQLSERVER
    MSDE的服务名为MSSQL$实例名
    待30秒至1分钟.看你的实际情况.再把这服务给恢复过来