Erro: A atualização de linha recém-inserida causa DB_E_ERRORSOCCURRED

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: 294160
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Sobre como atualizar uma linha que tiver sido recém-inserida em uma tabela, através de um conjunto de linhas OLEDB ou um recordset ADO (ActiveX Data Objects), o seguinte erro pode ocorrer:
(0X80040E21, DB_E_ERRORSOCCURRED) Operação OLE DB com várias etapas gerou erros. Verifique cada valor de status de OLE DB, se disponível. Nenhum trabalho foi realizado.
Este erro ocorre quando as seguintes condições são atendidas:
  • Há uma conexão ao SQL Server através do provedor OLE DB para drivers ODBC (MSDASQL).
  • O conjunto de registros é criado pelo selecionando uma tabela de banco de dados do SQL Server.
  • O conjunto de registros usa cursores do lado do servidor.
  • Uma das colunas no conjunto de registros é a chave primária para a tabela.
  • Há um disparador de inserção na tabela que insere linhas algum objeto de banco de dados.
  • Os métodos AddNew e Update são usados para adicionar uma nova linha à tabela.
  • Atualização é chamada novamente para atualizar uma linha antes do conjunto de registros tenha sido rolado usando FetchNext, FetchFirst e assim por diante.
Resolução
Para evitar esse erro ocorra, siga um destes procedimentos:
  • Use cursores do lado do cliente (definindo o local do cursor propriedade do recordset ADO para adUseClient).
  • Remova o disparador de inserção da tabela de origem.
  • Colocar a seguinte linha no início do código do disparador.
    SET NOCOUNT ON					
  • Use SQLOLEDB em vez de MSDASQL e defina a propriedade "Alterar inserido linhas" do objeto Recordset como true antes de abrir o conjunto de registros:
    pRs.Properties.Item("Change Inserted Rows") = True					
  • Remova a chave primária da tabela.
  • Depois de chamar Update pela primeira vez para inserir a nova linha na tabela, role o recordset usando métodos como MoveNext e MovePrevious antes de chamar Update novamente.
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados no começo deste artigo.
Mais Informações

Etapas para reproduzir o problema

  1. Use o seguinte script para criar os objetos de banco de dados no SQL Server 7.0 ou SQL Server 2000:
    create table ADOtest(col1 int not null primary key)gocreate table ADOtest2(col1 int not null primary key)gocreate trigger trIADOtest on ADOtest for insert asinsert ADOtest2 values (7)go					
  2. Use o código a seguir em um aplicativo do Microsoft Visual Basic para reproduzir o erro. Certifique-se de alterar o nome do DSN, nome de usuário e senha.
    Dim pConn As New ADODB.ConnectionpConn.Open "dsn=YOURDSN", "USERNAME", "PASSWORD", adConnectUnspecified'The following two lines are just to clean up from previous runs.pConn.Execute "DELETE FROM ADOTEST"pConn.Execute "DELETE FROM ADOTEST2"Dim pRs As New ADODB.RecordsetpRs.ActiveConnection = pConn    pRs.Open "SELECT * FROM ADOtest", , adOpenKeyset, adLockOptimistic, adCmdUnspecifiedpRs.AddNewpRs!col1 = 3pRs.UpdatepRs!col1 = 4pRs.Update '<---- Error occurs here.					

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 294160 - Última Revisão: 12/06/2015 01:40:29 - Revisão: 4.3

Microsoft SQL Server 2000 Standard Edition, Microsoft Data Access Components 2.5, Microsoft Data Access Components 2.5 Service Pack 1, Microsoft Data Access Components 2.6, Microsoft SQL Server 7.0 Standard Edition

  • kbnosurvey kbarchive kbmt kbbug KB294160 KbMtpt
Comentários