PDA

Ver la Versión Completa : ¿Como Compacto Una Base de ACCESS?


Enan0
09-11-2004, 16:48:45
Hola amigos, estoy buscando ayuda de como compactar y reparar una base de Datos en Access, utilizo Delphi, y la verdad es que no tengo idea de como se hace, GRacias!!!!

taita
09-11-2004, 16:59:15
Hola Enan0:

Te pongo aqui este código que es el que yo utilizo para compactar mis bases de datos. Espero que te sirva.

function DatabaseCompact (const sdbName: WideString) : boolean;
var
JE : TJetEngine; //Jet Engine
sdbTemp : WideString; //TEMP database
sdbTempConn : WideString; //Connection string

const
SProvider = 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=';

begin
Result:=False;
sdbTemp := ExtractFileDir(sdbName) + 'TEMP' + ExtractFileName(sdbName);
sdbTempConn := SProvider + sdbtemp;
if FileExists(sdbTemp) then DeleteFile(sdbTemp);
JE:= TJetEngine.Create(Application);
try
try
JE.CompactDatabase(SProvider + sdbName, sdbTempConn);
DeleteFile(sdbName);
RenameFile(sdbTemp, sdbName);
except
on E:Exception do
ShowMessage(E.Message);
end;
finally
JE.FreeOnRelease;
Result:=True;
end;
end;

Para llamar a la función se utiliza esta linea:

DatabaseCompact('C:\directorio\base.mdb');

Espero que te sirva. Saludos!.

Neftali [Germán.Estévez]
09-11-2004, 17:21:03
Un añadido (que sino no funciona...):

1- debes añadir la unit JRO_TLB a la clausula USES.
2- La Base de Datos de ser de uso exclusivo cuando realices esta operación.
3- Si hay problemas con la unit JRO_TLB:
a) Desde el IDE ir a Project - Import Type Library.
b) Buscar en la lista "Microsoft Jet and Replication Objects 2.1 Library".
c) Install.
d) Recompilar.

Enan0
09-11-2004, 20:50:58
Cuando quiero complilar el JRO_TLB.pas me tira los siguientes errores, por lo que lei es que es un error del compilador del Delphi 6, segun las opciones que encontre es que lo haga en delphi 5 (cosa que no tengo y de la pag de borland no se puede bajar mas) o sino que modifique esos campos a mano (cosa que no se hacer :().

Si alguien los tiene compilados y andando.. no me los manda a

enanosoft@gmail.com


[Error] JRO_TLB.pas(594): Undeclared identifier: 'ActiveConnection'
[Error] JRO_TLB.pas(628): Cannot assign to a read-only property
[Error] JRO_TLB.pas(656): Cannot assign to a read-only property

Gracias

perrogrun
29-11-2004, 17:56:26
Yo estoy igual que tu.

No hay solución para delphi 6?

Neftali [Germán.Estévez]
30-11-2004, 10:32:32
Yo tengo w2k y Delphi 6 con Update pack 2.
He seguido los pasos (a) y (b), sólo que en micaso he encontrado "Microsoft Jet and Replication Objects 2.6 Library" en lugar de la 2.1 y luego "Create Unit" y me la ha importado y compilado sin nigun problema.

zerelho
06-12-2004, 23:47:56
Yo tambien andaba detras de lo de compactar una BD en Access y con el código que puso taita me fue a la primera, ahora lo que seria ya bordarla es saber si existe algun otro usuario o aplicación accediendo a la BD (lo digo por lo de tener que ser de uso exclusivo cuando se realiza la compactación).

Existe alguna manera de hacer esta comprobación?

taita
13-02-2005, 21:46:38
Hola a tod@s:
Pues me sumo a la consulta de zerelho. Resulta que estoy realizando una aplicación par experimentar un poco y me encuentro con el problema de que la base de datos ya se encuentra en uso por otro(s) usuario(s). Cómo podemos resolver esto? Trabajo con una bbdd de Access.

Lepe
14-02-2005, 09:37:49
Se supone que el mismo programa que compacta la base de datos, hace uso de las tablas, así que podemos intentar abrir la tabla primero:


try
table1.Close ; // si ya estuviera abierta
table1.exclusive := true;
try
table1.Open;
except:
on E: TDBEngineError do
begin
10253 : $280D : Table cannot be opened for exclusive use.
if TDBEngineError(E).Errors[0].Errorcode = 10253 then
ShowMessage('Quillo cierra la tabla');
end;
finally
table1.Close;
end;


¿Es viable?

zerelho
14-02-2005, 19:48:02
Bueno yo al final lo medio soluccioné, me desconecto de la BD e intento acceder al fichero access abriendolo en modo exclusivo y si me da error (dando por supuesto que el fichero existe) es que ya existe otro usuario o aplicación utilizando el fichero (la BD).

FUNCTION FicheroAbierto(NomFich:String):Boolean;
BEGIN
Try
With TFileStream.Create(NomFich, fmOpenRead or fmShareExclusive) Do Free;
Result := FALSE;
Except
Result := TRUE;
End;
END;

No se si existe otra forma mejor de hacerlo.

scotex
18-02-2005, 15:36:25
Espero k esto os sirva de ayuda, a mi me funciona perfectamente.

procedure TForm1.CompactaMDB(Sender: TObject);
var db: OleVariant;
PathDb: string;
begin
PathDb := 'C:\Prueba Compactar BBDD\Datos.mdb';
db := GetADOObject('JRO.JetEngine');
db.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + PathDb + ';Jet OLEDB:Database Password="";',
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + ExtractFilePath(PathDb) + 'Datos_new.mdb' +
';Jet OLEDB:Database Password=""' +
';Jet OLEDB:Engine Type=5'); // 4 se for Access 97
if not DeleteFile(PathDb) then
// file://Borrar bd antigua
begin
ShowMessage('Ocurrienron errores renombrando los archivos temporales!'
+ #13 + 'La operacion fue cancelada.');
DeleteFile(ExtractFilePath(PathDb) + 'nuevabd.mdb');
// file://Borrar archivos temporales
exit;
end;
RenameFile(ExtractFilePath(PathDb) + 'nuevaBD.mdb', PathDb);
//file://Renombra la bd compactada
DeleteFile(ExtractFilePath(PathDb) + 'nuevabd.mdb');
//file://Borrar archivos temporales
//*** Renombrar de nuevo la BD y ponerle el nombre original ***\\
RenameFile(ExtractFilePath(PathDb) + 'Datos_new.mdb', ExtractFilePath(PathDb) + 'Datos.mdb');
ShowMessage('Proceso Concluído con exito!');
{except
on e: Exception do
ShowMessage(E.Message);
end
finally
db := unassigned;
// file://Limpia variables de objetos
end;}
end;
function TForm1.GetADOObject(ADOClass: string): OLEVariant;
var o: OLEVariant;
begin
try
o := CreateOLEObject(ADOClass);
except on EOleException do
o := unassigned
end;
Result := o;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Mi_conexion.Connected := false; //AdoConection
Mi_Conexion.Close;
AdoTable1.Close;
CompactaMDB(sender); //llamamos al procedimiento
Mi_Conexion.Connected := true;
Mi_Conexion.Open;
AdoTable1.Open;
end;


Yo utilizo ADO, una conexion Ado y en las propiedades Connected esta a false, y en el OnCreate del Form abro la conexion y todas las tablas k necesiteis.

smessina
29-05-2006, 02:08:21
hola siento retrotraerlos al pasado, dada las fechas que figuran en los post
pero tengo delphi 7 y trabajo ado en un .mdb, en mi pc tengo instalado MsOffice 2003 y cuando hago ...

Un añadido (que sino no funciona...):

1- debes añadir la unit JRO_TLB a la clausula USES.
2- La Base de Datos de ser de uso exclusivo cuando realices esta operación.
3- Si hay problemas con la unit JRO_TLB:
a) Desde el IDE ir a Project - Import Type Library.
b) Buscar en la lista "Microsoft Jet and Replication Objects 2.1 Library".
c) Install.
d) Recompilar.
puntualmente el paso a y b no encuentro en la lista la libreria "Microsoft Jet and Replication Objects 2.1 Library".

sera el office 2003? alguna idea?

gracias por su tiempo

Neftali [Germán.Estévez]
29-05-2006, 10:47:51
puntualmente el paso a y b no encuentro en la lista la libreria "Microsoft Jet and Replication Objects 2.1 Library".

Para versiones posteriores de office deberías encontrar esa misma libreria, pero con versiones superiores; Yo en mi caso tengo la 2.5 y la 2.6.

smessina
29-05-2006, 14:56:12
gracias por contestar Neftali.

te cuento no me aparecia ningun "Microsoft Jet and Replication Objects" en la lista, asi que lo agregue del archivo MSJRO.dll; ahora si me aparece la version es la 2.6 creo.

el problema es que cuando utilizo ya sea los componentes que se me agregaron el la paleta activex .

me da un error de clase no registrada.

alguna idea?

gracias por tu tiepo

Neftali [Germán.Estévez]
29-05-2006, 16:45:12
me da un error de clase no registrada.

Regístrala.
Utiliza Regsvr32 (C:\WINNT\system32\Regsvr32.exe) y vuelve a probar.

reservahoy
10-01-2007, 00:51:57
Bueno despues de ver lo errores y analizar que el error da en la clase TReplica la cual no es usada al momento de compactar la base de datos he puesto en comentario las lineas que me daban error que era la de activeconnection y posteriormente dos properties mas de la clase treplica.

Me agregó los componentes a la paleta activex, copie el codigo de ejemplo, y ta taaaaaaannn funcionó con una tabla que tenia casi 500MB.

Probadlo, cualquier cosilla me podéis escribir.

Saludos,