Erro: Erro "Linha não pode ser localizada para a atualização" Se você alterar o campo numérico no Recordset ADODC

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: 300586
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Se o controle de dados de um ActiveX Data Objects (ADODC) está acoplado a uma tabela do Microsoft Access que especifica um valor padrão para o campo numérico, quando você executa as seguintes ações:
  1. Adicione um novo registro a recordset ADO, que expõe o ADODC, sem inserir um valor para aquele campo numérico.
  2. Atualize o conjunto de registros.
  3. Digite um valor no campo numérico (ou diretamente no campo de conjunto de registros ou para a célula DataGrid correspondente) em que mesmo registro recém-adicionado.
  4. Atualize o conjunto de registros novamente.
o seguinte erro de tempo de execução é gerado com número de erro-2147217864 (80040e38) ou 6153:
Linha não pode ser localizada para a atualização. Alguns valores podem ter alterado desde a última leitura.
Se um controle DataGrid é acoplado ao ADODC, a mesma mensagem de erro geralmente aparece uma segunda vez sem um número de erro em uma caixa de diálogo que é intitulado "Controle DataGrid Microsoft".
Resolução
Para resolver esse problema, remova o valor padrão especificado para o campo numérico na tabela de banco de dados do Access.

Como alternativa, você pode executar uma instrução UPDATE em um objeto ADO Connection separado para atualizar o campo numérico no registro recém-adicionado diretamente no banco de dados e, em seguida, atualizar o ADODC.
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados no começo deste artigo.
Mais Informações
Observe que esse bug é não uma duplicata do problema descrito no seguinte artigo Base de dados de Conhecimento:
294842PROBLEMA: Erro ao atualizar ou excluir novas linhas na tabela do Access 97
A mensagem de erro mesmo ocorre com bancos de dados do Access 97 porque o ADO não recupera os valores AutoNumeração corretamente para registros recém-adicionado. O bug é descrito no artigo presente ocorre com versões posteriores do Access (incluindo o Access 2002) e os valores de chaves primária de AutoNumeração para recém-adicionado registros estão presentes no conjunto de registros.

Etapas para reproduzir o problema

  1. Crie um banco de dados vazio do Access chamado db1.mdb em uma pasta que você pretende usar para esse teste.
  2. Crie um novo projeto Standard EXE no Visual Basic. O Form1 é criado por padrão.
  3. Se necessário, adicione o controle de dados ADO e o DataGrid à caixa de ferramentas.
  4. Adicione um ADODC, um DataGrid e seis botões de comando ao Form1.
  5. Cole o código a seguir no módulo código do Form1:
    Option ExplicitPrivate Sub Command1_Click()    Dim cn As ADODB.Connection    Dim strCreate    Set cn = New ADODB.Connection    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _        "Data Source=" & App.Path & "\db1.mdb"    On Error Resume Next    cn.Execute "DROP TABLE InsertTest", , adExecuteNoRecords    On Error GoTo 0    strCreate = "CREATE TABLE InsertTest (TestID int identity not null primary key," & _                "TestValue int default 0, TestOther varchar(16))"    Debug.Print strCreate    cn.Execute strCreate, , adExecuteNoRecords    cn.Execute "INSERT INTO InsertTest (TestValue, TestOther) VALUES (1, 'John')"    cn.Execute "INSERT INTO InsertTest (TestValue, TestOther) VALUES (2, 'Mary')"    cn.Close    Set cn = NothingEnd SubPrivate Sub Command2_Click()    Dim cn As ADODB.Connection    Dim strCreate    Set cn = New ADODB.Connection    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _        "Data Source=" & App.Path & "\db1.mdb"    On Error Resume Next    cn.Execute "DROP TABLE InsertTest", , adExecuteNoRecords    On Error GoTo 0    strCreate = "CREATE TABLE InsertTest (TestID int identity not null primary key," & _                "TestValue int, TestOther varchar(16))"    Debug.Print strCreate    cn.Execute strCreate, , adExecuteNoRecords    cn.Execute "INSERT INTO InsertTest (TestValue, TestOther) VALUES (1, 'John')"    cn.Execute "INSERT INTO InsertTest (TestValue, TestOther) VALUES (2, 'Mary')"    cn.Close    Set cn = NothingEnd SubPrivate Sub Command3_Click()    With Adodc1        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _            "Data Source=" & App.Path & "\db1.mdb"        .RecordSource = "SELECT * FROM InsertTest"        .Refresh    End With    Set DataGrid1.DataSource = Adodc1End SubPrivate Sub Command4_Click()    With Adodc1.Recordset        .AddNew        .Fields("TestOther").Value = "Joe"        .Update        .Fields("TestValue").Value = 1        .Update    End WithEnd SubPrivate Sub Command5_Click()    With DataGrid1        .Row = Adodc1.Recordset.RecordCount        .Columns(2).Value = "Jane"        .Row = .Row - 1        .Row = .Row + 1        .Columns(1).Value = 123        .Row = .Row - 1    End With    Set DataGrid1.DataSource = Adodc1End SubPrivate Sub Command6_Click()    Set DataGrid1.DataSource = Nothing    DataGrid1.ClearFields    With Adodc1.Recordset        .AddNew        .Fields("TestOther").Value = "Joe"        .Update        .Fields("TestValue").Value = 1        .Update    End With    MsgBox "Update completed."End SubPrivate Sub Form_Load()    Command1.Caption = "Create Table with Default"    Command2.Caption = "Create Table without Default"    Command3.Caption = "Load Recordset"    Command4.Caption = "Test Recordset Update"    Command5.Caption = "Test Grid Cell Update"    Command6.Caption = "Test Update without Grid"    DataGrid1.AllowAddNew = TrueEnd Sub					
  6. Execute o projeto. Clique em Criar tabela com padrão , clique em Carregar Recordset e clique em Test Recordset atualizar . Isso atualiza o campo numérico em um registro no conjunto de registros ADODC recém-adicionado. Gera erro de tempo de execução-2147217864 (80040e38), que é seguido por um erro de DataGrid . Ambos esses erros conter a seguinte mensagem:
    Linha não pode ser localizada para a atualização. Alguns valores podem ter alterado desde a última leitura.
  7. Execute novamente o projeto. Clique em Criar tabela com padrão , clique em Carregar Recordset e clique em Test atualizar de célula de grade . Isso atualiza a célula de DataGrid que corresponde com o campo numérico em um registro recém-adicionado no conjunto de registros ADODC. Gera erro de tempo de execução 6153, que é seguido por um erro de DataGrid . Ambos esses erros conter a seguinte mensagem:
    Linha não pode ser localizada para a atualização. Alguns valores podem ter alterado desde a última leitura.
  8. Execute novamente o projeto. Clique em Criar tabela com padrão , clique em Carregar Recordset e clique em Atualizar teste sem grade . Isso atualiza o campo numérico em um registro recém-adicionado no conjunto de registros ADODC sem usar o DataGrid . Ele gera apenas o erro de runtime-2147217864 (80040e38), que exibe a seguinte mensagem:
    Linha não pode ser localizada para a atualização. Alguns valores podem ter alterado desde a última leitura.
  9. Execute novamente o projeto. Clique em Criar tabela sem padrão , clique em Carregar Recordset e, em seguida, clique em cada um dos três últimos botões. Em cada caso, o registro recém-adicionado é atualizado com êxito porque o valor padrão não está especificado no campo numérico problema na tabela do Access.
ADODC datagrid 6153 80040e38-2147217864 runtime

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 300586 - Última Revisão: 12/06/2015 03:06:40 - Revisão: 1.1

Microsoft Visual Basic Enterprise Edition for Windows 6.0, Microsoft Visual Basic 6.0 Professional Edition

  • kbnosurvey kbarchive kbmt kbbug kbdatabinding kbfix kbjet KB300586 KbMtpt
Comentários