Você está offline; aguardando reconexão

Não há suporte para seu navegador

Você precisa atualizar seu navegador para usar o site.

Atualize para a versão mais recente do Internet Explorer

Você receber a mensagem de erro "O banco de dados está em um estado inesperado" ao tentar abrir um banco de dados no Access 2000 ou uma versão posterior do Access

O suporte para o Office 2003 terminou

A Microsoft terminou o suporte para o Office 2003 em 8 de abril de 2014. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 888634
Este artigo se aplica para um arquivo de banco de dados (.mdb) do Microsoft Access ou para um arquivo de banco de dados (.accdb) do Microsoft Access.

Moderado: Requer básica de macro, codificação e interoperabilidade habilidades.
Sintomas
Quando você tenta abrir um banco de dados no Microsoft Access 2000 ou uma versão posterior, você receber a seguinte mensagem de erro:
O banco de dados está em estado inesperado
Causa
Esse problema pode ocorrer quando você usa o Data Access Object (DAO) biblioteca para converter um banco de dados que você criou no Microsoft Access 97 ou uma versão anterior usando o método CompactDatabase . O método CompactDatabase pode deixar o novo banco de dados em um estado parcialmente convertido.
Resolução
Para resolver esse problema, use um dos seguintes métodos.

Método 1: Usar o comando Converter banco de dados quando você tem o banco de dados original

Se você ainda tiver uma cópia do banco de dados original em seu formato original, use o comando Converter banco de dados . Para fazer isso, execute as seguintes etapas:

O Access 2000, Access 2002 ou Access 2003

  1. Faça uma cópia de backup do banco de dados original.
  2. Inicie o Access 2000 ou uma versão posterior.
  3. No menu Ferramentas , clique em Utilitários de banco de dados , clique em Converter banco de dados e em seguida, clique em Para o formato de arquivo do Access 2000 .

    Observação Se você estiver usando o Access 2000, apenas A versão atual do banco de dados do Access aparece no menu Converter banco de dados .
  4. Na caixa de diálogo Converter banco de , clique no nome arquivo de banco de dados que você deseja converter e, em seguida, clique em Converter .
  5. Na caixa de diálogo Converter banco de dados em , digite o novo nome do arquivo de banco de dados e, em seguida, clique em Salvar .

O Access 2007

  1. Faça uma cópia de backup do banco de dados original.
  2. Tente abrir o banco de dados.
  3. Quando você abre um Access 97 ou do Access 95 arquivo de formato de banco de .mdb dados, o Access exibe a caixa de diálogo Aprimoramento do banco de dados . Você será solicitado a atualizar o banco de dados.
  4. Clique em Sim para atualizar o banco de dados para o formato de arquivo você tiver selecionado como o formato de arquivo padrão no Access 2007. Depois de converter o banco de dados, você pode fazer alterações design para o arquivo no Access 2007. No entanto, você não pode abrir o banco de dados usando uma versão anterior à versão à qual você converteu o banco de dados do Access.

Método 2: Recuperar os dados do banco de dados e as consultas de banco de dados quando você não tem o banco de dados original não seguras

Se você não tiver uma cópia do banco de dados não seguras original em seu formato original e você tiver tentado padrão corrupção Solucionando problemas de técnicas, tente recuperar os dados do banco de dados e as consultas de banco de dados. Para fazer isso, execute as seguintes etapas:
  1. Faça uma cópia de backup do banco de dados original.
  2. Inicie o Access 2000 ou uma versão posterior.
  3. o Access 2000, Access 2002 ou Access 2003
    • Clique em banco de dados em branco , digite o novo nome de banco de dados na caixa nome do arquivo e, em seguida, clique em criar .
    o Access 2007
    • Clique em botão Office, clique em novo , clique em Banco de dados em branco e, em seguida, clique em criar para criar um novo banco de dados em branco.
  4. o Access 2000, Access 2002 ou Access 2003
    • No menu Inserir , clique em módulo . Inicia o Editor do Visual Basic e é criado um novo módulo.
    o Access 2007
    • Na guia criar , clique na seta para baixo abaixo macro e, em seguida, clique em módulo . Inicia o Editor do Visual Basic e é criado um novo módulo.
  5. No menu Ferramentas , clique em referências .
  6. Na lista Referências disponíveis , localize Microsoft DAO 3.6 Object Library e, em seguida, clique para selecionar a caixa de seleção Microsoft DAO 3.6 Object Library .

    Observação DAO 3.6 também está disponível no Windows XP Home Edition.
  7. Para fechar a caixa de diálogo referências , clique em OK .
  8. Cole o código a seguir no módulo novo que você criou.
    Sub RecoverCorruptDB()    Dim dbCorrupt As DAO.Database    Dim dbCurrent As DAO.Database    Dim td As DAO.TableDef    Dim tdNew As DAO.TableDef    Dim fld As DAO.Field    Dim fldNew As DAO.Field    Dim ind As DAO.Index    Dim indNew As DAO.Index    Dim qd As DAO.QueryDef    Dim qdNew As DAO.QueryDef    Dim strDBPath As String    Dim strQry As String        ' Replace the following path with the path of the    ' corrupted database.    strDBPath = "C:\My Documents\yourDatabase.mdb"        On Error Resume Next    Set dbCurrent = CurrentDb    Set dbCorrupt = OpenDatabase(strDBPath)     For Each td In dbCorrupt.TableDefs        If Left(td.Name, 4) <> "MSys" Then            strQry = "SELECT * INTO [" & td.Name & "] FROM [" & td.Name & "] IN '" & dbCorrupt.Name & "'"            dbCurrent.Execute strQry, dbFailOnError            dbCurrent.TableDefs.Refresh            Set tdNew = dbCurrent.TableDefs(td.Name)                        ' Re-create the indexes on the table.            For Each ind In td.Indexes                Set indNew = tdNew.CreateIndex(ind.Name)                For Each fld In ind.Fields                    Set fldNew = indNew.CreateField(fld.Name)                    indNew.Fields.Append fldNew                Next                indNew.Primary = ind.Primary                indNew.Unique = ind.Unique                indNew.IgnoreNulls = ind.IgnoreNulls                tdNew.Indexes.Append indNew                tdNew.Indexes.Refresh            Next        End If    Next            ' Re-create the queries.    For Each qd In dbCorrupt.QueryDefs        If Left(qd.Name, 4) <> "~sq_" Then            Set qdNew = dbCurrent.CreateQueryDef(qd.Name, qd.SQL)        End If    Next        dbCorrupt.Close    Application.RefreshDatabaseWindow    MsgBox "Procedure Complete."End Sub
    Observação O código irá tentar importar todas as tabelas e todas as consultas do banco de dados corrompido no banco de dados atual. Substituir C:\My Documents\yourDatabase.mdb com o caminho e o nome correto do banco de dados.
  9. Para executar o código, clique em Executar Sub/UserForm no menu Executar .

Método 3: Recuperar os dados do banco de dados quando você não tem o banco de dados protegido original

Se você não tem uma cópia do original banco de dados protegido em seu formato original e você tiver tentado padrão corrupção Solucionando problemas de técnicas, tente recuperar os dados de banco de dados. Para fazer isso, execute as seguintes etapas:
  1. Faça uma cópia de backup do banco de dados original.
  2. Inicie o Access 2000 ou uma versão posterior.
  3. o Access 2000, Access 2002 ou Access 2003
    • Clique em banco de dados em branco , digite o novo nome de banco de dados na caixa nome do arquivo e, em seguida, clique em criar .
    o Access 2007
    • Clique no Botão Microsoft Office , clique em novo , clique em Banco de dados em branco e, em seguida, clique em criar para criar um novo banco de dados em branco.
  4. o Access 2000, Access 2002 ou Access 2003
    • No menu Inserir , clique em módulo . Inicia o Editor do Visual Basic e é criado um novo módulo.
    o Access 2007
    • Na guia criar , clique na seta para baixo abaixo macro e, em seguida, clique em módulo . Inicia o Editor do Visual Basic e é criado um novo módulo.
  5. No menu Ferramentas , clique em referências .
  6. Na lista Referências disponíveis , localize Microsoft DAO 3.6 Object Library e, em seguida, clique para selecionar a caixa de seleção Microsoft DAO 3.6 Object Library .
  7. Para fechar a caixa de diálogo referências , clique em OK .
  8. Cole o código a seguir no módulo novo que você criou.
    Option Compare DatabaseFunction BackupSecureDatabase()       On Error GoTo Err_BackupSecureDatabase   Dim wrkDefault As DAO.Workspace   Dim dbsNew As DAO.Database   Dim dbeSecure As DAO.PrivDBEngine   Dim wrkSecure As DAO.Workspace   Dim dbsSecure As DAO.Database   Dim tdfSecure As DAO.TableDef   Dim strSecureUser As String   Dim strSecurePwd As String   Dim strSecurePathToDatabase As String   Dim strSecurePathToWorkgroupFile As String   Dim strTableName As String   Dim strSQL As String   Dim dbsTemp As DAO.Database   Dim strTempPathToDatabase As String   Dim strBackupPathToDatabase As String   Dim strLogPath As String   Dim SourceRec As DAO.Recordset   Dim DestRec As DAO.Recordset          ' Set the variables (change for environment).   strSecurePathToDatabase = "C:\MyDatabases\Northwind.mdb"   strSecurePathToWorkgroupFile = "C:\MyDatabases\Secured.mdw"   strSecureUser = "Administrator"   strSecurePwd = "password"   strTempPathToDatabase = "C:\MyDatabases\Temp.mdb"   strBackupPathToDatabase = "C:\MyDatabases\Backup.mdb"   strLogPath = "C:\MyDatabases\Backup.log"      ' Open the log file.   Open strLogPath For Output As #1   Print #1, Time, "Log file opened"   Print #1, Time, "Variables set"      ' Delete old files.   If Dir(strTempPathToDatabase) <> "" Then Kill strTempPathToDatabase   If Dir(strBackupPathToDatabase) <> "" Then Kill strBackupPathToDatabase   Print #1, Time, "Old backup files deleted"      ' Create the new temp database.   Set wrkDefault = DBEngine.Workspaces(0)   Set dbsNew = wrkDefault.CreateDatabase(strTempPathToDatabase, dbLangGeneral)   Set dbsNew = Nothing   Print #1, Time, "Temp database created"      ' Open the secured database.   Set dbeSecure = New PrivDBEngine   dbeSecure.SystemDB = strSecurePathToWorkgroupFile   dbeSecure.DefaultUser = strSecureUser   dbeSecure.DefaultPassword = strSecurePwd      Set wrkSecure = dbeSecure.Workspaces(0)   Set dbsSecure = wrkSecure.OpenDatabase(strSecurePathToDatabase)   Print #1, Time, "Secured database opened from " & strSecurePathToDatabase      ' Open the temp database.   DBEngine(0).CreateUser   Set dbsTemp = DBEngine(0).OpenDatabase(strTempPathToDatabase)      Print #1, Time, "Temp database opened from " & strTempPathToDatabase      ' Loop through the tables in the secured database.   For Each tdfSecure In dbsSecure.TableDefs       strTableName = tdfSecure.Name       If Left(strTableName, 4) <> "MSys" Then           Print #1, Time, "Export of " & strTableName           ' Copy the table definition to the temp database.           If CopyTableDef(tdfSecure, dbsTemp, strTableName) Then               ' Then append all the data into the table.                Set SourceRec = tdfSecure.OpenRecordset(dbOpenTable, dbReadOnly)                Set DestRec = dbsTemp.OpenRecordset(strTableName)                AppendRecordsFromOneRecordSetToAnother SourceRec, DestRec                 SourceRec.Close                DestRec.Close           End If       End If   Next tdfSecure   ' Close open objects.   dbsSecure.Close   Print #1, Time, "Secured database closed"   dbsTemp.Close   Print #1, Time, "Temp database closed"          ' Compact the database into the backup database.   DBEngine.CompactDatabase strTempPathToDatabase, strBackupPathToDatabase, dbLangGeneral   Print #1, Time, "New backup database created at " & strBackupPathToDatabase      ' Delete the temp database.   If Dir(strTempPathToDatabase) <> "" Then Kill strTempPathToDatabase   Print #1, Time, "Temp database deleted"   Print #1, Time, "Log file closed"   Close #1Exit_BackupSecureDatabase:   Set wrkDefault = Nothing   Set dbsNew = Nothing   Set dbeSecure = Nothing   Set wrkSecure = Nothing   Set dbsSecure = Nothing   Set tdfSecure = Nothing   Set dbsTemp = Nothing   Exit FunctionErr_BackupSecureDatabase:   Print #1, Time, "     ***ERROR: " & Err.Number, Err.Description, strTableName   Resume NextEnd FunctionFunction CopyTableDef(SourceTableDef As TableDef, TargetDB As Database, TargetName As String) As IntegerDim SI As DAO.Index, SF As DAO.Field, SP As DAO.PropertyDim T As DAO.TableDef, I As DAO.Index, F As DAO.Field, P As DAO.PropertyDim I1 As Integer, f1 As Integer, P1 As Integer    If SourceTableDef.Attributes And dbAttachedODBC Or SourceTableDef.Attributes And dbAttachedTable Then    CopyTableDef = False    Exit Function  End If  Set T = TargetDB.CreateTableDef(TargetName)    ' Copy Jet Properties.    On Error Resume Next    For P1 = 0 To T.Properties.Count - 1      If T.Properties(P1).Name <> "Name" Then        T.Properties(P1).Value = SourceTableDef.Properties(P1).Value      End If    Next P1    On Error GoTo 0      ' Copy Fields.    For f1 = 0 To SourceTableDef.Fields.Count - 1      Set SF = SourceTableDef.Fields(f1)            ' DAO 3.0 and later versions. ****      If (SF.Attributes And dbSystemField) = 0 Then        Set F = T.CreateField()        ' Copy Jet Properties.          On Error Resume Next          For P1 = 0 To F.Properties.Count - 1            F.Properties(P1).Value = SF.Properties(P1).Value          Next P1          On Error GoTo 0        T.Fields.Append F      End If ' Corresponding End If ****    Next f1      ' Copy Indexes.    For I1 = 0 To SourceTableDef.Indexes.Count - 1      Set SI = SourceTableDef.Indexes(I1)            ' Foreign indexes are added by relationships.      If Not SI.Foreign Then        Set I = T.CreateIndex()        ' Copy Jet Properties.          On Error Resume Next          For P1 = 0 To I.Properties.Count - 1            I.Properties(P1).Value = SI.Properties(P1).Value          Next P1          On Error GoTo 0        ' Copy Fields.          For f1 = 0 To SI.Fields.Count - 1            Set F = T.CreateField(SI.Fields(f1).Name, T.Fields(SI.Fields(f1).Name).Type)            I.Fields.Append F          Next f1        T.Indexes.Append I      End If    Next I1' Append TableDef.  TargetDB.TableDefs.Append T    ' Copy Access/User Table Properties.    For P1 = T.Properties.Count To SourceTableDef.Properties.Count - 1      Set SP = SourceTableDef.Properties(P1)      Set P = T.CreateProperty(SP.Name, SP.Type)      P.Value = SP.Value      T.Properties.Append P    Next P1      ' Copy Access/User Field Properties.    For f1 = 0 To T.Fields.Count - 1      Set SF = SourceTableDef.Fields(f1)      Set F = T.Fields(f1)      For P1 = F.Properties.Count To SF.Properties.Count - 1        Set SP = SF.Properties(P1)        Set P = F.CreateProperty(SP.Name, SP.Type)        P.Value = SP.Value        F.Properties.Append P      Next P1    Next f1      ' Copy Access/User Index Properties.    For I1 = 0 To T.Indexes.Count - 1      Set SI = SourceTableDef.Indexes(T.Indexes(I1).Name)            ' Do not copy foreign indexes. They are created by relationships.      If Not SI.Foreign Then        Set I = T.Indexes(I1)        For P1 = I.Properties.Count To SI.Properties.Count - 1          Set SP = SI.Properties(P1)          Set P = I.CreateProperty(SP.Name, SP.Type)          P.Value = SP.Value          I.Properties.Append P        Next P1      End If    Next I1  CopyTableDef = TrueEnd FunctionFunction AppendRecordsFromOneRecordSetToAnother(SR As DAO.Recordset, DR As DAO.Recordset)Dim x As IntegerDo While Not SR.EOFDR.AddNew    For x = 0 To SR.Fields.Count - 1        DR(x).Value = SR(x).Value    Next xDR.UpdateSR.MoveNextLoopEnd Function
    NoteO código irá tentar importar todas as tabelas de banco de dados corrompido em um banco de dados de backup. Substitua as variáveis na tabela após a etapa 10 por seus locais de arquivo de banco de dados e suas configurações de usuário.
  9. Na lista de funções, selecione BackupSecureDatabase .
  10. Para executar o código, clique em Executar Sub/UserForm no menu Executar .
VariávelDescrição
strSecurePathToDatabaseLocal do arquivo de banco de dados protegido
strSecurePathToWorkgroupFileLocal do arquivo de grupo de trabalho
strSecureUserNome de logon do usuário protegido
strSecurePwdSenha de logon do usuário protegido
strTempPathToDatabaseLocal do arquivo de banco de dados temporário
strBackupPathToDatabaseLocal do arquivo de banco de dados de backup
strLogPathLocal do arquivo de log
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".
Mais Informações
Para obter mais informações sobre como solucionar problemas de corrupção em um banco de dados Microsoft Access, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
306204Como solucionar problemas de corrupção em um banco de dados Microsoft Access
ACC2000 ACC2002 ACC2003 ACC2007

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 888634 - Última Revisão: 09/28/2007 15:42:39 - Revisão: 4.2

  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • kbmt kbcorrupt kbconversion kbimport kbinfo kbtshoot kbprb KB888634 KbMtpt
Comentários
did=1&t=">I=4050&did=1&t=">TagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> >>ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");