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 

Compactar base de datos Access

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Compactar base de datos Access Responder citando

Bueeeenas, hola a todos, vereis estoy terminando mi proyecto (tengo que entregarlo el viernes), y resulta que en la última revisión con el tutor se le ha ocurrido que podría compactar la base de datos desde mi programa (algo en lo que yo no había caído, para eso están los tutores, no?), en fin, al grano, resulta que he intentado compactar utilizando automatización OLE:
Código:

AnsiString BDdest = "Borrador"+BDlocal;
if (FileExists(BDdest))
{
if (DeleteFile(BDdest.c_str()))
ShowMessage("Destino Borrada");
}
if(CopyFile(BDlocal.c_str(), BDdest.c_str(),1))
ShowMessage("Copia");
else
ShowMessage("NO Copia");
if( DeleteFile(BDlocal.c_str()))
ShowMessage("origen borrada");

Variant AccessApp = CreateOleObject("Access.Application");
AccessApp.GetActiveObject("Access.Application");

// Abrimos la base de datos
WideString nombreBD = WideString(BDlocal); // DESTINO
WideString nombredest = WideString(BDdest); // ORIGEN

try{
// Una base de datos Access no se puede compactar si está abierta
AccessApp.OleFunction("CompactRepair", nombredest, nombreBD, false); //también he probado con true
}
catch(EOleSysError&)
{
MessageDlgX("No se pudo compactar la base de datos.", mtWarning,
TMsgDlgButtons() << mbOK, 0);
}
AccessApp.OleProcedure("Quit");



Lo de hacer una copia de la base de datos y borrar la original es porque no me dejaba compactar si origen y destino del método CompactRepair son el mismo archivo. El caso, es que en algún momento he logrado que compacte, pero a fuerza de seguir haciendo cambios para mejorarlo ha dejado de funcionar, y no consigo que vuelva a hacerlo.
Me sale un EOleSysError (que es el que capturo con el catch), pero creo que el número de parámetros es correcto, y por lo menos sé que ese método existe.

Alguien puede revisarme el código?? o decirme como puedo hacerlo, porque también he encontrado que en Visual Basic se puede hacer con la conexión ADO y con Microsoft Jet and Replication
Object, utilizando CompactDatabase.... podeis iluminar mi camino???

Muchas gracias por todo!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Os lo pongo como código para que quede un poco más claro:
Código:

AnsiString BDdest = "Borrador"+BDlocal;
if (FileExists(BDdest))
{
    if (DeleteFile(BDdest.c_str()))
        ShowMessage("Destino Borrada");
}
if(CopyFile(BDlocal.c_str(), BDdest.c_str(),1))
       ShowMessage("Copia");
else
       ShowMessage("NO Copia");

if( DeleteFile(BDlocal.c_str()))
      ShowMessage("origen borrada");

Variant AccessApp = CreateOleObject("Access.Application");
AccessApp.GetActiveObject("Access.Application");

// Abrimos la base de datos
WideString nombreBD = WideString(BDlocal); // DESTINO
WideString nombredest = WideString(BDdest); // ORIGEN

try{
// Una base de datos Access no se puede compactar si está abierta
    AccessApp.OleFunction("CompactRepair", nombredest, nombreBD, false); //también he probado con true
} 
catch(EOleSysError&)
{
    MessageDlgX("No se pudo compactar la base de datos.", mtWarning,
        TMsgDlgButtons() << mbOK, 0);
}
AccessApp.OleProcedure("Quit");
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola shackletta, y perdona que te escriba aquí. No es para responder si no para preguntar. ¿Cómo te conectas a una base de datos Access? Tengo C++Builder 4 y cuando uso los componentes TTable y esos no hace más que pedirme el usuario y el password y no sé qué hacer para quitarlos. ¡Sólo quiero conectarme a la base de datos local!
Un saludo y perdona.
_________________
Nunca digas "Es imposible" sin intentarlo antes.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Bueno, estás perdonado, lo que pasa es que yo me conecto con componentes ADO que creo que en Builder 4 no están disponibles.
Así que creo que no te puedo ayudar, de todas maneras al principio de mi proyecto intenté conectarme con ODBC a la base de datos, y también me pedía el pwd, pero creo conseguí quitarlo... no sé, no recuerdo lo que hice, hace ya varios meses... es que lo recuerdo todo muy vagamente...

En fin, lo siento, y por cierto en el foro aparece varias veces, pero ¿has leído la cara oculta de C++ builder de Ian Marteens?, ahí viene algo que te podrá ayudar

Un saludo y suerte.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Compactar BD Access... Funciona Responder citando

Con este código compactas la BD 1.mdb en una copia 2.mdb

Código:

  AnsiString paths, pathd;

  paths= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\1.mdb";
  pathd= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\2.mdb";

  Variant AccessApp;
  AccessApp = CreateOleObject("JRO.JetEngine");
  AccessApp.OleFunction("CompactDatabase", paths.c_str(), pathd.c_str()) ;



Completa el código a tu acomodo.

Slds

Andrés
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.