还原时要断开对还原数据库所有用户的连接。
具体实现到SQL SERVER版看看。

解决方案 »

  1.   

    不能对当前的数据库进行还原。在代码前面加上use master
      

  2.   

    把oRestore.Database = "yichang";改为 oRestore.Database = "master";
      

  3.   

    还有其他数据库链接关闭所有:查询分析器;与本数据库有关的应用程序;停止所有与本数据库有关的windows服务;关闭.NET Server浏览器
      

  4.   

    把你的VS.net关闭,企业管理器关闭,还有你的查询分析器关闭,然后运行你的程序看看行不行,这样的恢复方式不是很好用的,只要有人lock你的DB数据你就没办法恢复
      

  5.   

    这个问题,我刚刚也碰到,恢复数据库时,保证被恢复的数据库能够不被使用,结束进程
    应该使用其他连接保证被恢复的数据库不被使用
    public bool DbRestore(string restorename,string path)
    {
    SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
    SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
    try
    {
    oSQLServer.LoginSecure = false;
    oSQLServer.Connect("localhost",username,password);
    SQLDMO.QueryResults qr = oSQLServer.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() == restorename.ToUpper()) 
    {
    try
    {
    oSQLServer.KillProcess(lPID) ; 
    }
    catch
    {
      停止进程失败! }
    }
    } oRestore.Action = 0; 
    oRestore.Database = restorename;
    oRestore.Files = path;
    oRestore.ReplaceDatabase = true;
    oRestore.SQLRestore(oSQLServer);

    return true;
    }
    catch
    {
    return false;
    }
    finally
    {
    oSQLServer.DisConnect();
    }
    }