Excepción de InvalidCastException cuando se hace referencia en el valor de un objeto DataColumn que es NULL

Seleccione idioma Seleccione idioma
Id. de artículo: 310371 - Ver los productos a los que se aplica este artículo
En este artículo se refiere a los siguientes espacios de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.Data
  • System.Data.SqlClient
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se hace referencia, el valor de un objeto DataColumn que es NULL, ya sea con o sin tipo, recibirá una excepción.

Para conjuntos de datosde tipo, recibirá la siguiente excepción:
Se ha producido una excepción no controlada del tipo 'System.Data.StrongTypingException' en invalidcast.exe
Información adicional: no se puede obtener el valor porque es DBNULL.
Para los conjuntos de datosde sin tipo, recibirá la siguiente excepción:
Se ha producido una excepción no controlada del tipo 'System.InvalidCastException' en microsoft.visualbasic.dll
Obtener información adicional: la conversión de tipo 'DBNULL' tipo 'String' no es válida.

Causa

Causa 1

Cuando se utiliza el conjunto de datoscon tipo, la excepción se produce cuando se hace referencia en el valor de la columna es NULL.

Causa 2

Cuando se utiliza un sin tipo de conjunto de datos, el valor de la columna es NULL, y la variable a la que se asigna no admite NULL.

Solución

Causa 1

Comprobar la columna NULL antes de tener acceso a su valor. En un conjunto de datosde sin tipo, utilice el método DataRow.IsNull . En un Conjunto de datoscon tipo, utilice la propiedad DataRow.IscolumnnameNull .

Causa 2

Utilizar una variable de un tipo de datos adecuado que puede almacenar el valor NULL.

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

  1. Inicie Microsoft Visual Studio. NET.
  2. Cree un nuevo proyecto de aplicación para Windows en Visual Basic. NET. Se agregará Form1 al proyecto de forma predeterminada.
  3. Asegúrese de que el proyecto contiene una referencia a la System.Data espacio de nombres.
  4. Lugar un Botón control en Form1.
  5. Cambiar el Nombre propiedad del botón a btnUntype y el Texto propiedad Untype.
  6. Utilice el Importaciones instrucción en el Sistema de espacio de nombres y el System.Data espacio de nombres, para que no tenga que suministrar declaraciones de dichos espacios de nombres más adelante en el código. Agregue el código siguiente a la sección "General Declarations" de Form1:
       Imports System
       Imports System.Data
       Imports System.Data.SqlClient
    					
  7. Agregue el código siguiente en el btnUntype evento:
            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. Modifique la cadena de conexión (myserver) como nombre de servidor adecuado para yourenvironment.
  9. Guardar el proyecto. En el menú Depurar , haga clic en Iniciar para ejecutar el proyecto.
  10. Haga clic en Untype. Observe la excepción mencionada anteriormente para una sin tipo Conjunto de datos.
  11. Quite el comentario de la IF instrucción, y, a continuación, comente las líneas siguientes del IF instrucción para comprobar el valor NULL.
  12. Guardar el proyecto. En el menú Depurar , haga clic en Inicioy, a continuación, ejecute el proyecto. Observe que el cuadro de mensaje muestra "Valor nulo".
  13. Otro lugar Botón control en Form1.
  14. Cambiar el Nombre propiedad del botón a btntype y el Texto propiedad tipo.
  15. Crear un escrito Conjunto de datos mediante el uso de la tabla customers en la base de datos Northwind. Cambiar el nombre de la SQLDataAdapter para SQLDA.
  16. Agregue el código siguiente a la btntype evento:
            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. Ejecute la aplicación y, a continuación, haga clic en el botón de tipo . Observe la excepción.
  18. Quite el comentario de la If...Luego bloque de código y, a continuación, comente las dos últimas líneas de código.
  19. Guarde la aplicación y, a continuación, ejecute la aplicación y observe el cuadro de mensaje.

Referencias

Para obtener más información acerca de cómo crear un DataSet con tipo, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
315678 Cómo crear, utilizar DataSet con tipo mediante Visual Basic .NET
Para obtener más información acerca de ADO.NET, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
313590 Guía básica de ADO.NET

Propiedades

Id. de artículo: 310371 - Última revisión: lunes, 16 de septiembre de 2013 - Versión: 5.0
La información de este artículo se refiere a:
  • Microsoft ADO.NET 2.0
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palabras clave: 
kbprb kbsystemdata kbmt KB310371 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 310371

Enviar comentarios

 

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