Artigo: 208799 - Última revisão: quinta-feira, 23 de Junho de 2005 - Revisão: 3.0

ACC2000: Os novos registos SQL aparecem eliminados até reaberto do conjunto de registos

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Avançado: Requer conhecimentos avançados sobre codificação, interoperabilidade e multi-utilizador.

Este artigo aplica-se apenas a uma base de dados do Microsoft Access (.mdb).

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Quando adicionar um registo a uma tabela de SQL utilizando o Visual Basic for Applications, se o campo da tabela índice exclusivo tiver um valor predefinido e não for atribuído um valor para esse campo, o novo registo será apresentada eliminado até voltar a abrir a tabela de SQL. Se tentar obter um valor a partir do novo registo, receberá a seguinte mensagem de erro:
Run-time error '3167'

Registo é eliminado.

Resolução

Para resolver este comportamento, quando abrir a tabela de SQL utilizando código do Visual Basic, inclua a opção dbSeeChanges , como no seguinte exemplo:
Set rs = db.OpenRecordset("TestTable", dbOpenDynaset, dbSeeChanges)
				
a opção dbSeeChanges assegura que quaisquer recentemente adicionados registos que contêm um valor predefinido do campo de índice exclusivo estão disponíveis no conjunto de registos actual.

Mais Informação

A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador.

Passos para reproduzir o comportamento

Nota : O código de exemplo deste artigo utiliza Microsoft Data Access Objects. Para que este código seja executado correctamente, tem de referenciar a biblioteca Microsoft DAO 3.6 Object Library. Para o fazer, clique em References no menu Ferramentas no Editor do Visual Basic e certifique-se de que está seleccionada a caixa de verificação Microsoft DAO 3.6 Object Library .

  1. Crie um módulo e escreva a linha seguinte na secção Declarations , caso ainda não estiver escrito:
    opção explícita
  2. Escreva o seguinte procedimento:
    Function TestSQLData()
    
       Dim db As DAO.Database, rs As DAO.Recordset
       Dim idx, td
       Dim cmd As String
    
       ' Delete TestTable if it exists on the SQL server.
       
       'Insert your database name, user ID, password (if any), and dsn
       'to point to an ODBC data source.
       Set db = OpenDatabase("<MyDatabase>", False, False, _
       "ODBC, Database = <MyDatabase>, UID = <userid>, PWD = <password>, dsn = <MyDSN>")
       cmd = "if exists (select * from sysobjects where" _
          & " id = object_id('dbo.TestTable'))"
       cmd = cmd & " drop table TestTable"
       db.Execute cmd, dbSQLPassThrough
    
       ' Create TestTable with one field on SQL server.
       Set td = db.CreateTableDef("TestTable")
       td.Fields.Append td.CreateField("Int", dbInteger)
       td.Fields.Append td.CreateField("String", dbText, 50)
       db.TableDefs.Append td
    
       Set idx = td.CreateIndex("MyIdx")
       idx.Unique = True
       idx.Fields.Append idx.CreateField("Int")
       td.Indexes.Append idx
    
       cmd = "create Default TestDef3 as 100"
       db.Execute cmd, dbSQLPassThrough
    
       cmd = "sp_bindefault TestDef3, 'TestTable.Int'"
       db.Execute cmd, dbSQLPassThrough
    
       ' Open table, add a record, and then obtain values.
       Set rs = db.OpenRecordset("TestTable")
       rs.AddNew
       rs!String = "Trial"
       rs.Update
    
       Debug.Print "RecordCount = " & rs.RecordCount
       rs.MoveFirst
       Debug.Print "String is " & rs("String")
       Debug.Print "Int is " & rs("Int")
       rs.Close
    
    End Function
    					
  3. Para testar esta função, escreva a seguinte linha na janela Immediate e, em seguida, prima ENTER:
    ? TestSQLData()
    Tenha em atenção que o erro de tempo de execução 3167 ocorre.

A informação contida neste artigo aplica-se a:
  • Microsoft Access 2000 Standard Edition
Palavras-chave: 
kbmt kberrmsg kbprb kbusage KB208799 KbMtpt
Tradução automáticaTradução automática
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 208799  (http://support.microsoft.com/kb/208799/en-us/ )