主题:我现在用Delphi+SQL恢复数据库时出问题,谁助?
Delphi浪子
[专家分:0] 发布于 2004-05-27 08:35:00
我在备份可以成功完成,但恢复的时候总是报错。我关闭了所有的数据控件,但还是不行,程序如下:(望大家指教,再线顾盼!)
procedure TFrmdataback.RecoverDataClick(Sender: TObject);
var DataPath: string;
begin
self.Caption := '正在恢复数据....';
adodm.hotelconn.Close;
adodm.hotelconn.Connected := false;
adodm.backconn.open;
adodm.backconn.Connected :=true;
OpenDialog1.Filter := '备份文件 (*.back)|*.back|所有文件 (*.*)|*.*'; //设置备份文件后缀
OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName) + '\backupdata';
//设置备份路径
if OpenDialog1.Execute then
DataPath := OpenDialog1.FileName;
if DataPath <> '' then
begin
if application.MessageBox('此操作将使上次备份以来的所有数据丢失,是否继续?', '恢复数据', MB_OKCANCEL) = idOK then
begin
a1.Active := true;
adodm.cback.CommandText := 'restore database hotel from disk=''' + DataPath + '''' + ' with replace'; //恢复数据命令语句
try
try
adodm.cback.Execute;
//执行恢复过程
MessageBox(0,' 恢复成功!','',MB_OK+MB_ICONINFORMATION);
except
showmessage('数据库正在被使用!请确定已关闭其它使用该数据库程序!');
MessageBox(0,'恢复失败!','',MB_OK+MB_ICONINFORMATION);
end;
finally
a1.Active := false;
try
// 打开各个数据表是否有错误
adodm.Tuser.Open;
adodm.Toprator.Open;
adodm.Trate.Open;
adodm.Troomset.Open;
adodm.Troomtype.Open;
adodm.Tcusbook.Open;
except
showmessage('程序运行发生不可预知错误,请重新启动程序!');
//结束该程序
Application.Terminate;
end;
end;
end;
end;
end;
回复列表 (共8个回复)
沙发
zhlwyy [专家分:3530] 发布于 2004-05-27 09:05:00
这是我的程序中用到的备份和还原!你参考下
unit BackUp_Form;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TFlatGaugeUnit, StdCtrls, TFlatEditUnit, ExtCtrls,FileCtrl;
type
TBackup_F = class(TForm)
Label1: TLabel;
Label2: TLabel;
ZT_FE: TFlatEdit;
JD_FG: TFlatGauge;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Backup_F: TBackup_F;
implementation
{$R *.dfm}
Uses
ExtIniFiles,StrUtils;
function GetFileNum(dir:string):integer;
var
sr:Tsearchrec;
begin
result:=0;
if findfirst(dir,faanyfile,sr)=0 then
repeat
if(sr.Attr<>fadirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
result:=result+1;
until findnext(sr)<>0;
end;
//***********************************************************************************
procedure Wait(second:Longint);
var
FirstTickCount:longint;
begin
FirstTickCount:=GetTickCount;
repeat
Application.ProcessMessages;
until ((GetTickCount-FirstTickCount) >=second);
end;
//***********************************************************************************
procedure TBackup_F.Timer1Timer(Sender: TObject);
var
myini:TExtIniFile;
cz,num:integer;
spath,dpath,name,RQ:string;
sr:Tsearchrec;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
Timer1.Enabled:=false;
myini:=TExtIniFile.Create(ExtractFilePath(Application.ExeName)+'set.ini');
cz:=myini.ReadInteger('bakup','CZ',0);
if cz=0 then
begin
spath:=ExtractFilePath(Application.ExeName)+'Data';
dpath:=myini.ReadString('bakup','BakPath','');
dpath:=dpath+'\'+AnsiReplaceStr(DateTimeToStr(now),':','');
ForceDirectories(dpath);
num:=GetFileNum(spath+'\*.*');
ZT_FE.Text:='正在备份数据库......';
JD_FG.MaxValue:=num;
if findfirst(spath+'\*.*',faanyfile,sr)=0 then
repeat
if(sr.Attr<>fadirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
begin
copyfile(pchar(spath+'\'+sr.Name),pchar(dpath+'\'+sr.Name),false);
JD_FG.Progress:=JD_FG.Progress+1;
end;
Wait(100);
until findnext(sr)<>0;
ZT_FE.Text:='数据库备份成功';
MessageBox(handle,'恭喜你:数据库备份成功!','祝贺你',MB_OK or MB_ICONINFORMATION);
end
else begin
RQ:=myini.ReadString('bakup','RQ','');
spath:=myini.ReadString('bakupdian',RQ,'');
spath:=spath+'\'+RQ;
dpath:=ExtractFilePath(Application.ExeName);
dpath:=dpath+'Data';
num:=GetFileNum(spath+'\*.*');
ZT_FE.Text:='正在还原数据库......';
JD_FG.MaxValue:=num;
if findfirst(spath+'\*.*',faanyfile,sr)=0 then
repeat
if(sr.Attr<>fadirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
begin
copyfile(pchar(spath+'\'+sr.Name),pchar(dpath+'\'+sr.Name),false);
JD_FG.Progress:=JD_FG.Progress+1;
end;
Wait(100);
until findnext(sr)<>0;
ZT_FE.Text:='数据库还原成功';
MessageBox(handle,'恭喜你:数据库还原成功!','祝贺你',MB_OK or MB_ICONINFORMATION);
end;
StartupInfo.cb:=sizeof(StartupInfo);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
CreateProcess(pchar(ExtractFilePath(Application.ExeName)+'TSGL.exe'),nil,nil,nil,false,0,nil,nil,StartupInfo,ProcessInfo);
close;
end;
end.
板凳
Delphi浪子 [专家分:0] 发布于 2004-05-27 09:07:00
谢谢海角天涯大哥。
3 楼
Delphi浪子 [专家分:0] 发布于 2004-05-27 09:13:00
您的程序太复杂,我是个初学者看不太懂。您可以帮我改改我的程序吗?
4 楼
yangxianyuan [专家分:110] 发布于 2004-05-27 12:30:00
以上的两种方法我想其实都可以完全数据库的备份与还原的!数据库的备份是很好实现的,相对来说数据库还原比较麻烦一些。因为你在还原的时候,首先要保证要还原的数据库已经没有被使用,否则会提示错误“数据库已被使用,未能取得它的排它权”
以上是小弟实践得出的结论! 现将自己的代码贴出来冲公!
Unit BackRestoreSQLDB;
{描述:SQL SERVER 2000 数据库备份与恢复单元 ,本单元函数在SQL SERVER 2000 +Delphi7.0编译通过
}
interface
uses
adodb,db;
function repl_substr(sub_old, sub_new, s: string): string; //把sub_old换成sub_new,后面有用。
function BackupSQLDataBase(connstr_sql,DatabaseName,Backup_FileName:string):Boolean;//数据库备份函数
//SQL数据数据库备份,connstr_sql是ADO控件的connectionstring,DatabaseName是数据库名称,
//Backup_FileName要备份到的目 标文件
function RestoreSQLDataBase(connstr_sql,DatabaseName,Restore_FileName:string):Boolean;//数据库恢复函数
//Restore_FileName以前备份的数据库文件,
implementation
function repl_substr(sub_old, sub_new, s: string): string;
var
i: integer;
begin
repeat
i := pos(sub_old, s);
if i > 0 then
begin
delete(s, i, Length(sub_old));
insert(sub_new, s, i);
end;
until i < 1;
Result := s;
end;
function BackupSQLDataBase(connstr_sql,DatabaseName,Backup_FileName:string):Boolean;
var
//备份SQL数据库SQL数据数据库备份,connstr_sql是ADO控件的connectionstring,DatabaseName是数据库名称,
//Backup_FileName要备份到的目标文件
aADOQuery:TADOQuery;
begin
try
aADOQuery:=TADOQuery.Create(nil);
aADOQuery.Close;
aADOQuery.ConnectionString:=connstr_sql;
aADOQuery.SQL.Clear;
aADOQuery.SQL.Add('backup database '+DatabaseName+' to disk = ' + '''' + Backup_FileName + ''' with format');
Try
aADOQuery.ExecSQL;
Result:=true;
Except
Result:=false;
exit;
end;
finally
aADOQuery.Free;
end;
end;
function RestoreSQLDataBase(connstr_sql,DatabaseName,Restore_FileName:string):Boolean;
var//数据库恢复函数,estore_FileName以前备份的数据库文件
aADOQuery:TADOQuery;
begin
try
aADOQuery:=TADOQuery.Create(nil);
aADOQuery.Close;//恢复数据库不能打开数据库,要打开系统数据库master,把连接字符串如adoconnetion的connectionstring中的数据库名称换成"master"数据库
aADOQuery.ConnectionString:=repl_substr(DatabaseName,'master',connstr_sql);
aADOQuery.SQL.Clear;
aADOQuery.SQL.Add('RESTORE DATABASE '+DatabaseName+' from disk = ' + '''' + Restore_FileName + '''');
Try
aADOQuery.ExecSQL;
Result:=true;
Except
Result:=false;
exit;
end;
finally
aADOQuery.Free;
end;
end;
end.
5 楼
7981148 [专家分:810] 发布于 2004-09-07 21:22:00
第四楼的楼主,我好好的看了你的程序,你的程序我调试过,好象还有一小点问题.你是不是可以把备份和恢复的顺序定一下,我写了,问题就没有了,谢谢!
6 楼
qq2008 [专家分:0] 发布于 2004-09-10 16:31:00
写个存储过程就行了
7 楼
qq2008 [专家分:0] 发布于 2004-09-10 16:31:00
写个存储过程就行了
8 楼
xzq98025 [专家分:0] 发布于 2007-03-23 00:15:00
Mark!!!
我来回复