![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с программным backup/restore Firebird
Андрей Жук © (2005-09-12 12:02:00)Используются IBX. Но бэкап/рестор в FIB аналогичен.
Процедура создания бэкапа
procedure TFormMain.DoBackup(FileName: TFileName; AlertOnExit: boolean = true);
var
USER_NAME, PASSWORD: string;
begin
USER_NAME := DataModuleMain.DBMain.Params.Values['user_name'];
PASSWORD := DataModuleMain.DBMain.Params.Values['password'];
with DataModuleMain.IBBackup do
begin
DatabaseName := DataModuleMain.DBMain.DatabaseName;
Params.Clear;
Params.Add('user_name=' + USER_NAME);
Params.Add('password=' + PASSWORD);
BackupFile.Clear;
BackupFile.Add(FileName);
Attach;
ServiceStart;
Detach;
if AlertOnExit then
InformationMsg('Базу збережено', 'Файл збережено в ' + FileName);
end;
end;
Процедура восстановления базы
function TFormMain.DoRestore(FileName: TFileName; DBName: string; ReplaceCurrent: boolean; AlertOnExit: boolean = true): string;
var
USER_NAME, PASSWORD: string;
begin
USER_NAME := DataModuleMain.DBMain.Params.Values['user_name'];
PASSWORD := DataModuleMain.DBMain.Params.Values['password'];
with DataModuleMain.IBRestore do
begin
if ReplaceCurrent then
begin
DataModuleMain.DBMain.Connected := false;
Options := Options + [Replace] - [CreateNewDB];
end
else
Options := Options - [Replace] + [CreateNewDB];
DatabaseName.Clear;
DatabaseName.Add(DBName + '=2048');
Params.Clear;
Params.Add('user_name=' + USER_NAME);
Params.Add('password=' + PASSWORD);
BackupFile.Clear;
BackupFile.Add(FileName);
Attach;
ServiceStart;
while not Eof do
begin
Logging('Information', GetNextLine);
Next;
end;
Detach;
Result := DBName;
if AlertOnExit then
InformationMsg('Базу відновлено', 'Файл збережено в ' + DBName);
if ReplaceCurrent then
DataModuleMain.DBMain.Connected := true;
end;
end;
Вызов в программе (сначала backup, потом restore - делаем новую базу для записи на флешку)
procedure TFormMain.ToolButtonRestoreFlashClick(Sender: TObject);
var
FName, FRName: TFileName;
TempPath, SavePointName: string;
R: Cardinal;
procedure MakeChanges(str: string);
begin
with DataModuleMain.IBSQL do
begin
SQL.Clear;
SQL.Add(str);
ExecQuery;
Transaction.Commit;
Transaction.Active := true;
end;
end;
begin
R := GetTempPath(0, nil);
SetLength(TempPath, R);
GetTempPath(R, PChar(TempPath));
FName := ExtractFilePath(TempPath) + FormatDateTime('ddmmhhnn', now) + '.fbk';
FRName := ExtractFilePath(TempPath) + FormatDateTime('ddmmhhnn', now) + '.fdb';
if InputQuery('Введіть назву точки збереження', 'Savepoint', SavePointName) then
begin
MakeChanges(Format('EXECUTE PROCEDURE APP_SAVEPOINTS_IU (''%s'',''Y'')', [SavePointName]));
MakeChanges('SELECT gen_id(GEN_FILIAL_COUNTER,1) from rdb$database');
DoBackup(FName, false);
MakeChanges(Format('UPDATE APP_SAVEPOINTS SET IS_ACTIVE=''N'' WHERE SAVEPOINT_NAME=''%s''', [SavePointName]));
end;
if FileExists(FName) then
DoRestore(FName, FRName, false, false);
end;
И вот на восстановлении получаем
cannot open backup file C:\DOCUME~1\zhouck\LOCALS~1\Temp\12091056.fbk.
Хотя такой файл есть. Вероятно, файл еще занят процедурой создания бэкапа.
Что порекомендуете сделать?
Desdechado (2005-09-12 12:25:00) [1]НЕ используй локальный коннект
он глюкавый
Андрей Жук (2005-09-12 12:11:00) [2]Странно...
Поставил Application.ProcessMessages; в цикл получения инфы о бэкапе/ресторе - ошибки (пока) исчезли...
Андрей Жук (2005-09-12 12:07:00) [3]Да, еще.
Если в процедуру создания бэкапа добавить
begin
Logging('Information', GetNextLine);
Next;
end
То иногда (непостоянно)получаю ошибку "обрыв связи" (это на локальном коннекте).