database ms-access corruption database-integrity

database - ¿Cómo arreglar la posible corrupción de db?



ms-access corruption (5)

¿Has probado la herramienta integrada de reparación / reparación de Access? Esto debería eliminar los registros eliminados de la base de datos.

La ubicación exacta varía de acuerdo con la versión de Access que está ejecutando, pero en Access 2003 está en Herramientas> Utilidades de la base de datos> Compactar y reparar la base de datos. Algunas versiones anteriores de Access tenían dos herramientas separadas, una para compactos, otra para reparación, pero se accedía desde una ubicación similar. Si están separados en la versión que tiene el cliente, debe ejecutar ambos.

Esta debería ser una operación no destructiva, pero sería mejor probar esto en una copia del archivo MDB (disculpas por decir lo obvio).

Estoy en un cliente haciendo algunas correcciones rápidas a su aplicación de acceso. Pasó un tiempo con acceso, pero me estoy recuperando rápidamente. Sin embargo, descubrí un problema interesante:

Para algunos informes, aparece el error "Se eliminó el registro". Revisé los informes y parece que hay un problema con una sola tabla. Al abrir esa tabla, encuentro un registro donde todas las columnas están marcadas como "#deleted". Entonces, obviamente, esta disputa parece ser la culpable. Sin embargo, cuando intento eliminar esa fila, nada sucede realmente. Si vuelvo a abrir la tabla, la fila aún existe.

¿Hay corrupción en el db? ¿Cómo puedo eliminar este registro para siempre?

Editar: es una versión MS2000

Solución: Simplemente comprimir / reparar no funcionó. En su lugar, convertí la base de datos al formato de archivo 2003, lo que funcionó. Marqué la primera respuesta que sugiere comprimir / reparar, ya que me indicó la dirección correcta. ¡Gracias!


Además de las opciones ya publicadas anteriormente, también he usado otro método simple: simplemente cree un nuevo archivo MDB e importe todos los objetos del corrupto. No te olvides de obtener el sistema y / u objetos ocultos cuando vayas por este camino.


Tony Toews, Access MVP, tiene una guía completa sobre corrupción:

Preguntas frecuentes sobre los MDB corruptos de Microsoft Access

  • Algunos síntomas de corrupción
  • Determinar la estación de trabajo que causó la corrupción
  • La corrupción causa
  • Para recuperar sus datos

Como un aparte, decompilar es muy útil para resolver sucesos extraños al codificar y para mejorar los tiempos de puesta en marcha.



Compactar e importar no solucionará el problema del error informado, que es claramente un puntero corrupto para un campo memo. Lo único que puede hacer es eliminar y volver a crear el registro que está causando el problema. Y necesita encontrar formas de editar datos de notas (o eliminar campos de notas, ¿realmente necesita más de 255 caracteres o no?) Que no lo expongan al riesgo de corrupción. Eso significa evitar controles encuadernados en formularios para campos memo.

En su lugar, utilice un cuadro de texto independiente, y en el evento OnCurrent del formulario, asigne los datos actuales desde el origen de registro subyacente del formulario:

Me!txtMyMemo = Me!MyMemo

Para guardar ediciones en el control independiente, use el evento AfterUpdate del control:

Me!MyMemo = Me!txtMyMemo Me.Dirty = False '' save the whole record

¿Por qué los campos memo están sujetos a corrupción? Debido a que no están almacenados en la misma página de datos que los campos que no son memorables, todo lo que está en la página de datos principal de la grabación es un puntero a alguna otra página de datos (o conjunto de páginas de datos si es una gran parte de datos) donde se almacenan los datos de memo reales. Si no se hiciera de esta manera, un registro con una nota muy pronto excedería la longitud máxima de registro.

El puntero se corrompe con relativa facilidad, con mayor frecuencia por un problema fatal durante la edición en un control dependiente. Editar con un control independiente no elimina el problema por completo, pero significa que el tiempo en el que está expuesto al peligro es muy, muy corto (es decir, el tiempo que tardan esas dos líneas de código en ejecutarse en el evento AfterUpdate) .