我用C#备份了数据库,备份路径为c:\Text.bak
现在我要恢复数据库,代码如下:
protected void Button2_Click(object sender, EventArgs e)
    {
        string path = @"c:\Text.bak";
        string restore = "restore database Text from disk='" + path + "';";
        SqlConnection con = new SqlConnection("server=20090831-0852\\SQL2005;uid=sa;pwd=123");
        SqlCommand cmd = new SqlCommand(restore, con);
        try
        {
            con.Open();
            cmd.ExecuteNonQuery();
            this.Label1.Text = "恢复成功";        }
        catch
        {
            this.Label1.Text = "恢复失败";
        }
        finally
        {
            con.Close();
        }
    }
问题一:执行了上面代码以后刷新sqlsever2005什么也没有啊?
问题二:Label1在执行代码后既不显示"恢复成功",也不显示“恢复失败”!这到底是怎么一回事?
问题三:小弟刚刚接触数据库恢复,不晓得在执行上述代码之前应做什么准备工作,请您说一下?
希望各位逐个回答我的问题,越详细越好,否则兄弟看不明白,见笑了。谢谢!

解决方案 »

  1.   

    例如你要恢复的数据库的名字叫ABC,那么你的数据库里必须首先有这个名字的数据库才可以哦。
      

  2.   

    恢复数据库要kill当前连接
    CREATE proc RestoreDb @bkfile nvarchar(1000),@dbname sysname='',@dbpath nvarchar(260)='',@retype nvarchar(10)='DB',@filenumber int=1, @overexist bit=1,@killuser bit=1 
    as declare @sql varchar(8000)  if isnull(@dbname,'')=''select @sql=reverse(@bkfile),@sql=case when charindex('.',@sql)=0 then @sql else substring(@sql,charindex('.',@sql)+1,1000) end ,@sql=case when charindex('\',@sql)=0 then @sql  else left(@sql,charindex('\',@sql)-1) end,@dbname=reverse(@sql) 
    set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname+' from disk='''+@bkfile+''''+' with file='+cast(@filenumber as varchar) +case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end +case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end 
    print @sql 
    if @overexist=1 and @killuser=1 
    begin declare @spid varchar(20) declare #spid cursor for select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname) open #spid fetch next from #spid into @spid while @@fetch_status=0  begin  exec('kill '+@spid) fetch next from #spid into @spid End close #spid deallocate #spid  End  
    exec (@sql)
      

  3.   

    你的意思是要“server=20090831-0852\\SQL2005;uid=sa;pwd=123”中再加一项database=ABC吗?那我提前建立这个数据库ABC时要像在原数据库中一样一一定义ABC中的每一个表吗?
      

  4.   

    不是这个意思,我是说你的数据库里必须已经有ABD这个数据库才可以的,也就是你在企业管理器里已经能看到这个数据库了。
    http://www.cnblogs.com/efish/archive/2006/10/23/537336.html
      

  5.   

    我在说明白点,就是说例如你打开企业管理器没有看到abc这个数据库,那么你必须先新建一个名字是abc的数据库才可以还原,明白了没?
    当然,判断数据库是否存在以及新建数据库都是可以在代码里实现的。
      

  6.   

    要杀死原有数据库连接进程,因为在还原过程中,该数据库应该断开脱机模式。
    public static string RestoreDatabase(string backfile)
      {
       ///杀死原来所有的数据库连接进程
       ///   SqlConnection conn=new SqlConnection ();
       conn.ConnectionString ="Data Source=.;Initial Catalog=master;User ID=sa;pwd =teny123";
       conn.Open ();
       ///查找当前名为PUBS的数据库使用进程
       string sql="SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='pubs'";   SqlCommand cmd1 = new SqlCommand(sql, conn);
       SqlDataReader dr;   ArrayList list = new ArrayList();   try
       {
        dr = cmd1.ExecuteReader();
           
        while(dr.Read())
        {
         list.Add(dr.GetInt16(0));
        }
        dr.Close();   }
       catch(SqlException eee)
       {
        MessageBox.Show (eee.ToString ());
       }
       finally
       {
        conn.Close ();
                      
       }   MessageBox.Show (list.Count .ToString ());//循环杀死进程之;
       for(int i = 0; i < list.Count; i++)
       {
        cmd1 = new SqlCommand(string.Format("KILL {0}", list[i].ToString ()), conn);
        cmd1.ExecuteNonQuery();    MessageBox.Show ("you have killed thread "+list[i].ToString ());   }   //这里一定要是master数据库,而不能是要还原的数据库,因为这样便变成了有其它进程
       //占用了数据库。
       string constr = @"Data Source=.;Initial Catalog=master;User ID=sa;pwd =teny123 ";
       string database = "pubs";
       string path = @"d:\1.mdf";
       //string BACKUP = String.Format("backup database {0} to disk='{1}'", database, path);
       string BACKUP = String.Format("RESTORE DATABASE {0}  FROM DISK = '{1}'", database, path);   SqlConnection con = new SqlConnection(constr);
       SqlCommand cmd = new SqlCommand(BACKUP, con);
       con.Open();
       try
       {
        cmd.ExecuteNonQuery();
        MessageBox.Show("还原成功");
       }
       catch(SqlException ee)
       {
        //throw(ee);    //MessageBox.Show("还原失败");    MessageBox.Show (ee.ToString ());   }
       finally
       {
        con.Close();
       }
                        return "成功与否字符串";  //return "restore successfully!";
      }
      

  7.   

    本来想废话两句,但是貌似这个比较简单,给楼主一个链接,提供代码下载,另外:CodeProject真是个好地方啊http://www.codeproject.com/KB/database/mft_jet_restore.aspx楼主下载代码自己看看,很简单。