Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

TIBValidationService

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: TIBValidationService Responder citando

Tras mucho trabajo no consigo hacer funcionar el componente de IBX (TIBValidationService) que quiero utilizar para reparar una base de datos corrupta.

Utilizo este Código:
Código:

void __fastcall TFrameCopiaSeg::BtnValidarClick(TObject *Sender)
{
   if(MessageDlgPos(
   "¡ Aviso !...\n"
   "Se procederá a Reorganizar los Índices, los Campos,\n"
   "las Tablas de la Base de Datos y a Limpiar el espacio\n"
   "no utilizado por la carga de transacciones.\n\n"
   "Ello es útil cuando existen problemas en la Base de Datos,\n"
   "posiblemente causadas por un fallo del Hardware del PC\n"
   "o TPV o un fallo producido por el Sistema Operativo.\n\n"
   "Solo ejecute esta opción si realmente tiene problemas\n"
   "de ejecución con la Base de Datos.\n\n"
   "¿Está seguro de querer continuar?",
   mtConfirmation, TMsgDlgButtons() << mbNo <<mbOK>Left + 290, frmVentas->Top + 300)== mrOk)
   {
      try // Codigo protegido
      {
         MDatos->IBDatabase->Close();
         AnsiString Ruta = FrameCopiaSeg->DirCopia->Directory + "\\TPV.IB";

         //Ruta a el fichero de copia de Seguriddad
         TIniFile *INI = new TIniFile(frmVentas->BtnCambioCamarero->Caption + "Barman.ini");
         AnsiString NombrePC = INI->ReadString("PC", "Nombre Servidor", NombrePC);

         if(!LMDGBBackup->Tag)
            MDatos->IBDValidServ->DatabaseName = INI->ReadString("PC", "Nombre Servidor", NombrePC) + ":" + Ruta;
         else
            MDatos->IBDValidServ->DatabaseName = INI->ReadString("PC", "Nombre Servidor", NombrePC) + ":" + INI->ReadString("PC", "Ruta Servidor","") + "\\TPV.IB";

         MDatos->IBDValidServ->ServerName = INI->ReadString("PC", "Nombre Servidor", NombrePC);


         delete INI;

         MDatos->IBDValidServ->Options << ValidateDB <<ValidateFull>Cursor = crHourGlass;

         MDatos->IBDValidServ->Active = true;
         MDatos->IBDValidServ->ServiceStart();

         MemoBackup->Clear();

         while(!MDatos->IBDValidServ->IsServiceRunning)
         { // Mientras se esté ejecutando.
            Sleep(10);*/
         }

         MDatos->IBDValidServ->Active = false;

         Screen->Cursor = crDefault;

         MessageDlgPos(
         "Reorganización y Limpieza realizada con éxito.\n\n"
         "Saldrá del programa, para que los cambios surjan efecto."
         ,mtInformation, TMsgDlgButtons() <<mbOK>Left + 515, frmVentas->Top + 85);

         MDatos->IBDatabase->Tag = 1;
         frmVentas->BtnEstado->Click();
         frmVentas->BtnSalirVentas->Click();
      }
      catch(...) // En caso de Error
         {
            Screen->Cursor = crDefault;
            MessageDlgPos("Ha habido un Error en el proceso.\n"
                     "Sus Datos aun no están Seguros.\n"
                     "Saldrá del Programa.\n\n"
                     "Error Número: (30)\n\n"
                     "Anote el Número de Error y\n"
                     "pongase en Contacto con su Servicio Técnico."
                     ,mtWarning, TMsgDlgButtons() <<mbOK>Left + 290, frmVentas->Top + 300);

            MDatos->IBDatabase->Tag = 1;
            frmVentas->BtnEstado->Click();
            frmVentas->BtnSalirVentas->Click();
         }
   }
}


Por favor necesito ayuda.

En internet he encontrado esto:

Cita:


IBValidationService
The IBValidationService lets you validate and repair a database. To use this component you need to set two additional properties as shown in the following code.

procedure TMainDm.SetIbValidateProperties;
begin
with IBValidate do
begin
SetCommonProperties(IBValidate);
DatabaseName := IbDbPath + IbDbName;
Options := [ValidateFull, ValidateDb];
end; //with
end;
DatabaseName must be set to the path to and name of the database file and Options must be set to the operations you want to perform as shown in the following table. Note that although Options is a set property not all combinations of options are valid. For example, MendDB must be used alone.

LimboTransactions Returns a list of limbo transactions.
CheckDB Used with ValidateDB to validate the database but not repair it.
IgnoreCheckSum Ignore checksum errors.
KillShadows Kill all unavailable shadow files.
MendDB Marks corrupt records unavailable so the database can be backed up.
SweepDB Sweep the database.
ValidateDB Validate the database page structure.
ValidateFull Validate record fragments.

Limbo transactions requires a bit more explanation. If you choose the LimboTransactions option a list of all transactions whose state is limbo will be returned in the LimboTransactionInfo property which is an array of TLimboTransactionInfo records. The LimboTransactionInfoCount property contains the number of records in the LimboTransactionInfo property. Using these properties you can loop through the LimboTransactionInfo array and access the information about each transaction. Since limbo transactions only occur if a transaction using two phase commit to update multiple databases fails most users will never need to be concerned about them. The OnClick event handler for the Validate database button is shown below.

procedure TMainForm.ValidateBtnClick(Sender: TObject);
begin
with MainDm.IBValidate do
begin
Active := True;
try
ShowWait;
ServiceStart;
while IsServiceRunning do Sleep(10);
ShowMessage('Validation complete.');
finally
Active := False;
ShowNormal;
end; //try
end; //with
end;

Setting the Active property to True attaches the component to the Interbase validation service and calling the ServiceStart method starts the validation operation. Once again while loop is used to call IsServiceRunning to pause the application until the validation operation has finished. Once the operation has finished Active is set to False.



Por favor es urgente, necesito reparar una base de datos.
Ayuda: Cesar, Leo
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Segun la documentación de Interbase, para realizar una operación como la que necesitas, es necesario usar una de las siguiente combinaciones

Cita:
1.- IgnoreChecksum con SweepDB
2.- ValidateDB
3.- ValidateFull con ValidateDB. (esta es la que tienes)


la que tienes es ValidateDB con ValidateFull, intenta con una de las anteriores y comentame el resultado.

Código:
MDatos->IBDValidServ->Options << ValidateDB <<ValidateFull>Cursor = crHourGlass


Verifica la pagina 287 de este enlace, para manipular las transacciones en el "limbo" pues a veces estas se quedan ahi y no son procesadas, puede que sea esto lo que este faltando en tu codigo.

Saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Cesar este es el Codigo que Utilizo y no me dá Error:
Código:

void __fastcall TFrameCopiaSeg::BtnValidarClick(TObject *Sender)
{
   if(MessageDlgPos(
   "¡ Aviso !...\n"
   "Se procederá a Reorganizar los Índices, los Campos,\n"
   "las Tablas de la Base de Datos y a Limpiar el espacio\n"
   "no utilizado por la carga de transacciones.\n\n"
   "Ello es útil cuando existen problemas en la Base de Datos,\n"
   "posiblemente causadas por un fallo del Hardware del PC\n"
   "o TPV o un fallo producido por el Sistema Operativo.\n\n"
   "Solo ejecute esta opción si realmente tiene problemas\n"
   "de ejecución con la Base de Datos.\n\n"
   "¿Está seguro de querer continuar?",
   mtConfirmation, TMsgDlgButtons() << mbNo <<mbOK>Left + 290, frmVentas->Top + 300)== mrOk)
   {
      try // Codigo protegido
      {
         MDatos->IBDatabase->Close();

         AnsiString Ruta = FrameCopiaSeg->DirCopia->Directory + "\\TPV.IB";

         //Ruta a el fichero de copia de Seguriddad
         TIniFile *INI = new TIniFile(frmVentas->BtnCambioCamarero->Caption + "Barman.ini");
         AnsiString NombrePC = INI->ReadString("PC", "Nombre Servidor", NombrePC);

         if(!LMDGBBackup->Tag)
            MDatos->IBDValidServ->DatabaseName = INI->ReadString("PC", "Nombre Servidor", NombrePC) + ":" + Ruta;
         else
            MDatos->IBDValidServ->DatabaseName = INI->ReadString("PC", "Nombre Servidor", NombrePC) + ":" + INI->ReadString("PC", "Ruta Servidor","") + "\\TPV.IB";

         MDatos->IBDValidServ->ServerName = INI->ReadString("PC", "Nombre Servidor", NombrePC);

         delete INI;

         MDatos->IBDValidServ->Options <<ValidateDB <<ValidateFull>Cursor = crHourGlass;

         MDatos->IBDValidServ->Active = true;
         MDatos->IBDValidServ->ServiceStart();

         MemoBackup->Clear();

         while(!MDatos->IBDValidServ->Eof)//while(MDatos->IBDValidServ->IsServiceRunning)
         { // Mientras se esté ejecutando.
            Sleep(10);
            MemoBackup->Lines->Add(MDatos->IBDValidServ->GetNextLine());
            MemoBackup->Lines->Add(MDatos->IBDValidServ->GetNextChunk());
         }

         MDatos->IBDValidServ->Active = false;

         Screen->Cursor = crDefault;

         MessageDlgPos(
         "Reorganización y Limpieza realizada con éxito.\n\n"
         "Saldrá del programa, para que los cambios surjan efecto."
         ,mtInformation, TMsgDlgButtons() <<mbOK>Left + 515, frmVentas->Top + 85);

         MDatos->IBDatabase->Tag = 1;
         frmVentas->BtnEstado->Click();
         frmVentas->BtnSalirVentas->Click();
      }
      catch(...) // En caso de Error
         {
            Screen->Cursor = crDefault;
            MessageDlgPos("Ha habido un Error en el proceso.\n"
                     "Sus Datos aun no están Seguros.\n"
                     "Saldrá del Programa.\n\n"
                     "Error Número: (30)\n\n"
                     "Anote el Número de Error y\n"
                     "pongase en Contacto con su Servicio Técnico."
                     ,mtWarning, TMsgDlgButtons() <<mbOK>Left + 290, frmVentas->Top + 300);

            MDatos->IBDatabase->Tag = 1;
            frmVentas->BtnEstado->Click();
            frmVentas->BtnSalirVentas->Click();
         }
   }
}

El unico problema es que no escribe nada en el Tmemo. Por Ejemplo si valido la base de datos desde el IBConsole me aparece una ventana con la información de la Validación como
"No database validation errors were found."
Sin esta información no sé lo que ha hecho la función.
Como puedo saber si ha encontrado Errores?
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.