我用了网上介绍的那个用Interop.SQLDMO.dll来备份还原的技术,备份是不会出错,但是还原要求有排它访问权,在没有用SqlConnection连接数据库之前,是可以还原的,不会出错,但是用OPEN方法连接过数据库后,就无法还原了,就是出个什么“数据库正在使用,什么排它访问权”之类的东西。后来我又用了Close()和Dispose()对SqlConnection进行关闭连接,再去备份,仍然提示这个错误,请问怎样才能彻底的断绝与数据库的连接呢?

解决方案 »

  1.   

    To:flyskywlh(~.NET 2% 一场雨~) 
    那么用C#程序怎么停止服务管理器?
      

  2.   

    很久以前看的一篇文章后改的
    public void Restore(string path)
    {
    try
    {
    if(!File.Exists(path))
    {
    throw new Exception("非法的路径名");
    }
    else
    {
    string sqlText6="USE master IF EXISTS (SELECT name FROM sysobjects  WHERE name = 'killspid' AND type = 'P') DROP PROCEDURE killspid";

    string sqlText="CREATE  PROCEDURE killspid  @dbname  varchar(20) as begin  declare  @sql  nvarchar(500),@temp varchar(1000)  declare  @spid  int     set  @sql='declare  getspid  cursor  for";
    sqlText+=" select  spid  from  master..sysprocesses  where  dbid=db_id('''+@dbname+''')'  exec  (@sql)   open  getspid   fetch  next  from  getspid  into  @spid  while  @@fetch_status <> -1 ";
    sqlText+=" begin   set @temp='kill  '+rtrim(@spid)  exec(@temp)  fetch  next  from  getspid  into  @spid  end  close  getspid  deallocate  getspid end ";
    string sqlText2=" execute killspid  'KMTTCMS'";
    string sqlText3="alter database KMTTCMS set RESTRICTED_USER  with rollback immediate";
    string sqlText4="restore database KMTTCMS from disk='"+path+"'";
    string sqlText5="alter database KMTTCMS set MULTI_USER  with rollback immediate";

    _dbo.SqlDb.ExecuteNonQuery(sqlText6);
    _dbo.SqlDb.ExecuteNonQuery(sqlText);
    _dbo.SqlDb.ExecuteNonQuery(sqlText2);
    _dbo.SqlDb.ExecuteNonQuery(sqlText3);
    _dbo.SqlDb.ExecuteNonQuery(sqlText4);
    _dbo.SqlDb.ExecuteNonQuery(sqlText5);
    Response.Write( "<script language=javascript>alert('成功恢复数据!');</script>" ) ;
    if(File.Exists(path))
    {
    File.Delete(path);
    }
    Response.Write("<script>window.close();</script>");
    }
    }
    catch(Exception ex)
    {
    Session["Ex"]=ex.Message;
    Response.Redirect("error.aspx");
    }
    finally
    {
    _dbo.SqlDb.CloseInnerConnection();
    }
    }