Erro: É exibida uma mensagem de erro "Violação de acesso ou erro de sintaxe" no ADO.NET ao executar uma consulta duas vezes

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: 812916
cuidado ADO e ADO MD não foram totalmente testados em um ambiente Microsoft .NET Framework. Eles podem causar problemas intermitentes, especialmente em aplicativos baseados em serviço ou em aplicativos multissegmentados. As técnicas descritos neste artigo só devem ser usadas como uma medida temporária durante a migração para o ADO.NET. Você só deve usar essas técnicas depois de ter conduzido teste completo para verificar não se estão nenhum problema de compatibilidade. Quaisquer problemas que são causados por usando ADO ou ADO MD dessa maneira não são suportados. Para obter mais informações, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
840667 Você receber erros inesperados ao usar o ADO e ADO MD em um aplicativo .NET Framework
Sintomas
Quando você usa o objeto ActiveX Data Objects (ADO) conexões no Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 para executar uma consulta SQL que está associada com o objeto ADODB.Command duas vezes consecutivamente, você receberá a seguinte mensagem de erro semelhante ao :
Uma exceção sem tratamento do tipo 'System.Runtime.InteropServices.COMException' ocorreu no microsoft.visualbasic.dll

Obter informações adicionais: sintaxe erro ou violação de acesso
Causa
Quando você usar o objeto ADODB.Connection para executar uma consulta SQL que está associada ao objeto ADODB.Command , ligação tardia é usada. O erro mencionado na seção "Sintomas" ocorre porque a ligação tardia a interoperabilidade COM armazena em cache os resultados do método de interface IDispatch GetIDsOfNames .
Como Contornar
Para contornar esse bug, use ligação inicial em vez de ligação tardia para executar a consulta SQL. Você pode usar o método Excecute do objeto ADODB.Command para executar a consulta SQL, como mostra o código a seguir:
myRecordset = myCommand.Execute(, New Object() {myParameter})
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".
Mais Informações

Etapas para reproduzir o comportamento

  1. Crie um novo aplicativo do Windows Microsoft usando o Visual Basic .NET ou Microsoft Visual Basic 2005 . Por padrão, Form1.vb é criado.
  2. No Solution Explorer, clique com o botão direito do mouse em References e, em seguida, clique em Add Reference .
  3. Na janela Add Reference , clique na guia COM . Na lista Nome do componente , clique em Microsoft ActiveX Data Objects 2.7 Library .
  4. Clique em Selecionar e, em seguida, clique em OK .

    Observação No Visual Studio 2005, clique em OK .
  5. Adicione um controle botão ao Form1 .
  6. Clique duas vezes em Button1 para adicionar código para o evento click do controle Button1 .
  7. Adicione o seguinte código ao evento Button1_Click :
          Dim cn As ADODB.Connection      Dim rs As ADODB.Recordset      Dim cmd As ADODB.Command      Dim intDiscount As Short      ' Open the Connection.      cn = New ADODB.Connection()      cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Pubs;Data Source=YourServer"      cn.CursorLocation = ADODB.CursorLocationEnum.adUseClient      cn.Open()      ' Create a Command object.      cmd = New ADODB.Command()      With cmd         .Name = "QueryCustomers"         ' Set the SQL query to be executed.         .CommandText = "SELECT TOP 5 stor_id AS CustName, Discount FROM DISCOUNTS WHERE DISCOUNT > ?"         .CommandType = ADODB.CommandTypeEnum.adCmdText         .Parameters.Append(.CreateParameter("DiscountIn", ADODB.DataTypeEnum.adDouble, ADODB.ParameterDirectionEnum.adParamInput))         .ActiveConnection = cn      End With      ' Create a Recordset object to get the results.      rs = New ADODB.Recordset()      ' Execute the query.      cn.QueryCustomers(intDiscount, rs)      MsgBox("Total Number of Customers with " & intDiscount & "% Discount is " & rs.RecordCount)      rs.ActiveConnection = Nothing      cmd.ActiveConnection = Nothing
    Observação substituir YourServer com o nome do computador que está executando o SQL Server.
  8. No menu Debug , clique em Iniciar para executar o aplicativo.
  9. Clique em Button1 . Na caixa de diálogo, clique em OK .
  10. Clique em Button1 novamente. Você receber a mensagem de erro mencionada na seção "Sintomas" deste artigo.
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
308499PROBLEMA: Exceção sem tratamento quando você define uma propriedade ADO como uma seqüência de caracteres no Visual Basic .NET
188857PROBLEMA: Usar abrir método para alterar CursorType e LockType
308047Como abrir uma conexão ADO e objetos Recordset usando o Visual Basic .NET

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 812916 - Última Revisão: 12/27/2007 14:55:25 - Revisão: 3.2

Microsoft ADO.NET 2.0, Microsoft ADO.NET 1.0, Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition

  • kbmt kbtshoot kbhotfixserver kbqfe kbvs2002sp1sweep kbprogramming kbtsql kbdatabase kbcominterop kbwindowsforms kberrmsg kbbug KB812916 KbMtpt
Comentários