Hallo,
zu diesem Thema gibt es zwar schon einen Tread, aber der ist so alt, dass ich die Frage nocheinmal neu aufbringe.
Ich nutze folgenden Code, um ein Backup einzuspielen:
Delphi-Quellcode:
procedure TMainForm.Backupeinspielen1Click(Sender: TObject);
var
server:
string;
posi: Integer;
begin
server := DatMod.DM.DBPost32.DatabaseName;
posi := Pos('
:',server);
server := Copy(DatMod.DM.DBPost32.DatabaseName, 1, posi -1);
pFIBRS.ServerName := server;
pFIBRS.DatabaseName.Clear;
pFIBRS.DatabaseName.Add(Copy(DatMod.DM.DBPost32.DatabaseName, posi+1,
length(DatMod.DM.DBPost32.DatabaseName)-posi));
pFIBRS.BackupFile.Clear;
if iniSavePath = '
'
then
OpenDlg.InitialDir := ExtractFileDir(pFIBBU.DatabaseName)
else
OpenDlg.InitialDir := iniSavePath;
// OpenDlg.FileName := 'Post32Backup_'+DateToStr(Today);
if OpenDlg.Execute
then
begin
// ShowMessage(SaveDlg.FileName);
try
pFIBRS.BackupFile.Add(OpenDlg.FileName);
pFIBRS.Params.Clear;
pFIBRS.Params.Add('
password=masterkey');
pFIBRS.Params.Add('
user_name=SYSDBA');
DatMod.DM.DBPost32.Close;
// << hier schließe ich die einzige Verbindung zur Datenbank
pFIBRS.Attach;
SB.Panels[0].Text := '
Bitte warten, Backup wird zurückgespielt.';
SB.Update;
pFIBRS.ServiceStart;
while pFIBRS.IsServiceRunning
do
begin
Application.ProcessMessages;
Sleep(1000);
end;
SB.Panels[0].Text := '
';
SB.Update;
// ShowMessage('Backup erstellt.');
ShowMessage('
Backup eingespielt. Programm neu starten!');
except on E:
Exception do
begin
ShowMessage('
Backup konnte nicht eingespielet werden.'+#10#13+
E.
Message);
SB.Panels[0].Text := '
Fehler beim Backup einspielen. Programm neu starten';
end;
end;
Close;
end;
end;
An der markierten Stelle schließe ich die Datenbank, bevor ich mit dem Restore beginne.
Anschließend kommt die Fehlermeldung, dass die
DB nicht gedropt werden kann, weil sie möglicherweise in Benutzung ist.
---------------------------
...
---------------------------
Backup konnte nicht eingespielet werden.
MainForm.pFIBRS:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Could not drop database G:\Daten\DBs\POST32.FDB (database might be in use).
---------------------------
Öffne ich dann IBExpert und versuche es dort, bekomme ich dieselbe Meldung.
Bestätige ich die Fehlermeldung in meinem Programm, schließt es sich. Dann kann ich über IBExpert ein Restore vornehmen.
Das heißt wohl, dass mein Programm beim Start des Restore noch immer die
DB nutzt. Wie kann ich die Datenbank so schließen, dass ein Restore möglich ist?
OK
---------------------------