Excepção InvalidCastException quando referenciar o valor de um DataColumn é NULL

Traduções de Artigos Traduções de Artigos
Artigo: 310371 - Ver produtos para os quais este artigo se aplica.
Este artigo faz referência à seguintes espaços de nomes Microsoft .NET Framework Class Library:
  • System.data
  • System.data.SqlClient
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando referencia o valor de um DataColumn for NULL, escrito ou sem tipos, receberá uma excepção.

Para digitado DataSets , receberá a seguinte excepção:
Ocorreu uma excepção não processada do tipo 'System.Data.StrongTypingException' no invalidcast.exe
Obter informações adicionais: não é possível obter o valor porque é DBNULL.
Para sem tipos DataSets , receberá a seguinte excepção:
Ocorreu uma excepção não processada do tipo 'System.InvalidCastException' no microsoft.visualbasic.dll
Obter informações adicionais: matiz de tipo 'DBNULL' escrever 'Cadeia' não é válido.

Causa

Causa 1

Quando utiliza um DataSet escrito, a excepção é causada quando referenciar o valor da coluna é NULL.

Causa 2

Quando utiliza um DataSet sem tipos, o valor da coluna será NULL e a variável à qual atribui-lo não suporta NULL.

Resolução

Causa 1

Teste a coluna para NULL antes de acessar o respectivo valor. Em um sem tipos DataSet , utilize o método DataRow.IsNull . Em letra de imprensa DataSet , utilize a propriedade DataRow.IscolumnnameNull .

Causa 2

Utilize uma variável de um tipo de dados apropriados que pode armazenar NULL.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

  1. Inicie o Microsoft Visual Studio NET..
  2. Crie um novo projecto de aplicação do Windows no Visual Basic .NET. Form1 é adicionado ao projecto por predefinição.
  3. Certifique-se de que o projecto contém uma referência ao espaço de nomes System.data .
  4. Coloque um controlo de botão no Form1.
  5. Altere a propriedade nome do botão para btnUntype e a propriedade de texto para Untype .
  6. Utilize a instrução de importação no espaço de nomes de sistema e o espaço de nomes System.data , para que não é necessário para qualificar declarações os espaços de nomes mais tarde no código. Adicione o seguinte código à secçã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 cadeia de ligação (omeuservidor) como nome de servidor adequado para o seu ambiente.
  9. Guarde o projecto. No menu Debug , clique em Iniciar para executar o projecto.
  10. Clique em Untype . Repare a excepção anteriores mencionadas para um DataSet sem tipos.
  11. Uncomment a instrução se e comentário, em seguida, as linhas abaixo da instrução IF para verificar a existência NULL.
  12. Guarde o projecto. No menu Debug , clique em Iniciar e, em seguida, execute o projecto. Note que a caixa de mensagem apresenta "Nulo é do valor".
  13. Coloque a outro controlo de botão no Form1.
  14. Altere a propriedade nome do botão para btntype e a propriedade de texto para o tipo .
  15. Crie um DataSet escrito utilizando a tabela clientes na base de dados Adamastor. Mude o nome 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 a aplicação e, em seguida, clique no botão tipo . Repare a excepção.
  18. Uncomment If... Then bloco de código e, em seguida, as duas últimas linhas de código de comentário.
  19. Guarde a aplicação, em seguida, executar a aplicação e repare a caixa de mensagem.

Referências

Para obter mais informações sobre como criar um DataSet introduzido, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
315678Como criar, utilizar DataSet escrito utilizando o Visual Basic .NET
Para obter mais informações sobre o ADO.NET, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
313590Informações gerais para ADO.NET

Propriedades

Artigo: 310371 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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