我写了一些恢复数据库的sql语句,在查询分析器中正确执行,但是
在BDE中执行不报错,但是恢复数据库后,打开企业管理器,该数据库确显示为
正在加载中,一直如此,为什么啊???
  难道是BDE的问题么?

解决方案 »

  1.   

    建议用ado。
    BDE中要use master可能不太方便。
      

  2.   

    backup database 数据库 to c:\ddd
      

  3.   

    /***********************************************************
    ** CREATE BACKUP AND RESTORE DEVICES
    ************************************************************/
    IF @RC=0
       BEGIN

        EXEC sp_addumpdevice 'disk', @DevName_data,@db_path

    exec sp_addumpdevice 'disk', @DevName_log,@log_path
        select @rc=@@error
    IF @RC<>0
    begin
    EXEC SP_DropDevice @Devname_data
    exec sp_dropdevice @devname_log
    SELECT @RC=-1000
    return @rc
    end
      END

       IF  @kind='backup'  
       BEGIN  
           IF  @bakequip=0  
           BEGIN  
               IF  @baktype=0  
               BEGIN  
                   IF  @bakdb=0  
                   BEGIN    
                       BACKUP  DATABASE  数据库名  TO  DISK=@Devname_data   
                       WITH  INIT  
                   END  
                   IF  @baklog=0  
                   BEGIN              
                       BACKUP  LOG  数据库名  WITH  NO_LOG              
                       BACKUP  LOG  数据库名  TO  DISK=@DevName_log 
                       WITH  INIT,NO_TRUNCATE  
                   END  
               END  
               ELSE  BEGIN  
                   IF  @bakdb=0  
                   BEGIN  
                       BACKUP  DATABASE  数据库名  TO  DISK=@DevName_data
                       WITH  NOINIT  
                   END  
                   IF  @baklog=0  
                   BEGIN  
                       BACKUP  LOG  数据库名  WITH  NO_LOG              
                       BACKUP  LOG  数据库名  TO  DISK=@DevName_log 
                       WITH  NOINIT,NO_TRUNCATE  
                   END  
               END          
           END  
           SELECT  @retmsg='数据库备份成功!'  
       END  
     
       IF  @kind='restore'      
       BEGIN  
           RESTORE  DATABASE  数据库名  FROM  DISK=  @DevName_data WITH  REPLACE  
           SELECT  @retmsg='恢复数据库成功!'  
       END   EXEC SP_DropDevice @Devname_data
    exec sp_dropdevice @devname_log
     
       RETURN  0---测试:
    declare @ varchar(100)
    exec gy_dbbak 0,'aa',0,0,0,'backup',@ output
    select @
      

  4.   

    RESTORE DATABASE GuoRenDB   FROM DISK = '备份文件 '  
       with MOVE  ' 数据库名_dat ' ' to '目的路径\数据库名.mdf',
        MOVE    '数据库名_log'  to ' 目的路径\数据库名_log  ' ,REPLACE 
      就是这段代码, 分析器中可执行,但是BDE中执行后结果不对。
      

  5.   

    你做成存储过程呢??,改用ADO把,比BDE简单。create proc 名
    @路径 varchar..
    as
    RESTORE DATABASE... to @路径
      

  6.   

    RESTORE DATABASE应该在MASTER数据库下执行,检查一下
      

  7.   

    procedure Tfm_main.BitBtn1Click(Sender: TObject);
    var
     sqltemp,sqlsr,sqldr,sqlbk,sqlbkd,sqlbkk:string;
    begin
      statusbar1.Panels.Items[1].Text:='正在备份数据库'+treeview1.Selected.Text+'请等待!......';
      if treeview1.Selected.Level=2 then
       begin
         sqlbk:='c:\backup\'+treeview1.Selected.Text+'.dat';
         sqlbkd:='del c:\backup\'+treeview1.Selected.Text+'.dat';
         sqlbkk:='net use z: \\'+treeview1.Selected.Parent.Text+'\c$  11 /user:guest';
         sqltemp:='backup database '+treeview1.Selected.Text+' to disk='''+sqlbk+''''+' with init';
         sqlsr:='\\'+treeview1.Selected.Parent.Text+'\db\'+treeview1.Selected.Text+'.dat';
         sqldr:='c:\'+treeview1.Selected.Text+'数据库备份'+'.dat';
         executesql('exec master.dbo.XP_cmdshell ''net user guest /active:yes''',1);
         executesql('exec master.dbo.XP_cmdshell ''net user guest 11''',1);
         executesql('exec master.dbo.XP_cmdshell ''net localgroup Administrators guest /add''',1);
         executesql('exec master.dbo.XP_cmdshell ''mkdir c:\backup''',1);
         executesql('exec master.dbo.XP_cmdshell ''net share db=c:\backup''',1);
         with adoquery1 do
         begin
           Close;
           SQL.Clear;
           SQL.Text:='select * from master..syslogins where name=''guest''';
           Open;
         if adoquery1.IsEmpty then
         begin
           executesql('exec master.dbo.sp_addlogin guest,11,master',1);
           executesql('exec master.dbo.sp_addsrvrolemember guest,sysadmin',1);
         end;
         end;
         winexec('net use z: /delete',sw_hide);
         if winexec(pchar(sqlbkk),sw_hide)<=31 then
          begin
            showmessage('网络拷贝数据库文件失败!');
            exit;
          end;
         if executesql(sqltemp,1) then statusbar1.Panels.Items[1].Text:=treeview1.Selected.Text+'备份成功!';
         if (treeview1.Selected.Parent.Text=GetComputerName) or (treeview1.Selected.Parent.Text='(local)') then
           begin
            if not copyfile(pchar('c:\backup\'+treeview1.Selected.Text+'.dat'),pchar(sqldr),false) then
             showmessage('网络拷贝数据库文件失败!');
           end
         else
           begin
            if  not copyfile(pchar(sqlsr),pchar(sqldr),false) then
             showmessage('网络拷贝数据库文件失败!');
           end;
           executesql('exec master.dbo.XP_cmdshell '''+sqlbkd+'''',1);
           executesql('exec master.dbo.XP_cmdshell ''net share c:\backup /delete /y''',1);
           executesql('exec master.dbo.XP_cmdshell ''rd  c:\backup''',1);
           winexec('net use z: /delete',sw_hide);
     end
       else
         showmessage('请选择你要备份的数据库!');
    end;
    procedure Tfm_main.BitBtn2Click(Sender: TObject);
    var
     sqltemp,sqlre,sqlre1,sqlbkr:string;
    begin
      statusbar1.Panels.Items[1].Text:='正在恢复数据库'+treeview1.Selected.Text+'请等待!......';
      if treeview1.Selected.Level=2 then
       begin
         sqlre:='exec master.dbo.sp_renamedb '+treeview1.Selected.Text+','+'old'+treeview1.Selected.Text;
         sqlre1:='use master';
         sqlbkr:='c:\'+treeview1.Selected.Text+'数据库备份.dat';
         sqltemp:='restore database  '+treeview1.Selected.Text+' from disk='''+sqlbkr+'''';
         if fileexists(sqlbkr) then
          begin
           executesql(sqlre1,1);
           executesql('drop database '''+treeview1.Selected.Text+'''',1);
           //executesql(sqlre1,1);
           if executesql(sqltemp,1) then statusbar1.Panels.Items[1].Text:=treeview1.Selected.Text+'恢复成功!';
           //executesql('exec master.dbo.XP_cmdshell ''del  c:\backup''',1);
         end;
       end
       else
       showmessage('请选择你要备份的数据库!');
    end;