Você está offline; aguardando reconexão

PROBLEMA: "Run-time error 3001" com o objeto de comando do ADO e adCmdTableDirect

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: 248076
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sintomas
Se você tentar abrir um Recordset ADO usando executar o método de um objeto Command do ADO, enquanto que especificar uma opção de Recordset do adCmdTableDirect, o seguinte erro aparece:
"Erro em tempo de execução '3001': O aplicativo está usando argumentos que são do tipo errado, estão fora do intervalo aceitável ou estão em conflito com outro."
O erro também ocorre se você tentar definir a propriedade CommandType de um objeto Command do ADO para adCmdTableDirect.

O erro não ocorre ao especificar adCmdTable.
Causa
adCmdTableDirect não é compatível com o comando ADO objeto. adCmdTableDirect Especifica que o ADO usa uma interface chamada IOpenRowset em vez de um objeto Command do ADO.
Resolução
Há duas soluções possíveis:
  • Especificar adCmdTableDirect no método Open de um ADO Recordset.
  • Especifique um CommandType de adCmdText ou adCmdTable.

    No entanto, isso resultaria em funcionalidade reduzida em situações onde usar adCmdTableDirect é uma opção.
Situação
Esse comportamento é por design.
Mais Informações
adCmdTableDirect foi projetado especificamente para OLE DB provedores que oferecem suporte a tabelas de abertura diretamente por nome, usando o IOpenRowset método do provedor. adCmdTableDirect força ADO para usar IOpenRowset em vez de tentar abrir o conjunto de linhas, criando e executando um objeto de comando. IOpenRowset permite que os consumidores abrir e trabalhar diretamente com as tabelas individuais ou índices em uma fonte de dados, resultando em melhor desempenho e funcionalidade.

Por outro lado, adCmdTable indica que o provedor deve gerar uma consulta SQL para retornar todas as linhas de uma tabela. adCmdTable simplesmente acrescenta início
SELECT * FROM
em frente tablename especificado.

Etapas para reproduzir o problema

Este exemplo utiliza o banco de dados Nwind fornecido com o Visual Basic.
  1. No Visual Basic, crie um novo projeto Standard EXE.
    O Form1 é criado por padrão.
  2. Definir um projeto e uma referência para o Microsoft ActiveX Data Objects Library.
  3. Coloque três botões de comando para Form1.

    Command3, Command1 e Command2 são criados por padrão.
  4. Cole o código seguinte a "Declaração geral" seção da janela de código do Form1:
       Private Sub Command1_Click()              Dim cmd As ADODB.Command              Set cmd = New ADODB.Command       cmd.CommandType = adCmdTableDirect    End Sub   Private Sub Command2_Click()              Dim cmd As ADODB.Command       Dim rs As ADODB.Recordset              Set cmd = New ADODB.Command       cmd.CommandText = "Employees"       cmd.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _       "Data Source=c:\Program Files\Microsoft Visual Studio\VB98\NWind.mdb"              Set rs = cmd.Execute(, , adCmdTableDirect)         End Sub   Private Sub Command3_Click()       Dim cmd As ADODB.Command       Dim rs As ADODB.Recordset              Set cmd = New ADODB.Command       cmd.CommandText = "Employees"       cmd.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _       "Data Source=c:\Program Files\Microsoft Visual Studio\VB98\NWind.mdb"             Set rs = New ADODB.Recordset       rs.Open cmd, , adOpenKeyset, adLockOptimistic, adCmdTableDirect              MsgBox rs("Firstname").Value          End Sub					
  5. Teste o projeto.

    Clicando em Command1 ou Command2 gera erro 3001.
    Clicando em Command3 não gera erro 3001.
Referências
Para documentação completa sobre o Microsoft ActiveX Data Objects Library, visite o seguinte site na World Wide Web:

Microsoft ActiveX Data Objects Library

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 248076 - Última Revisão: 04/22/2003 14:39:39 - Revisão: 2.1

Microsoft ActiveX Data Objects 2.0, Microsoft ActiveX Data Objects 2.01, Microsoft ActiveX Data Objects 2.1, Microsoft ActiveX Data Objects 2.1 Service Pack 1, Microsoft ActiveX Data Objects 2.1 Service Pack 2, Microsoft ActiveX Data Objects 2.5, Microsoft ActiveX Data Objects 2.6, Microsoft ActiveX Data Objects 2.7

  • kbmt kbdatabase kbprb KB248076 KbMtpt
Comentários
m=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> ;