数据库还原,高分求救!

guge 2005-05-18 10:02:14
dm.ADOCon.Connected:=false;
sqls:='use master restore database exam from disk='''+ss+''' with REPLACE ';
dm.DBSetQ.ConnectionString:=MainFrm.cons;
dm.DBSetQ.Close;
dm.DBSetQ.SQL.Clear;
dm.DBSetQ.SQL.Add(sqls);
dm.DBSetQ.ExecSQL;
语句能够执行,但执行的结果是数据库没任何改变。
在sql server的事件跟踪器中显示Reads,Writes项均比手工还原的数值小!
不知是何原因,请教各位有没遇到类似情形!
...全文
143 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
guge 2005-05-22
  • 打赏
  • 举报
回复
谢谢以上各位的热心回复,关键我的程序是能执行,并没报错,只是执行完了的结果是数据库并没有任何改变.不知是何原因!
advancejar 2005-05-20
  • 打赏
  • 举报
回复
在master里创建存储过程

create proc p_killspid
@dbname sysname--要关闭进程的数据库名
as
declare @s nvarchar(1000)
declare tb cursor local for
select s='kill '+cast(spid as varchar)
from master..sysprocesses
where dbid=db_id(@dbname)

open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
go

以上这个最重要,没有这个不可以换原的


procedure TForm23.Button2Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
adoquery1.SQL.Text:='use master;exec p_killspid mydatabase;Restore database madatabase From disk='''+opendialog1.FileName+''';Use mydatabase';
adoquery1.ExecSQL;
application.MessageBox('数据库完成恢复','警告',MB_OK);
end;
end;


我就是这么恢复的,绝对可行,不行的话大概是你哪个环节没处理好
fhuibo 2005-05-20
  • 打赏
  • 举报
回复
procedure TForm3.Button1Click(Sender: TObject);
var
Str: string;
begin
DataModule2.ADOConnection1.Connected := false;
ADOConn.Connected := False;
ADOConn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=SAILOR';
ADOConn.Open;
if edit1.Text <> '' then
begin
Str := 'restore database test from disk = '+ #39 + edit1.Text + #39 + ' with replace, '
+ 'move ' + #39 + 'test_data' + #39 + ' to ' + #39 + 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Data.MDF' + #39
+ ',move ' + #39 + 'test_log' + #39 + ' to ' + #39 + 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' + #39;
with Adoquery1 do
begin
close;
sql.Clear;
sql.Add('ALTER DATABASE test SET OFFLINE WITH ROLLBACK IMMEDIATE');
try
ExecSQL;
except

end;
close;
sql.Clear;
sql.Text := Str;
try
execsql;
application.MessageBox('成功','asdf',mb_ok+ mb_iconinformation);
except
application.MessageBox('错误','asdf',mb_ok+ mb_iconstop);
end;
close;
sql.Clear;
sql.Add('ALTER DATABASE test SET ONLINE WITH ROLLBACK IMMEDIATE');
try
ExecSQL;
except

end;
end;
end;
ADOConn.Connected := false;
DataModule2.ADOConnection1.Connected := True;
end;
naner_china 2005-05-20
  • 打赏
  • 举报
回复
/*
我也是这么写的
(还原过程中不能有任何程序访问数据库)
还原后强制退出软件,再登陆
如果没有其他程序访问数据库的话,一般能还原成功
*/
ExecuteSql('use master');
ExecuteSql(Format('RESTORE DATABASE %s FROM DISK =''%s'' with replace',[g_sDefaultdb,FileName]));

fmMain.bsSkinMessage1.MessageDlg('数据库恢复已完成,请重新启动程序!',mtInformation,[mbOK],0);
Application.Terminate;
Abort;
wlbfeihu 2005-05-20
  • 打赏
  • 举报
回复
转贴:
当我恢复时出错:
with query1 do
begin
close;
sql.Clear;
sql.Add(format('RESTORE DATABASE tushu FROM DISK=''%s''',[gn]));
execsql;

错误提示为:
因为数据库正在使用,未能获得数据库的排它访问权
请问该怎么做???
在查询分析器中运行
use master
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_killspid]
GO

create proc p_killspid
@dbname sysname--要关闭进程的数据库名
as
declare @s nvarchar(1000)
declare tb cursor local for
select s='kill '+cast(spid as varchar)
from master..sysprocesses
where dbid=db_id(@dbname)

open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
go

procedure TForm3.Button2Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
adoquery1.SQL.Text:='use master;exec p_killspid mydatabase;Restore database madatabase From disk='''+opendialog1.FileName+''';Use mydatabase';
adoquery1.ExecSQL;
application.MessageBox('数据库完成恢复','提示',MB_OK);
end;
end;
guge 2005-05-20
  • 打赏
  • 举报
回复
都几天了
怎么连个进来看一下的都没有啊!
guge 2005-05-18
  • 打赏
  • 举报
回复
其中的SS是还原的文件名!

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧