Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Compactar y reparar BD Access 2010 (https://www.clubdelphi.com/foros/showthread.php?t=84956)

radenf 04-01-2014 21:36:28

Compactar y reparar BD Access 2010
 
Hola amigos:

Necesito incluir en mi programa la capacidad de reparar y compactar la base de datos que utiliza, creada con Access 2010.
He revisado el foro y en la web, pero lo que he encontrado apunta a Access 2007 o anterior, por lo que no es posible utilizar la librería JRO_TLB ya que Office 2010 no la incorpora.
He utilizado el siguiente código que obtuve en la web, pero no funciona, no da error pero tampoco compacta la BD.

Código Delphi [-]
function CompactarBDAccess(DB: string) : boolean;
var
v: OLEvariant;
begin
Result:= True;
try
v := CreateOLEObject('JRO.JetEngine');
try
v.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DB,
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DB + 'x;Jet OLEDB:Engine type=5');
DeleteFile(DB);
RenameFile(DB + 'x', DB)
finally
v := Unassigned;
end;
except
Result:= False
end;
end;

y para llamarla utilizo:

Código Delphi [-]
CompactarBDAccess(ExtractFilePath(Application.ExeName) + 'Dicom Data\Base de Datos\Dicom_be.mdb');

¿Puede alguien orientarme al respecto?
Saludos y muchas gracias

radenf 07-01-2014 19:01:46

¿No hay sugerencias?

Saludos

nicolasjavier 23-06-2014 02:39:45

No encontraste la solución? Tengo el mismo problema :(

radenf 26-06-2014 23:35:34

Aún no he podido hacer que funcione.
Y como verás al parecer nadie sabe cómo.
Saludos

nicolasjavier 27-06-2014 23:40:07

El codigo que pusiste a mi me funcionó a la perfección!!

radenf 28-06-2014 14:36:54

Para Access 2010 a mí no me funciona, pero sí cuando utilizaba Access 2007.
Saludos

jplj 04-08-2014 19:48:27

Hola.

Probablemente será tarde, pero ¿has probado con el código propuesto por GerTorresM en este hilo ?

radenf 05-08-2014 02:15:39

Muchas gracias por responder jplj.
Ese código ya lo había probado y no me funciona en Win7.
Saludos

jplj 07-08-2014 09:16:40

Hola

He estado comprobando lo que comentabas de Windows 7 y te puedo decir que en mi caso el procedimiento ha funcionado correctamente con lo siguiente:

.- Windows 7 con Microsoft Office 2010 instalado.
.- "Programa" de pruebas hecho con Delphi 7 y componentes ADO

Las pruebas las he realizado con una base de datos Access 2003 -usando Provider=Microsoft.Jet.OLEDB.4.0 para realizar la prueba de conexión- y con otra de Access 2010 -usando Provider=Microsoft.ACE.OLEDB.12.0 para realizar la prueba de conexión- funcionando correctamente con ambas.


Comentar unas "cosillas" sobre el tema:

.- La base de datos será abierta en modo exclusivo por lo que no puede estar en uso por otro usuario o aplicación.
.- Debe haber espacio suficiente en el disco donde se realiza la compactación.
.- Si la base de datos no tiene contraseña, la función se llama sin los tres últimos parámetros

Código Delphi [-]
if APassword <> '' then
   DbEngine.CompactDataBase(ADataBaseName, ADataBaseName + '2', NULL, 0, ';pwd='+APassword)
else
   DbEngine.CompactDataBase(ADataBaseName, ADataBaseName + '2');

Cuando falla por alguno de los dos primeros motivos anteriores, el mensaje de error era algo así como "cadena de clase no válida", vamos que no aclara nada :)

Por otra parte imagino que deberás tener motivos, pero al usar las versión 2007-2010 hay que tener en cuenta que según nos dice Microsoft:

Cita:

Este formato admite las características más recientes como los campos multivalor, las macros de datos y la publicación en Servicios de Access ...
... el formato .accdb no admite replicación ni seguridad por usuarios.

Más información sobre Métodos de DBEngine (DAO).

radenf 07-08-2014 13:22:32

Muchas gracias jplj

La base de datos funciona perfectamente en mi programa, pero no puedo compactarla.
Al ejecutar el código propuesto por GerTorresM, con las modificaciones señaladas, me da el siguiente error:

Clase no registrada,ProgID:"Dao.DBEngine.120"

Yo utilizo Win7 64 bits. No sé si por ahí estará el problema, ya que según tengo entendido Win7 no trae el DAO.
Saludos

jplj 07-08-2014 13:41:43

Como te comentaba lo he probado con Win7, pero con el paquete Office 2010 instalado. ¿Tienes instalado ese paquete en el equipo?
El enlace que te he dejado sobre DAO está "ligado" a información sobre Office 2013, por lo que creo que es probable que venga con el paquete office.
Habría que ver si se puede obtener "suelto".

radenf 08-08-2014 00:26:22

Como señalé en un post anterior cuando usaba Access 2007 me funcionaba, pero cuando me cambié a Access 2010 dejó de hacerlo.
Saludos

adelbert 08-09-2014 20:55:00

Hola, estaba teniendo el mismo problema y después de leer varios foros inclusive este, pude encontrar en este blog una nota donde habla de esto y cómo solucionarlo, no puedo compartir la nota, pero si alguien tiene el mismo problema que me escriba

Enlace a la nota: Programas que te permitirán recuperar tus datos en Access

Casimiro Notevi 08-09-2014 21:23:01

Cita:

Empezado por adelbert (Mensaje 480927)
Hola, estaba teniendo el mismo problema y después de leer varios foros inclusive este, pude encontrar en este blog una nota donde habla de esto y cómo solucionarlo, no puedo compartir la nota, pero si alguien tiene el mismo problema que me escriba

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

ecfisa 08-09-2014 22:09:26

Hola adelbert.

Hazle caso a Casimiro, la guía de estilo es muy clara en ese punto:
Cita:

9. ¿Qué tengo que describir del problema?
...
No solicites que te respondan por correo en privado

Los problemas deben ser un proceso público y transparente, durante el cual un primer intento de respuesta puede y debería corregirse si alguien con más conocimientos percibe que la respuesta es incompleta o incorrecta. Además quién te responde obtiene parte de su recompensa al verse que son competentes y útiles a nuestra comunidad.

Cuando pides una respuesta privada, estás interrumpiendo tanto el proceso como la recompensa. No lo hagas.
Esto también se aplica a brindar respuestas por privado.

Si no podes colocar el enlace al artículo, avisa por pm a cualquier moderador y lo hará gustoso. Pero si no la podes compartir por que no es pública o tiene alguna restricción, no lo hagas.

Saludos :)


La franja horaria es GMT +2. Ahora son las 03:50:38.

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