Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problemas con TIBRestoreService (https://www.clubdelphi.com/foros/showthread.php?t=91411)

Angel.Matilla 31-01-2017 10:03:34

Problemas con TIBRestoreService
 
Tengo este código en BCB 6 para restaurar un BB.DD. hecha con FB 2.5:
Código:

try
{
    Query1->Transaction->Active = false;
    Afiliados->Connected        = false;
             
    IBRestoreService1->LoginPrompt = false;
    IBRestoreService1->Params->Add("user_name=sysdba");
    IBRestoreService1->Params->Add("password=masterkey");
    IBRestoreService1->DatabaseName->Add(Afiliados->DatabaseName);
    IBRestoreService1->BackupFile->Add(pItem->SubItems->Strings[2]);
    IBRestoreService1->Active = true;
    IBRestoreService1->ServiceStart();

    while (IBRestoreService1->IsServiceRunning)
          Memo1->Lines->Add(IBRestoreService1->GetNextLine());
}

__finally
{
    IBRestoreService1->Active  = false;
    Afiliados->Connected        = true;
    Query1->Transaction->Active = true;
}

La copia de seguridad a restaurar la elijo a partir de TListView en el que muestro las que hay guardadas. El problema aparece al comenzar a restaurarse el fichero, en cuanto se ejecuta por primera vez el while. Me da este error:

El error, al menos así lo interpreto, parece indicar que la base de datos está en uso ¡cuando acabo de cerrarla al inicio del proceso!

Casimiro Notevi 31-01-2017 10:26:27

¿Puede que esté siendo usada por otro programa, ibexpert, por ejemplo? ¿el propio bcb?

Neftali [Germán.Estévez] 31-01-2017 12:17:03

Debes tener una conexión abierta contra ese fichero en algún otro sitio (aplicación).

Angel.Matilla 31-01-2017 12:20:55

No, seguro. Las pruebas las estoy haciendo en local.

Casimiro Notevi 31-01-2017 12:46:11

Cita:

Empezado por Angel.Matilla (Mensaje 512798)
No, seguro. Las pruebas las estoy haciendo en local.

No tiene nada que ver.

Angel.Matilla 31-01-2017 12:50:45

Cita:

Empezado por Casimiro Notevi (Mensaje 512801)
No tiene nada que ver.

Me refería a que seguro que no hay nada más conectado a la base de datos. Al estar probando en local sé que está conectado o no.

Casimiro Notevi 31-01-2017 12:59:29

Prueba a darle un shutdown con gfix, y así te aseguras.

Angel.Matilla 31-01-2017 13:20:09

No se me ocurrió. Probaré.

Neftali [Germán.Estévez] 31-01-2017 15:13:50

Yo te iba a decir que justo antes de hacer la prueba reiniciaras el servicio. Si hubiera algo conectado, se desconectará.

Angel.Matilla 19-04-2023 13:08:37

Retomo este hilo porque no sé por qué está volviendo a fallar. Tengo este código:
Código:

GesInt->Connected = false;
ShellExecute(NULL, "open", AnsiString("C:\Program Files\Firebird\Firebird_2_5\bin\gfix.exe -force").c_str(), "", "", SW_HIDE);
Restore->LoginPrompt = false;
Restore->Params->Add("user_name=sysdba");
Restore->Params->Add("password=masterkey");
Restore->BackupFile->Add(cAux);
Restore->DatabaseName->Add(GesInt->DatabaseName);
Restore->Active = true;
Restore->ServiceStart();

while (Restore->IsServiceRunning)
    Memo1->Lines->Add(Restore->GetNextLine());

Restore->Active = false;
GesInt->Connected = true;

Otra vez me vuelve a dar el mensaje que la base de datos está en uso cuando se ejecuta por primera vez el bucle while y no tengo ni idea de por donde coger el error. El parámetro force de gfix lo he tomado de los mensajes de la propia herramienta:
Cita:

-force force database shutdown

Casimiro Notevi 19-04-2023 15:18:30

¿Recordaste hacer commit o rollback por si hay alguna transacción abierta?


Código Delphi [-]
if DB.defaultransaction.intransaction then
  ...

Angel.Matilla 19-04-2023 17:48:38

Cita:

Empezado por Casimiro Notevi (Mensaje 551208)
Código Delphi [-]
if DB.defaultransaction.intransaction then
  ...

Sí, de hecho antes de cerrar la base de datos antes hago esto:
Código:

if (fMenu->tGesInt->Active)
    fMenu->tGesInt->Commit();
if (fMenu->tAuxiliar->Active)
    fMenu->tAuxiliar->Commit();
fMenu->GesInt->CloseDataSets();


Casimiro Notevi 19-04-2023 19:53:36

Si estás restaurando una BD, supongo que no existe una BD con el mismo nombre.
En lugar de "Restore" usa "Create".
Aparte de eso, no me queda claro si estás teniendo problemas creando un backup o restaurando una backup.

Angel.Matilla 20-04-2023 09:47:28

Cita:

Empezado por Casimiro Notevi (Mensaje 551212)
Si estás restaurando una BD, supongo que no existe una BD con el mismo nombre.
En lugar de "Restore" usa "Create".
Aparte de eso, no me queda claro si estás teniendo problemas creando un backup o restaurando una backup.

Gracias por la respuesta. El problema lo tengo al restaurar un backup. La BB.DD. sí existe, pero imagina (me ha ocurrido a veces) que se corrompe alguna tabla): si hago el restore desde SQL Manager, aunque exista, me lo hace bien incluso usando el backup obtenido con la aplicación, y desde el programa antes también restauraba correctamente.

Angel.Matilla 20-04-2023 11:11:26

Cita:

Empezado por Angel.Matilla (Mensaje 551207)
Código:

while (Restore->IsServiceRunning)
    Memo1->Lines->Add(Restore->GetNextLine()); <<--- Aquí es donde da el error


Corrijo la información que di ayer. El error realmente lo da donde señalo.

Casimiro Notevi 20-04-2023 12:35:32

Si existe la BD entonces renómbrala antes de restaurar la nueva.
Seguramente ese Sql manager la borra antes de restaurar.

Angel.Matilla 21-04-2023 09:48:46

Cita:

Empezado por Casimiro Notevi (Mensaje 551222)
Si existe la BD entonces renómbrala antes de restaurar la nueva.
Seguramente ese Sql manager la borra antes de restaurar.

Haré la prueba y ya os diré. Gracias.

Angel.Matilla 21-04-2023 10:08:09

Cita:

Empezado por Casimiro Notevi (Mensaje 551222)
Si existe la BD entonces renómbrala antes de restaurar la nueva.
Seguramente ese Sql manager la borra antes de restaurar.

Efectivamente ese era el problema. Muchas gracias por iluminarme. ^\||/


La franja horaria es GMT +2. Ahora son las 13:43:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi