在delphi中队坏库进行备份,会失败,但是失败后关闭TIBBackupService,依然无法断开与数据库文件的联系,致使无法对数据库进行修复工作,请问是什么原因,该如何解决?
解决方案 »
- 请问,该图是用什么控件做的?
- C#调用delphi编写的DLL参数是结构体
- 有兴趣做游戏外挂的看一下。
- 请问delphi如何打印连续纸发票??????????????????????
- 在DBGridEh1中是不是不能显示图象字段和备注字段?
- 求救,在delphi中如何把word文档(EXCEL)保存到sql server数据库?
- 有谁会用ACT 75X磁条刷卡机
- 在DELPHI中如何将*.SQL的脚本(是存储过程的脚本)运行到数据库中?
- 高分请教大家一个Windows消息机制的问题,请进。。。
- Kingron,你的那个思路有局限性
- delphi编程把SQL server数据库的库存数量更新到淘宝的网店上
- 请教一下delphi记录指针的问题
begin
with IBBackupService1 do
begin
ServerName := 'Poulet ';
LoginPrompt := False;
Params.Add( 'user_name=sysdba ');
Params.Add( 'password=masterkey ');
Active := True;
try
Verbose := True;
Options := [NonTransportable, IgnoreLimbo];
DatabaseName := 'c:\interbase\examples\database\employee.gdb ';
BackupFile.Add( 'c:\temp\employee1.gbk '); ServiceStart;
While not Eof do
Memo1.Lines.Add(GetNextLine);
finally
Active := False;
end;
end; end; To back up a database to multiple files: procedure TForm1.Button2Click(Sender: TObject);
begin
with IBBackupService1 do
begin
ServerName := 'Poulet ';
LoginPrompt := False;
Params.Add( 'user_name=sysdba ');
Params.Add( 'password=masterkey ');
Active := True;
try
Verbose := True;
Options := [MetadataOnly, NoGarbageCollection];
DatabaseName := 'c:\interbase\examples\database\employee.gdb ';
BackupFile.Add( 'c:\temp\e1.gbk = 2048 ');
BackupFile.Add( 'c:\temp\e2.gbk ' = 4096);
BackupFile.Add( 'c:\temp\e3.gbk '); ServiceStart;
While not Eof do
Memo1.Lines.Add(GetNextLine);
finally
Active := False;
end;
end;
end;
begin
with SqlCommand do
begin
CommandText:='use Master';//
Execute;
ClearMSSQLUser(DBname);
CommandText:='execute sp_helpdevice';//系統存儲過程
Execute;
CommandText:='Restore database '+DBname+' From disk='''+SoureName+''' with replace';
Execute;
end;
end;//DBname 備份庫名稱 //SoureName 那個盤
Procedure BakUpdatebameOk(BkDBname,MDFileStr : String);
begin
with SqlCommand do
begin
CommandText:='use Master';
Execute;
CommandText:='execute sp_helpdevice';//系統存儲過程
Execute;
CommandText:='backup database '+BkDBname+' to disk='''+MDFileStr+''' with init';
Execute;
CommandText:='Use '+BkDBname;
Execute;
end;
end;
procedure ClearMSSQLUser(DBname : String);
var
SelectQuery : TAdoQuery;
ClearProUser : TAdoQuery;
begin
try
SelectQuery :=TAdoQuery.Create(nil);
ClearProUser:=TAdoQuery.Create(nil);
SelectQuery.Connection :=SqlConnection;
ClearProUser.Connection:=SqlConnection;
SelectQuery.SQL.Clear;
ClearProUser.SQL.Clear;
SelectQuery.SQL.Add('select * from dbo.sysobjects where '+
'id = object_id(N''[dbo].[p_killspid]'') and OBJECTPROPERTY(id, N''IsProcedure'') = 1');
SelectQuery.Open;
if SelectQuery.Eof then
begin
SqlCommand.CommandText:='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';
SqlCommand.Execute;
end;
SqlCommand.CommandText:='exec p_killspid '''+DBname+'''';
SqlCommand.Execute;
finally
freeandnil(SelectQuery);
freeandnil(ClearProUser);
end;
end;
会不会是InterBase自身的原因
我一般的做法就是直接用代碼,不用控件;你帶加上一個進度條來顯示備份進度實在找不到原因,你就追蹤一下代碼,設置一個斷點看一下,是不是finally時確實close成功了...
procedure Tsys_datamodule.DataBaseBack;
var
FileName:string;
ADOQ:TADOQuery;
begin
ADOQ:=TADOQuery.Create(nil);
ADOQ.Connection:=sys_datamodule.con1;
if MessageDlg('你確定要備份數據庫嗎?',mtInformation,[mbYes,mbNo],0)=idyes then
begin
try
if SaveDialog1.Execute then
begin
FileName:=SaveDialog1.FileName;
if (Copy(FileName,Length(FileName)-3,4)<>'.BAK') or (Copy(FileName,Length(FileName)-3,4)<>'.bak') then
FileName:=FileName+'.BAK';
ADOQ.SQL.Text:='Use Master Backup Database MES to Disk='''+ FileName+''' Use MES';
ADOQ.ExecSQL;
MessageDlg('數據庫備份成功!',mtInformation,[mbOK],0);
end;
except
MessageDlg('數據庫備份失敗!',mtInformation,[mbOK],0);
Exit;
end;
end;
end;procedure Tsys_datamodule.RestoreBaseBack;
var
StrFile:string;
ADOQ:TADOQuery;
begin
ADOQ:=TADOQuery.Create(nil);
ADOQ.Connection:=sys_datamodule.con1;
if MessageDlg('你確定要還原數據庫嗎?',mtInformation,[mbYes,mbNo],0)=idyes then
begin
try
if OpenDialog1.Execute then
begin
StrFile:=OpenDialog1.FileName;
ADOQ.SQL.Text:='Use Master Restore Database MES From Disk='''+ StrFile+''' Use MES';
ADOQ.ExecSQL;
MessageDlg('數據庫還原成功!',mtInformation,[mbOK],0);
end;
except
MessageDlg('數據庫還原失敗!',mtInformation,[mbOK],0);
Exit;
end;
end;
end;
它本身的备份操作没有任何错误,firebird数据库已经有了很好的备份方式,我觉得单纯的copy不是很理想