PROBLEMA: O Recordset não abre com um procedimento armazenado que retorna um erro de gravidade alta

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: 313861
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você tenta abrir um recordset ADO (ActiveX Data Objects) que preenche um procedimento armazenado, o conjunto de registros não abre se o procedimento armazenado retorna um erro alta gravidade. Se você tentar acessar o valor, você receber uma das seguintes mensagens de erro:

Observação : A mensagem exibida depende de fatores como o Microsoft Data Access Components (MDAC) versão e o local do cursor.
Provedor atual não dá suporte a retornar vários conjuntos de registros de uma única execução.
- ou -
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.
- ou -
Erro definido pelo aplicativo ou objeto definido.
- ou -
Objeto ou o provedor não é capaz de executar a operação solicitada.
- ou -
Ocorreu um erro desconhecido.
Situação
Esse comportamento é por design.
Mais Informações
Se o procedimento armazenado retornar vários conjuntos de registros, um problema surge porque o método Nextrecordset não funciona em um conjunto de registros fechado. Uma consulta bem-sucedida pode ser retornada antes de ocorrer o erro; no entanto, após o erro é retornado, o método Nextrecordset não funciona.

Passos para reproduzir o problema

  1. Executar as seguintes consultas no Microsoft SQL Server Query Analyzer:
    Use NorthwindGOCREATE Procedure myProcAsSet NOCOUNT ONSELECT * FROM ShippersRAISERROR('Test Error Message', 15, 1)SELECT * FROM CategoriesReturnGO					
  2. No Microsoft Visual Basic, crie um novo projeto Standard EXE. Por padrão, é criado o Form1.
  3. No menu Project , clique em referências e, em seguida, clique para selecionar o Microsoft ActiveX Data Objects 2. x biblioteca caixa de seleção.
  4. Adicione um controle CommandButton ao Form1.
  5. Cole o código a seguir na janela de código do Form1:
        Dim cn As New ADODB.Connection    Dim cmd As New ADODB.Command    Dim rs As ADODB.Recordset    Dim sConn As String    sConn = "Provider=SQLOLEDB.1;User ID=username;Password=password;" & _            "Initial Catalog=Northwind;Data Source=ServerName"    cn.ConnectionString = sConn    cn.Open   With cmd     Set .ActiveConnection = cn     .CommandText = "myProc"     .CommandType = adCmdStoredProc     .Prepared = True   End With   Set rs = cmd.Execute   rs.NextRecordset   rs.Close   cn.Close					
  6. Modificar a seqüência de conexão ADO na variável sConn conforme apropriado para seu ambiente.
  7. Execute o projeto. Você receber resultados diferentes e mensagens de erro dependendo de critérios a seguir:

    • Nas versões MDAC 2.6 ou 2.7, o cursor está no lado do cliente e a instrução RAISERROR retorna gravidade 11 ou superior.

      resultado : RAISERROR texto aparece na coleção de erros de ADO quando o conjunto de registros é aberto. Se você tentar exibir algo do conjunto de registros, você receber a seguinte mensagem de erro:
      Operação não permitida quando o objeto é fechado.
      Se você, em seguida, chame o método Nextrecordset , ocorrerá um erro no Visual Basic, e você receber a seguinte mensagem de erro:
      Provedor atual não dá suporte a retornar vários conjuntos de registros de uma única execução.
    • Nas versões MDAC 2.6 ou 2.7, o cursor está no lado do servidor, a instrução RAISERROR retorna gravidade 11 ou superior e a configuração NOCOUNT não tem um efeito.

      resultado : se você abrir o conjunto de registros, você receber a seguinte mensagem de erro:
      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.
      Se você tentar exibir os dados do conjunto de registros, ocorre o mesmo erro e a seguinte mensagem de erro aparece na coleção de erros ADO:
      Adiada preparar não pôde ser concluída.
      Se você chamar o método Nextrecordset , você receber a seguinte mensagem de erro:
      Provedor atual não dá suporte a retornar vários conjuntos de registros de uma única execução.
    • No MDAC 2.6, o cursor está no lado do cliente ou no lado do servidor, a instrução RAISERROR retorna uma gravidade de 10 ou menos e definir NOCOUNT está ativado.

      resultado : sem erro aparece da coleção de erros do ADO e Nextrecordset funciona.
    • No MDAC 2.6, o cursor está no lado do cliente ou no lado do servidor, a instrução RAISERROR retorna uma gravidade de 10 ou menos e definir NOCOUNT está desativado.

      resultado : este resultado é semelhante ao resultado quando SET NOCOUNT ON, exceto que o método rs.open primeiro retorna um conjunto de registros vazio por causa da mensagem de registros afetados. Modo de exibição Nextrecordset para observar os dados primeiro, que são retornados. Depois disso, não ocorre nenhum erro e Nextrecordset funciona.
    • No MDAC 2.5, o cursor está no lado do cliente, a instrução RAISERROR retorna gravidade 11 ou superior e a configuração NOCOUNT não tem um efeito.

      resultado : RAISERROR texto aparece na coleção de erros de ADO quando o conjunto de registros é aberto. Se você tentar exibir algo do conjunto de registros, você receberá o seguinte erro de tempo de execução:
      Operação não permitida quando o objeto é fechado.
      Se você chamar o método Nextrecordset , você receber a seguinte mensagem de erro Visual Basic:
      Erro definido pelo aplicativo ou objeto definido
    • No MDAC 2.5, o cursor está no lado do servidor, a instrução RAISERROR retorna gravidade 11 ou superior e a configuração NOCOUNT não tem um efeito.

      resultado : quando você abre o conjunto de registros, você receber a seguinte mensagem de erro:
      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.
      Se você tentar exibir dados do conjunto de registros, o mesmo erro ocorre.

      Se você chamar o método Nextrecordset , você receber a seguinte mensagem de erro:
      Erro definido pelo aplicativo ou objeto definido
    • No MDAC 2.5, o cursor está no lado do cliente ou no lado do servidor, a instrução RAISERROR retorna uma gravidade de 10 ou menos e definir NOCOUNT está ativado.

      resultado : sem erro aparece da coleção de erros do ADO e Nextrecordset funciona.
    • No MDAC 2.5, o cursor está no lado do cliente ou no lado do servidor, a instrução RAISERROR retorna uma gravidade de 10 ou menos e definir NOCOUNT está desativado.

      resultado : O resultado é semelhante ao resultado quando SET NOCOUNT ON, exceto que o método rs.open primeiro retorna um conjunto de registros vazio por causa da mensagem de registros afetados. Modo de exibição Nextrecordset para observar os dados primeiro, que são retornados. Depois disso, não há erros e Nextrecordset funciona.
    • No MDAC 2.1, é de cursor do lado do cliente, a instrução RAISERROR retorna uma gravidade 11 ou superior e a configuração NOCOUNT não tem um efeito.

      resultado : RAISERROR texto aparece na coleção de erros de ADO quando conjunto de registros é aberto. Se você tentar exibir algo do conjunto de registros, você a seguinte mensagem erro em tempo de execução:
      A operação solicitada pelo aplicativo não é permitida se o objeto é fechado.
      Se você chamar o método Nextrecordset , você receber a seguinte mensagem de erro Visual Basic:
      Não há suporte para a operação solicitada pelo aplicativo pelo provedor.
    • No MDAC 2.1, o cursor está no lado do servidor, a instrução RAISERROR retorna gravidade 11 ou superior e a configuração NOCOUNT não tem um efeito.

      resultado : quando você abre o conjunto de registros, você receber a seguinte mensagem de erro:
      Ocorrência de erros.
      Essa mensagem de erro é exibida na coleção de erros de ADO. Se você tentar exibir dados do conjunto de registros, você receberá a mesma mensagem de erro.

      Se você chamar o método Nextrecordset , você receber a seguinte mensagem de erro:
      Não há suporte para a operação solicitada pelo aplicativo pelo provedor.
    • No MDAC 2.1, o cursor está no lado do cliente ou no lado do servidor, a instrução RAISERROR retorna uma gravidade de 10 ou menos e definir NOCOUNT está ativado.

      resultado : sem erro aparece da coleção de erros do ADO e Nextrecordset funciona.
    • No MDAC 2.1, o cursor está no lado do cliente ou no lado do servidor, a instrução RAISERROR retorna uma gravidade de 10 ou menos e definir NOCOUNT está desativado.

      resultado : O resultado é semelhante ao resultado quando definir NOCOUNT está ativado, exceto rs.open método primeiro retorna um conjunto de registros vazio por causa da mensagem de registros afetados. Modo de exibição Nextrecordset para observar os dados primeiro, que são retornados. Depois disso, não há erros e Nextrecordset funciona corretamente.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 313861 - Última Revisão: 12/07/2015 08:17:18 - Revisão: 2.1

Microsoft Data Access Components 2.1, Microsoft Data Access Components 2.5, Microsoft Data Access Components 2.6, Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbmt kbpending kbprb KB313861 KbMtpt
Comentários