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

Traduções de Artigos Traduções de Artigos
Artigo: 135379 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Avançado: Requer conhecimentos avançados sobre codificação, interoperabilidade e multi-utilizador.

Quando adicionar um registo a uma tabela 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

Quando abrir a tabela de SQL utilizando código do Visual Basic, inclua a opção dbSeeChanges, como no exemplo seguinte:
   Set rs = db.OpenRecordset("TestTable", dbOpenDynaset, dbSeeChanges)
				

A opção dbSeeChanges garante 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.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento


  1. Crie um módulo e escreva a linha seguinte na secção Declarations, caso ainda não estiver escrito:
          Option Explicit
    						
  2. Escreva o seguinte procedimento:
          Function TestSQLData()
    
             Dim db As Database, rs As Recordset
             Dim idx, td
             Dim cmd As String
    
             ' Delete TestTable if it exists on the SQL server.
             Set db = OpenDatabase("", False, False,ODBC;dsn=<datasource>; _
                database=<database>;uid=<user id>;pwd=<password>")
             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 de depuração e, em seguida, prima ENTER:

    ? TestSQLData()

    Repare que ocorre run-time error '3167'.

Referências

Para obter mais informações sobre o método OpenRecordset, procure no índice remissivo da ajuda "OpenRecordset" e "Método OpenRecordset" ou pergunte ao Microsoft Access 97 do Assistente do Office.

Propriedades

Artigo: 135379 - Última revisão: 4 de fevereiro de 2014 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kberrmsg kbprb kbusage KB135379 KbMtpt
Traduçã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: 135379

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com