CORRECÇÃO: Erro 'Objecto inválido ou que já não se encontra definido' com o Microsoft Jet

Exclusão de Responsabilidade para Conteúdo BDC Extinto

Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser atualizado.

Sintomas

Ao abrir e fechar ligações ou conjuntos de registos utilizando o controlador ODBC da Microsoft para o Access ou o fornecedor OLE DB da Microsoft para o Jet, poderá ser registado o seguinte erro:
Objecto inválido ou que já não se encontra definido.
Após a apresentação deste erro, já não é possível abrir outros conjuntos de registos ou ligações do mesmo processo.


Seguem-se outras mensagens de erro que podem ser apresentadas na aplicação cliente:
Demasiadas tabelas abertas.
Não é possível abrir mais tabelas.

Resolução

Para resolver este problema, instale o Microsoft Jet 4.0 Service Pack 6 (SP6). Para transferir o Microsoft Jet 4.0 SP6, consulte um dos seguintes artigos na base de dados de conhecimento da Microsoft (KB, Microsoft Knowledge Base):
239114 ACC2000: Versão actualizada do Microsoft Jet 4.0 disponível no centro de transferências
282010 ACC2002: Versão actualizada do Microsoft Jet 4.0 disponível no centro de transferências (Download Center)

Ponto Da Situação

A Microsoft confirma que este problema ocorre nos produtos referidos na secção "A informação contida neste artigo aplica-se a".Este problema foi resolvido no Jet 4.0 Service Pack 6 (SP6).

Mais Informação

Para reproduzir o problema, execute o seguinte código de Microsoft Visual Basic for Applications (VBA):
 
Public Sub Jet_TableID_Repro()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.recordset
Dim i As Long

Set conn = New ADODB.Connection
' Modifique esta cadeia de ligação de modo a apontar para uma base de dados vazia.
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\YourTestDatabase.mdb;"

' Interrompa e crie novamente a consulta de teste.
On Error Resume Next
conn.Execute "drop procedure sp_param_test", , adExecuteNoRecords
On Error GoTo 0
conn.Execute "create procedure sp_param_test as " & _
"parameters iInput Long; " & _
"select iInput as iOutput;", , adExecuteNoRecords

For i = 1 To 10000

' Pode ocorrer um erro no código por volta das 2000-3000 iterações.
Set rs = New ADODB.recordset
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_param_test"
cmd.Parameters.Append cmd.CreateParameter("iInput", adInteger)
cmd.Parameters(0).value = 12

' Esta operação falhará por volta das 2000-3000 iterações.
rs.Open cmd, , adOpenKeyset, adLockOptimistic
Set cmd = Nothing
Debug.Print i
DoEvents
rs.Close
Set rs = Nothing

Next i

End Sub
Propriedades

ID do Artigo: 304536 - Última Revisão: 13/04/2006 - Revisão: 1

Comentários