COMPACTAR BASE DE DATOS DAO
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
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
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
'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
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.
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.