Um erro "Inválido tentar ler do ordinal de coluna" ocorre quando você usa o DataReader em translation from VPE for Csharp Visual

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: 308614
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 308069.

Este artigo se refere ao seguinte namespace Microsoft .NET Framework Class Library:
  • System.Data.SqlClient
Sintomas
Ao usar o DataReader para ler uma linha, se você tentar acessar colunas na linha, você recebe uma mensagem de erro semelhante à seguinte:
System.InvalidOperationException: Inválida tentativa de leitura da coluna ordinal '0'. Com CommandBehavior.SequentialAccess, você pode apenas ler do ordinal de coluna '2' ou superior.
Causa
Esse problema ocorre porque você executou OleDbCommand ou SqlCommand com o sinalizador System.Data.CommandBehavior.SequentialAccess definido, mas não acessar as colunas seqüencialmente.
Resolução
Use um dos seguintes métodos para contornar este problema:
  • Leia cada coluna apenas uma vez e na seqüência em que ele é definido pela consulta SELECT.

    Observação : por razões de desempenho, que são listados na seção "Mais informações", isso é a resolução preferencial.
  • Não use CommandBehavior.SequentialAccess . Se você não usar CommandBehavior.SequentialAccess , você poderá acessar uma coluna em uma linha duas vezes e ler colunas fora de seqüência.
Situação
Esse comportamento é por design.
Mais Informações
Definir o sinalizador CommandBehavior.SequentialAccess faz com que o DataReader ler linhas e colunas seqüencialmente. Não são armazenados em buffer as linhas e colunas. Depois de ler após uma coluna, ele é retirado da memória. Qualquer tentativa de nova leitura a coluna ou ler anteriormente ler resultados de colunas em uma exceção.

Usando o sinalizador CommandBehavior.SequentialAccess fornece um benefício de desempenho, especialmente quando usar campos de Binary Large Object (BLOB, objeto binário EXTENSO). Se você não usar SequentialAccess , todos os dados BLOB é copiado para o cliente. Isso pode consumir muitos recursos do.

CommandBehavior.SequentialAccess também melhora o desempenho ao acessar campos não-BLOB. Quando CommandBehavior.SequentialAccess não está definida, você pode acessar uma coluna fora de ordem; no entanto, você incorrer em sobrecarga seguinte:
  • A coluna é verificada para ver se a coluna é posterior a uma coluna acessada anterior.
  • Os dados para todas as colunas acessadas anteriormente são recuperados e armazenadas em cache para recuperação posterior possível.
Colunas devem ser verificadas e armazenados em cache porque quando você usa o DataReader , o fluxo subjacente é forward-only para linhas, bem como acesso de coluna.

Etapas para reproduzir o comportamento

Este exemplo utiliza o banco de dados Northwind fornecido com o Microsoft SQL Server.
  1. No Visual Studio. NET, crie um novo aplicativo do Windows translation from VPE for Csharp Visual. Form1 é adicionado para o projeto por padrão.
  2. Adicionar um controle de botão a Form1; Button1 é adicionado por padrão.
  3. Abra a janela código do Form1 e, em seguida, cole o seguinte código na parte superior da janela de código:
    using System.Data;using System.Data.SqlClient;					
  4. Abrir a janela de código para o Button1 e cole o código a seguir o procedimento de evento Button1_Click :
    SqlConnection myConnection = new SqlConnection();// Modify this connection string to use your SQL Server and logins.myConnection.ConnectionString = "Server=server;uid=login;pwd=password;database=northwind";			SqlCommand myCommand = new SqlCommand();myCommand.CommandText = "SELECT FirstName, LastName FROM Employees";		myConnection.Open();myCommand.Connection = myConnection;// SequentialAccess gives forward-only reading of columnsSqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.SequentialAccess);//Uncomment the following line, and comment the preceding line to work around.//SqlDataReader myReader = myCommand.ExecuteReader();try {	// Read only the first row.	myReader.Read();	// Display the LastName and then the FirstName of the row.	MessageBox.Show(myReader["LastName"].ToString() + ", " + myReader["FirstName"].ToString());	// Uncomment the following line, and comment the preceding line to work around.	//MessageBox.Show(myReader["FirstName"].ToString() + " " + myReader["LastName"].ToString());	}catch (System.Exception ex) { 	MessageBox.Show(ex.ToString());	}finally 	{	// Always call Close when done reading.	myReader.Close();	myConnection.Close();        }
  5. Modifique a seguinte linha:
    myConnection.ConnectionString = "Server=server;uid=login;pwd=password;database=northwind";						
    usar o nome do servidor do SQL Server e o logon.
  6. Com CommandBehavior.SequentialAccess sinalizador definido, tente acessar as colunas fora de seqüência da seguinte maneira:
    1. Pressione F5 para compilar e executar o aplicativo cliente. Observe o erro é exibido.
    2. Clique em OK para ignorar o erro. Pare o projeto em execução para retornar para o ambiente de design.
  7. Com CommandBehavior.SequentialAccess sinalizador definido, tente acessar colunas em seqüência que eles são definidos na instrução SELECT da seguinte maneira:
    1. Descomente a linha seguinte
         //MessageBox.Show(myReader["FirstName"].ToString() + " " + myReader["LastName"].ToString());
    2. Comente a linha
         MessageBox.Show(myReader["LastName"].ToString() + ", " + myReader["FirstName"].ToString());						
    3. Pressione F5 para compilar e executar o aplicativo cliente. Os dados de coluna são exibidos sem erro.
    4. Clique em OK para fechar a caixa de mensagem. Pare o projeto em execução para retornar para o ambiente de design.
  8. Com CommandBehavior.SequentialAccess sinalizador não definido, tente acessar colunas fora de seqüência da seguinte maneira:
    1. Comentar as linhas
      SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.SequentialAccess);						
      - e -
      MessageBox.Show(myReader["FirstName"].ToString() + " " + myReader["LastName"].ToString());						
    2. Descomente as linhas
      //SqlDataReader myReader = myCommand.ExecuteReader();
      - e -
      MessageBox.Show(myReader["LastName"].ToString() + ", " + myReader["FirstName"].ToString());						
    3. Pressione F5 para compilar e executar o aplicativo cliente. Os dados de coluna são exibidos sem erro.
    4. Clique em OK para fechar a caixa de mensagem. Pare o projeto em execução para retornar para o ambiente de design.
Referências
Para obter mais informações, consulte o tópico "Membro de enumeração SequentialAccess" na documentação do Visual Studio .NET Help.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 308614 - Última Revisão: 12/11/2006 20:14:48 - Revisão: 2.6

Microsoft ADO.NET 2.0, Microsoft ADO.NET (included with the .NET Framework), Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# 2005

  • kbmt kbtshoot kberrmsg kbdatabase kbprb kbsqlclient kbsystemdata KB308614 KbMtpt
Comentários