各位朋友,我在一个程序中用到了数据库恢复,以下是SQL语句:
adoQuery1.sql.text:='use master'+#13
+' restore FILELISTONLY'
+' FROM DISK ='''+ExpandFileName(openDlg.filename)+''''
+' restore database '+trim(edt_Db.text)+' from disk='''+ExpandFileName(openDlg.filename)+''''
+' WITH REPLACE,'+#13
+' MOVE '''+logical_data+''' TO '''+phi_name+''', '
+' MOVE '''+logical_log+''' TO '''+phi_log+''','
+' recovery'+#13;
执行完后数据库名字变灰,显示'Loading',再次执行该语句则数据库正常,也就是说,每次要执行两次才可以。另外,如果去掉SQL语句的:
+' restore FILELISTONLY'
+' FROM DISK ='''+ExpandFileName(openDlg.filename)+''''
则执行时经常报“超时已过期”错误。
请各位指点一下。
adoQuery1.sql.text:='use master'+#13
+' restore FILELISTONLY'
+' FROM DISK ='''+ExpandFileName(openDlg.filename)+''''
+' restore database '+trim(edt_Db.text)+' from disk='''+ExpandFileName(openDlg.filename)+''''
+' WITH REPLACE,'+#13
+' MOVE '''+logical_data+''' TO '''+phi_name+''', '
+' MOVE '''+logical_log+''' TO '''+phi_log+''','
+' recovery'+#13;
执行完后数据库名字变灰,显示'Loading',再次执行该语句则数据库正常,也就是说,每次要执行两次才可以。另外,如果去掉SQL语句的:
+' restore FILELISTONLY'
+' FROM DISK ='''+ExpandFileName(openDlg.filename)+''''
则执行时经常报“超时已过期”错误。
请各位指点一下。
解决方案 »
- socks问题 (100分相赠)
- 删除数据时有关外键冲突不能删除的情况,急!急!急!
- 急啊,在delphi中如何用SQL语句彻底删除.dbf(VFP)表中的所有记录?
- 请教.Decimal设置为5个小数位..为何只能保存4位..
- formula one6 中怎样才可以选择中间几页打印
- 代码没问题,可只能修改ADOTABLE的第一行数据,修改不了其他的??代码在里面,谢谢帮忙!!
- 一个很容易,而我又不会的问题,请大家看一下
- 问个关于比较编辑框的值的问题
- 基于其他窗口的模态显示怎么做
- 服务程序在一台电脑上怎么运行多份
- 设置了Timer的enabled为true后,为什么还不执行onTimer事件?
- 关于远程服务器上的文档在客户端显示的问题
modlData.adoDtst_master.Active:=false;
modlData.adoDtst_master.CommandText:='';
modlData.adoDtst_master.CommandText:='select * from dbo.sysobjects where name=''Common_backup''';
modlData.adoDtst_master.Active:=true;
if modlData.adoDtst_master.RecordCount = 0 then
begin
text := 'create procedure dbo.Common_backup @sDBName varchar(50), @sPath varchar(500) as declare @sql varchar(500) ';
text:= text + 'if exists(select * from dbo.sysdevices where name=''mydiskdump'') exec sp_dropdevice ''mydiskdump'' ';
text:= text + 'if exists(select * from dbo.sysdevices where name=''mydiskdumpLog'') exec sp_dropdevice ''mydiskdumpLog'' ';
text:= text + 'set @sql = ''sp_addumpdevice ''''disk'''',''''mydiskdump'''','''''' + @sPath+''\mydiskdump.dat'''''' exec(@sql) ';
text:= text + 'set @sql = ''sp_addumpdevice ''''disk'''',''''mydiskdumpLog'''','''''' + @sPath +''\mydiskdumpLog.dat'''''' exec(@sql) ';
text:= text + 'set @sql = ''BACKUP DATABASE '' + @sDBName +'' to mydiskdump'' exec(@sql) ' ;
text:= text + 'set @sql=''BACKUP LOG '' + @sDBName + '' TO mydiskdumpLog'' exec(@sql) '; modlData.adoQuery_master.Close;
modlData.adoQuery_master.SQL.Clear;
modlData.adoQuery_master.SQL.Add(text);
modlData.adoQuery_master.ExecSQL;
end;
modlData.adoQuery_master.Close;
modlData.adoQuery_master.SQL.Clear;
modlData.adoQuery_master.SQL.Add('exec dbo.Common_backup ''veteran'','''+ls_String+'''');
modlData.adoQuery_master.ExecSQL; application.MessageBox('备份成功!','提示',mb_ok);
恢复:
if not FileExists(backup_directory+'\mydiskdump.dat') then
begin
application.MessageBox('未找到备份文件!请重新选择!','提示',mb_ok);
Exit;
end
else
begin
if modlData.adoConn.Connected=true then modlData.adoConn.Close; modlData.adoDtst_master.Active:=false;
modlData.adoDtst_master.CommandText:='';
modlData.adoDtst_master.CommandText:='select * from dbo.sysobjects where name=''Common_restore''';
modlData.adoDtst_master.Active:=true;
if modlData.adoDtst_master.RecordCount = 0 then
begin
text := 'create procedure dbo.Common_restore @sDBName varchar(50) as declare @sql varchar(500),@spid int ';
text:= text + 'set @sql=''declare getspid cursor for select spid from sysprocesses where dbid=db_id('''''' + @sDBName + '''''')'' ';
text:= text + 'exec(@sql) open getspid fetch next from getspid into @spid while @@fetch_status <>-1 begin ';
text:= text + 'exec(''kill '' + @spid) fetch next from getspid into @spid end ';
text:= text + 'close getspid deallocate getspid ';
text:= text + 'set @sql = ''RESTORE DATABASE '' + @sDBName +'' from mydiskdump WITH NORECOVERY'' exec(@sql) ' ;
text:= text + 'set @sql = ''RESTORE LOG '' + @sDBName +'' from mydiskdumpLog'' exec(@sql) ' ; modlData.adoQuery_master.Close;
modlData.adoQuery_master.SQL.Clear;
modlData.adoQuery_master.SQL.Add(text);
modlData.adoQuery_master.ExecSQL;
end;
modlData.adoQuery_master.Close;
modlData.adoQuery_master.SQL.Clear;
modlData.adoQuery_master.SQL.Add('use master');
modlData.adoQuery_master.ExecSQL;
modlData.adoQuery_master.SQL.Clear;
modlData.adoQuery_master.SQL.Add('exec dbo.Common_restore ''veteran''');
modlData.adoQuery_master.ExecSQL; modlData.adoConn.Connected:=true; application.messagebox('恢复成功!','提示',mb_ok);
end;