求达人指点下用Delphi7还原SQL Server 2008 R2 SP2 Express数据库的问题

时间:2023-01-09 17:45:22

procedure RestoreDataBase;
var
  ConnString: String;
  ExecSQLTStrings: TStrings;
begin
  try
    
    ConnString := 'Provider=SQLOLEDB.1; Integrated Security=SSPI; Persist Security Info=False; Initial Catalog=master; Data Source=127.0.0.1,1433;';
    RestoreADOConn.Connected := False;
    RestoreADOConn.ConnectionString := ConnString;
    RestoreADOConn.Connected := True;
    
    ExecSQLTStrings := TStringList.Create;
    try
      ExecSQLTStrings.Clear;
      ExecSQLTStrings.Add('USE master');
      ExecSQLTStrings.Add('');
      ExecSQLTStrings.Add('ALTER DATABASE [' + RestoreDataBaseName + '] SET OFFLINE WITH ROLLBACK IMMEDIATE');
      ExecSQLTStrings.Add('');
      ExecSQLTStrings.Add('RESTORE DATABASE [' + RestoreDataBaseName + ']');
      ExecSQLTStrings.Add(' FROM DISK=''' + RestoreFile + '''');
      ExecSQLTStrings.Add(' WITH MOVE ''' + RestoreDataBaseName + ''' TO ''' + RestoreDataBasePath + RestoreDataBaseName + '.mdf'',');
      ExecSQLTStrings.Add(' MOVE ''' + RestoreDataBaseName + '_log'' TO ''' + RestoreDataBasePath + RestoreDataBaseName + '_log.ldf'',');
      ExecSQLTStrings.Add(' REPLACE');
      ExecSQLTStrings.Add('');
      ExecSQLTStrings.Add('ALTER DATABASE [' + RestoreDataBaseName + '] SET ONLINE');
      ExecSQLTStrings.Add('');
      ExecSQLTStrings.Add('GO');
      
      with RestoreQuery do
      begin
        Close;
        SQL.Clear;
        SQL.AddStrings(ExecSQLTStrings);
        ExecSQL;
      end;
      
    finally
      ExecSQLTStrings.Free;
    end;
  except
  end;
end;


数据库采用的是SQL Server 2008 R2 SP2 Express版本
上面这个函数无法还原数据库,不知道是啥原因,把ExecSQLTStrings的内容保存到文本,然后复制内容到分析器,可以正常还原数据库。
具体执行的代码如下:

USE master

ALTER DATABASE [RmmisClient6] SET OFFLINE WITH ROLLBACK IMMEDIATE

RESTORE DATABASE [RmmisClient6]
 FROM DISK='F:\SQL(2008)DataBase\RmmisClient6\数据库备份_20141027_1456.BAK'
 WITH MOVE 'RmmisClient6' TO 'F:\SQL(2008)DataBase\RmmisClient6\RmmisClient6.mdf',
 MOVE 'RmmisClient6_log' TO 'F:\SQL(2008)DataBase\RmmisClient6\RmmisClient6_log.ldf',
 REPLACE

ALTER DATABASE [RmmisClient6] SET ONLINE

GO

4 个解决方案

#1


没有试验,但GO不是sql语句,去掉它试试

#2


建议使用下列代码:恢复数据库:
    ADOQ.SQL.Clear;
    ADOQ.SQL.Add('Use master');                                                                         // 使用 SQL master 数据库
    ADOQ.SQL.Add('ALTER DATABASE '+DatabaseName+' SET OFFLINE WITH ROLLBACK IMMEDIATE');                // 脱机
    ADOQ.SQL.Add('restore database '+DatabaseName+' from disk='''+UpDateFile+''' With File=1, Replace');   // 用备份文件 还原 用户数据库
    ADOQ.SQL.Add('ALTER DATABASE '+DatabaseName+' SET ONLINE WITH ROLLBACK IMMEDIATE');                 // 联机
    ADOQ.SQL.Add('use '+DatabaseName);                                                                  // 使用 用户 数据库
    ADOQ.ExecSQL;

#3


引用 1 楼 ctx62 的回复:
没有试验,但GO不是sql语句,去掉它试试


非常感谢,可以还原了。。。

#4


来学习了  求达人指点下用Delphi7还原SQL Server 2008 R2 SP2 Express数据库的问题

#1


没有试验,但GO不是sql语句,去掉它试试

#2


建议使用下列代码:恢复数据库:
    ADOQ.SQL.Clear;
    ADOQ.SQL.Add('Use master');                                                                         // 使用 SQL master 数据库
    ADOQ.SQL.Add('ALTER DATABASE '+DatabaseName+' SET OFFLINE WITH ROLLBACK IMMEDIATE');                // 脱机
    ADOQ.SQL.Add('restore database '+DatabaseName+' from disk='''+UpDateFile+''' With File=1, Replace');   // 用备份文件 还原 用户数据库
    ADOQ.SQL.Add('ALTER DATABASE '+DatabaseName+' SET ONLINE WITH ROLLBACK IMMEDIATE');                 // 联机
    ADOQ.SQL.Add('use '+DatabaseName);                                                                  // 使用 用户 数据库
    ADOQ.ExecSQL;

#3


引用 1 楼 ctx62 的回复:
没有试验,但GO不是sql语句,去掉它试试


非常感谢,可以还原了。。。

#4


来学习了  求达人指点下用Delphi7还原SQL Server 2008 R2 SP2 Express数据库的问题