COMPACTAR BASE DE DATOS DAO

Erika
11 de Octubre del 2003
HOLA
No se de esto, pero alguien me puede decir como se compacta una base de datos usando dao y ado en tiempo de ejecución.Esque tengo una base de datos que usa imagenes, entonces de repente crece mucho pero al borrar los registros el espacio de la bd sigue igual no se libera espacio, alguien me puede ayudar porfavor?
Gracias

buyeya
11 de Octubre del 2003
hola espero que este código te sirva, en lo posible cuando puedas mejor empeza a usar ADO que esta mucho mejor.. aunque se que el cambio no es facil, suerte...

'la referencia a dao, me imagino que ya lo sabes..

Global ws as workspace
Global db as Database

Private Sub AbrirBase()

dim cadena as string

cadena = ";Database="

'con esto la abris desde donde quieras, hasta incluye un password,

cadena = cadena & app.path & "C:DataDataSys.mdb;PWD=Password_X"

set ws = Dbengine.Workspaces(0)
set db = ws.opendabase("",false,false,cadena)


end sub



Private Sub CerrarBase()

on error resume next

db.close
ws.close

if err.number <> 0 then err.clear

end sub

Private Sub Programa_Respaldar_Base_Click()

'en el form pones un commondialog


'primero tenés que cerrar la base.. lo mejor es desde alguna rutina aparte


Cerrar_Base

Dim Archive As String

On Error GoTo ControlError

Screen.MousePointer = vbHourglass

'para hacerlo más facil declaras unas variables para la ubicación de la base

Dim ArchivoAntiguo As String
Dim ArchivoNuevo As String

ArchivoAntiguo = "C:DataDataSys.mdb" 'el nombre y eso se lo das vos

'dlgArchivos es el nombre del control commondialog, pero le pones el nombre que quieras.

dlgArchivos.ShowSave

ArchivoNuevo = dlgArchivos.FileName

'Suprime el Archivo Nuevo si existe en el Directorio
Archive = Dir(ArchivoNuevo) 'Si existe lo devuelve
If Archive <> "" Then
Kill ArchivoNuevo
End If



DBEngine.CompactDatabase ArchivoAntiguo, ArchivoNuevo, , , ";pwd=password_X"

'password_X es en el caso de que uses contraseña, sino no te preocupes..

Abrir_Base

ControlError:

If Err.Number <> 0 Then
MsgBox "La operación no se realizó. " & _
"Revise que la base no está abierta.", vbExclamation, _
"Error al Compactar la base"
Else
MsgBox "Operación realizada con éxito"

End If
Screen.MousePointer = vbDefault

End Sub

Heber
11 de Octubre del 2003
Erika tiene razón en parte...
EL código que ella te envía funcionará, pero no mejor que el que te describiré.
Como la propia ayuda de Visual Studio te aclara, lo mejor es eliminar de raíz todos los datos innecesarios de la base de datos que tu tienes y eso se logra con un lento pero sumamente seguro programa, que tu debes elaborar, por el cual copias en una base de datos cuya estructura es idéntica (pero está vacía de datos) cada uno de los datos que deseas mantener de la base de datos que pretendes compactar.
Mas que un compactado, el método que el propio Microsoft aconseja es copiar una BDD en otra idéntica pero vacía. Tu actual problema se origina en cada nuevo registro que agregas, luego eliminas y en realidad el espacio que antes ocupaba en la base sigue allí ... ocupado pero de ceros.
Cuando trates de compactar bases de datos de 18 megabytes, como me ha sucedido, el método de compactar que viene con el motor DBEngine que describe Erika no funciona del todo bien, hay que repetirlo a veces. Por esa razón es que hay quienes opinan que ADO es mejor que DAO y ahí discrepo, porque DAO y ADO son totalmente eficientes, si aprendes los secretos para sacarles el mejor provecho. Si me mandas la estructura de la base de datos a mi correo, te diseño la rutina para compactar tu BDD. Yo la llamo DEFRAGMENTAR BDD, cuando pretendo engañar -en broma- a mis usuarios, que creen que estoy haciendo algo parecido al defragmentado del disco duro. Suerte.



Heber
11 de Octubre del 2003
En mi anterior mensaje, cuando hice referencia a Erika debí nombrar a buyeya. Perdoname Erika.
A tus órdenes