这是直接从我的代码从拷出来的,供参考
Function DataBaseExist(AdoSqlConn:TAdoConnection; ServerName,UserID,PassWord,DbName:String):Boolean;
var tpQuery:TAdoQuery;
begin
Result:=False;
try
tpQuery:=TAdoQuery.Create(nil);
with tpQuery do
begin
Connection:=AdoSqlConn;
Sql.Add('select Count(Name) from Master..SysDataBases Where Name='''+dbName+'''');
Open;
Result:=Fields[0].AsInteger=1;
Close;
end;
Finally
tpQuery.Free;
end
end;
以上是用来判断数据库名称是不是存在的,在恢复之前最好验证一下
Function RestoreDataBase(ADOSqlConn:TAdoConnection; DbName, BackupFilePos:String):Boolean;
Function CheckFileUsing(ADOSqlConn:TAdoConnection; DbName, BackupFilePos:String):Boolean;
Function GetFileName(FullFileName:String):String;
var tpStr:String; //这个就是从一个含有路径的字符串中取出文件名,由于调用了其他函数,所以你可能不能直接使用
I:Integer;
begin
tpStr:=trim(GetAppointStr('/',FullFileName,CountStrTimes('/',FullFileName)));
tpStr:=GetAppointStr('.',tpStr,1);
Result:=trim(tpStr);
end;
var TpQuery:TAdoQuery;
NewDb,NewFile:String;
begin
Result:=False;
try
NewDb:=GetFileName(BackUpFilePos);
tpQuery:=TAdoQuery.Create(nil);
with tpQuery do
begin
Connection:=AdoSqlConn;
Sql.Add('select Name,FileName from Master..SysDataBases Where Name<>'''+DBName+'''');
Open;
while Not Eof do
if StrIsSame(NewDb,GetFIleName(FieldByName('FileName').AsString)) then
begin
ShowMsg('数据库<'+trim(FieldByName('Name').AsString)+'>正在使用文件名<'+NewDb+'.mdf>,恢复操作无法继续!');
Result:=True;
Break;
Exit;
end
else
Next;
end;
Finally
tpQuery.Close;
tpQuery.Free;
end;
end;
var
tpStr:TStrings;
begin
if StrisEmpty(DbName) or StrIsEmpty(BackUpFilePos) then
begin
ShowMsg('数据库名称或置份文件位置未指定!');
Exit;
end;
if Not DbFileExist(ADOSqlConn,BackUpFilePos) then
begin
ShowMsg('指定的备份文件不存在,请确认!');
Exit;
end;
if CheckFileUsing(ADOSqlConn,DbName,BackupFilePos) then
Exit;
try
tpStr:=TStringList.Create;
tpStr.add('use [Master]');
tpStr.add('');
tpStr.Add('Restore DataBase');
tpStr.Add(' ['+trim(DbName)+'] ');
tpStr.Add(format('FROM DISK = N''%s''',[BackupFilePos]));
TPsTR.Add('WITH RECOVERY , REPLACE');
tpStr.add('');
tpStr.Add('use ['+DbName+']');
try
if AdoSqlConn.Connected then
AdoSqlConn.Connected:=False;
if AskBox('由于恢复操作具有较大危险性,作者不承担由此造成的任何损失!'+#10+
'请在执行恢复前中断数据库服务器与所有用户的连接!'+#10+
'请再次确认是否执行恢复操作?') then
begin
ADOSqlConn.Execute(tpStr.text);
Result:=True;
end
else
Result:=False;
except
on ErrType:Exception do begin
ShowMsg(ErrType.Message);
Result:=False;
Abort;
end;
end;
finally
tpStr.Free;
end;
end;
另外,有关Wolfding兄讲的备份时数据接在原备份后面的问题,如果在企业管理器上操作,则选中 “重写原备份文件选项即可”
如果是用程序备份,则使用下面的语句即可
'Backup DataBase 数据库名 TO '+
Format('DISK = N''%s'' WITH INIT,',[SavePos]))
即加上with init选项,默认是with noinit的,即追加的
如果你不想自己写,可以参考我编的一个小工具
http://feelfinfn.www72.cn4e.com
(绝没有发布广告之意,不要拍我砖头)