Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ¿Como Compacto Una Base de ACCESS? (https://www.clubdelphi.com/foros/showthread.php?t=15914)

Enan0 09-11-2004 16:48:45

¿Como Compacto Una Base de ACCESS?
 
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.
Código Delphi [-]
  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:
Código Delphi [-]
  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

Siguientes Errores en Delphi 6
 
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

A la primera
 
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:

Código Delphi [-]
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

Una posible solucion
 
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).

Código Delphi [-]
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

Microsoft Jet and Replication Objects 2.1 Library"
 
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 ...
Cita:

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

Cita:

Empezado por smessina
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

instale MSJRO.dll
 
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

Cita:

Empezado por smessina
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

Lo he resuelto en Delphi 6
 
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,


La franja horaria es GMT +2. Ahora son las 03:02:04.

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