Exceção InvalidCastException quando você faz referência o valor de um DataColumn é NULL

Traduções deste artigo Traduções deste artigo
ID do artigo: 310371 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System.Data
  • System.Data.SqlClient
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando você faz referência o valor de um DataColumn for NULL, se digitado ou, você receberá uma exceção.

Para DataSets digitados, você recebe a seguinte exceção:
Ocorreu uma exceção sem tratamento do tipo 'System.Data.StrongTypingException' em invalidcast.exe
Obter informações adicionais: não é possível obter valor porque ele é DBNULL.
Para DataSets sem tipo, você recebe a seguinte exceção:
Ocorreu uma exceção sem tratamento do tipo 'System.InvalidCastException' em microsoft.visualbasic.dll
Obter informações adicionais: multicast do tipo 'DBNULL' digite 'Seqüência' não é válido.

Causa

Causa 1

Quando você usa um DataSet digitado, a exceção é causada quando você faz referência o valor de coluna que é NULL.

Causa 2

Quando você usa um DataSet não tipado, o valor da coluna é NULL e a variável à qual você atribui não oferece suporte NULL.

Resolução

Causa 1

Teste a coluna para NULL antes de você acessar seu valor. Em um DataSet não tipado, use o método DataRow.IsNull . Em um DataSet digitado, use a propriedade DataRow.IscolumnnameNull .

Causa 2

Use uma variável de um tipo de dados apropriado que pode armazenar NULL.

Situação

Esse comportamento é por design.

Mais Informações

Etapas para reproduzir o comportamento

  1. Inicie o Microsoft Visual Studio NET..
  2. Crie um novo projeto Windows Application no Visual Basic NET.. Form1 é adicionado para o projeto por padrão.
  3. Certifique-se que seu projeto contém uma referência ao namespace System.Data .
  4. Coloque um controle de botão em Form1.
  5. Altere a propriedade nome do botão para btnUntype e a propriedade Text como Untype .
  6. Use a declaração Imports no namespace System e o namespace System.Data , para que não é necessário para qualificar declarações esses namespaces posteriormente no seu código. Adicione o seguinte código à seção "General Declarations" do Form1:
       Imports System
       Imports System.Data
       Imports System.Data.SqlClient
    					
  7. Adicione o seguinte código no evento btnUntype :
            Dim str As String
            Dim ds As New DataSet()
            Dim r As DataRow
            Dim con As New SqlConnection("server=myserver;integrated security=sspi;database=northwind")
            Dim da As New SqlDataAdapter("select * from customers where customerid='ANTON'", con)
            da.Fill(ds, "customer")
            r = ds.Tables(0).Rows(0)
            'Uncomment to check for Null. 
            'If r.IsNull("fax") Then
            '   MessageBox.Show("Value is Null")
            'End If
            str = r("fax") 'Comment line to check for Null.
            MessageBox.Show(str) 'Comment line to check for Null.
            
    					
  8. Modificar a seqüência de conexão (myserver) como nome de servidor apropriado para seu ambiente.
  9. Salve seu projeto. No menu Debug , clique em Iniciar para executar seu projeto.
  10. Clique em Untype . Observe a exceção anterior mencionado para um DataSet não tipado.
  11. Descomente a instrução se e, em seguida, comentar as linhas abaixo da instrução IF para verificar NULL.
  12. Salve seu projeto. No menu Debug , clique em Iniciar e execute seu projeto. Observe que a caixa de mensagem exibe "Valor é nulo".
  13. Coloca outro controle de botão no Form1.
  14. Altere a propriedade nome do botão para btntype e a propriedade Text como tipo .
  15. Crie um DataSet digitado usando a tabela clientes no banco de dados Northwind. Renomeie SQLDataAdapter para sqlda .
  16. Adicione o seguinte código ao evento btntype :
            sqlda.Fill(DataSet11)
            Dim str As String
            Dim int As Integer
            Dim cust As DataSet1.CustomersRow
            cust = DataSet11.Customers.Rows(0)
            'Uncomment to catch null values.  
            'If cust.IsFaxNull Then
            '    MessageBox.Show("Value is Null")
            'End If
            str = cust.Fax() 
            MessageBox.Show(str)
            '    Comment line to check for Null.
    					
  17. Executar o aplicativo e, em seguida, clique no botão tipo . Observe a exceção.
  18. Não comentar bloco If... Then de código e, em seguida, comentários as duas últimas linhas de código.
  19. Salve o aplicativo e em seguida, executar o aplicativo e observe a caixa de mensagem.

Referências

Para obter mais informações sobre como criar um DataSet digitado, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
315678Como criar, usar DataSet digitado usando o Visual Basic .NET
Para obter mais informações sobre o ADO.NET, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
313590Mapa para o ADO.NET

Propriedades

ID do artigo: 310371 - Última revisão: terça-feira, 27 de fevereiro de 2007 - Revisão: 2.7
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbprb kbsystemdata KB310371 KbMtpt
Tradução automática
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: 310371

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com