Текущий архив: 2005.10.23;
Скачать: CL | DM;
ВнизПроблемы с программным backup/restore Firebird Найти похожие ветки
← →
Андрей Жук © (2005-09-12 12:02) [0]Используются 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.
Хотя такой файл есть. Вероятно, файл еще занят процедурой создания бэкапа.
Что порекомендуете сделать?
← →
Андрей Жук © (2005-09-12 12:07) [1]Да, еще.
Если в процедуру создания бэкапа добавитьbegin
Logging("Information", GetNextLine);
Next;
end
То иногда (непостоянно)получаю ошибку "обрыв связи" (это на локальном коннекте).
← →
Андрей Жук © (2005-09-12 12:11) [2]Странно...
Поставил Application.ProcessMessages; в цикл получения инфы о бэкапе/ресторе - ошибки (пока) исчезли...
← →
Desdechado © (2005-09-12 12:25) [3]НЕ используй локальный коннект
он глюкавый
Страницы: 1 вся ветка
Текущий архив: 2005.10.23;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.103 c