Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-11-2004
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
Question ¿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!!!!
Responder Con Cita
  #2  
Antiguo 09-11-2004
Avatar de taita
taita taita is offline
Miembro
 
Registrado: sep 2003
Ubicación: Murcia, San Pedro del Pinatar
Posts: 115
Poder: 21
taita Va por buen camino
Post

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!.
__________________
No sabiendo que era imposible... él fue... y lo hizo!!!
En fase de construcción: LoBusco.com más .com que nunca!

Última edición por taita fecha: 09-11-2004 a las 17:02:22.
Responder Con Cita
  #3  
Antiguo 09-11-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Post

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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 09-11-2004
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 29-11-2004
perrogrun perrogrun is offline
Miembro
 
Registrado: ene 2004
Ubicación: Fuengirola
Posts: 41
Poder: 0
perrogrun Va por buen camino
Yo estoy igual que tu.

No hay solución para delphi 6?
Responder Con Cita
  #6  
Antiguo 30-11-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 06-12-2004
zerelho zerelho is offline
Miembro
 
Registrado: mar 2004
Posts: 28
Poder: 0
zerelho Va por buen camino
Thumbs up 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?
Responder Con Cita
  #8  
Antiguo 13-02-2005
Avatar de taita
taita taita is offline
Miembro
 
Registrado: sep 2003
Ubicación: Murcia, San Pedro del Pinatar
Posts: 115
Poder: 21
taita Va por buen camino
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.
__________________
No sabiendo que era imposible... él fue... y lo hizo!!!
En fase de construcción: LoBusco.com más .com que nunca!
Responder Con Cita
  #9  
Antiguo 14-02-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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?
Responder Con Cita
  #10  
Antiguo 14-02-2005
zerelho zerelho is offline
Miembro
 
Registrado: mar 2004
Posts: 28
Poder: 0
zerelho Va por buen camino
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.

Última edición por zerelho fecha: 15-02-2005 a las 20:19:54.
Responder Con Cita
  #11  
Antiguo 18-02-2005
scotex scotex is offline
Miembro
 
Registrado: feb 2005
Posts: 19
Poder: 0
scotex Va por buen camino
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 OLEDBatabase Password="";',
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + ExtractFilePath(PathDb) + 'Datos_new.mdb' +
';Jet OLEDBatabase 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.
Responder Con Cita
  #12  
Antiguo 29-05-2006
smessina smessina is offline
Miembro
 
Registrado: ene 2006
Posts: 51
Poder: 19
smessina Va por buen camino
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

Responder Con Cita
  #13  
Antiguo 29-05-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #14  
Antiguo 29-05-2006
smessina smessina is offline
Miembro
 
Registrado: ene 2006
Posts: 51
Poder: 19
smessina Va por buen camino
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
Responder Con Cita
  #15  
Antiguo 29-05-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #16  
Antiguo 10-01-2007
reservahoy reservahoy is offline
Registrado
 
Registrado: ene 2007
Posts: 1
Poder: 0
reservahoy Va por buen camino
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,
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:01:06.


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
Copyright 1996-2007 Club Delphi