Como corrigir a possível corrupção de db?
-
05-07-2019 - |
Pergunta
Eu estou em um cliente fazendo algumas correções rápidas para o seu aplicativo de acesso. Foi um tempo eu tinha um ir com o acesso, mas estou me recuperando rapidamente. No entanto, eu descobri um problema interessante:
Para alguns relatórios, recebo um erro "O registro é excluído". Eu verifiquei os relatórios, e parece que há um problema com uma tabela. Ao abrir essa mesa, eu encontrar um registro onde todas as colunas são marcadas "# eliminado". Então, obviamente, esta linha parece ser o culpado. No entanto, quando eu tento excluir essa linha, nada realmente acontece. Se eu voltar a abrir a tabela, a linha ainda existe.
Existe uma corrupção no db? Como posso remover este registro para o bem?
Editar: É um MS2000-version
Solução: Simplesmente compressa / reparação não funcionou. I converteu o banco de dados para o formato de arquivo 2003 em vez, que fez o truque. Eu marquei a primeira resposta sugerindo compressa / reparação, uma vez que me apontou na direção certa. Obrigado!
Solução
Você já tentou a ferramenta construída em / reparação compacto Access? Isto deve liberar registros excluídos do banco de dados.
A localização exata varia de acordo com a versão do Access que você está executando, mas no Access 2003 é em Ferramentas> Banco de Dados Utilitários> Compact e banco de dados de reparação. Algumas versões anteriores do Access tinha duas ferramentas separadas - uma para compacta, um para reparação - mas eles foram acessados ??a partir de um local similar. Se eles são separados na versão o cliente tem, você precisa executar ambos.
Esta deve ser uma operação não-destrutiva, mas seria melhor testar isso em uma cópia do arquivo MDB (desculpas por afirmar o óbvio).
Outras dicas
Tony Toews, Acesso MVP, tem um guia completo para a corrupção:
Corrupt Microsoft Access MDBs FAQ
- Alguns sintomas de corrupção
- Determinar a estação de trabalho que causou a corrupção
- A corrupção provoca
- Para recuperar seus dados
Como um aparte, descompilar é muito útil para resolver os acontecimentos estranhos quando a codificação e para melhorar os tempos de start-up.
Você também pode tentar este Comando utilitário de linha
// andy
A compactação e importação não vai resolver o problema para o erro relatado, que é claramente um ponteiro corrompido para um campo memorando. A única coisa que você pode fazer é apagar e recriar o registro que está causando o problema. E você precisa encontrar maneiras para editar dados de notas (ou eliminar campos memo - você realmente precisa de mais do que 255 caracteres ou não?) Que não expô-lo ao risco de corrupção. Isso significa evitar controles acoplados em formulários para campos de memorando.
Em vez disso, use uma caixa de texto não acoplada, e no evento OnCurrent do formulário, atribuir os dados atuais de OrigemDoRegistro subjacente do formulário:
Me!txtMyMemo = Me!MyMemo
Para salvar as edições ao controlo independente, usar o evento AfterUpdate do controle:
Me!MyMemo = Me!txtMyMemo
Me.Dirty = False ' save the whole record
Por que os campos memo sujeito à corrupção? Porque eles não são armazenados na mesma página de dados como os campos não-memo, mas em vez disso, tudo o que está na página de dados principal do registro é um ponteiro para alguma outra página de dados (ou conjunto de páginas de dados se é um grande pedaço de dados) onde os dados memorando real é armazenado. Se não fosse feito desta forma, um registro com um memorando em que seria muito rapidamente exceder o comprimento máximo de registro.
O ponteiro é relativamente fácil corrompido, na maioria das vezes por um problema fatal durante a edição de um controlo dependente. Edição com um controlo independente não elimina totalmente o problema, mas significa que o tempo em que você está exposto a perigo é muito, muito curto (ou seja, o tempo que leva para as duas linhas de código para executar no evento AfterUpdate) .
Além das opções já postei acima, eu usei um outro método simples aswell: Basta criar um novo arquivo MDB e importe todos os objetos daquele corrompido. Não se esqueça de obter do sistema e / ou escondidos objetos quando você ir por este caminho.