InvalidCastException exception when you reference the value of a DataColumn that is NULL (310371)



The information in this article applies to:

  • Microsoft ADO.Net 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET (2002)
  • Microsoft Visual Basic .NET (2003)

This article was previously published under Q310371
This article refers to the following Microsoft .NET Framework Class Library namespaces:
  • System.Data
  • System.Data.SqlClient

SYMPTOMS

When you reference the value of a DataColumn that is NULL, whether typed or untyped, you receive an exception.

For typed DataSets, you receive the following exception:
An unhandled exception of type 'System.Data.StrongTypingException' occurred in invalidcast.exe
Additional information: Cannot get value because it is DBNULL.
For untyped DataSets, you receive the following exception:
An unhandled exception of type 'System.InvalidCastException' occurred in microsoft.visualbasic.dll
Additional information: Cast from type 'DBNULL' to type 'String' is not valid.

CAUSE

Cause 1

When you use a typed DataSet, the exception is caused when you reference the column value that is NULL.

Cause 2

When you use an untyped DataSet, the value of the column is NULL, and the variable to which you assign it does not support NULL.

RESOLUTION

Cause 1

Test the column for NULL before you access its value. In an untyped DataSet, use the DataRow.IsNull method. In a typed DataSet, use the DataRow.IscolumnnameNull property.

Cause 2

Use a variable of an appropriate data type that can store NULL.

STATUS

This behavior is by design.

MORE INFORMATION

Steps to reproduce the behavior

  1. Start Microsoft Visual Studio .NET.
  2. Create a new Windows Application project in Visual Basic .NET. Form1 is added to the project by default.
  3. Make sure that your project contains a reference to the System.Data namespace.
  4. Place a Button control on Form1.
  5. Change the Name property of the button to btnUntype and the Text property to Untype.
  6. Use the Imports statement in the System namespace and the System.Data namespace, so that you are not required to qualify declarations in those namespaces later in your code. Add the following code to the "General Declarations" section of Form1:
       Imports System
       Imports System.Data
       Imports System.Data.SqlClient
    					
  7. Add the following code in the btnUntype event:
            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. Modify the connection string (myConnString) as appropriate for your environment.
  9. Save your project. On the Debug menu, click Start to run your project.
  10. Click Untype. Notice the earlier-mentioned exception for an untyped DataSet.
  11. Uncomment the IF statement, and then comment the lines below the IF statement to check for NULL.
  12. Save your project. On the Debug menu, click Start, and then run your project. Notice that the message box displays "Value is Null".
  13. Place another Button control on Form1.
  14. Change the Name property of the button to btntype and the Text property to type.
  15. Create a typed DataSet by using the customers table in the Northwind database. Rename the SQLDataAdapter to sqlda.
  16. Add the following code to the btntype event:
            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. Run the application, and then click the type button. Notice the exception.
  18. Uncomment the If...Then block of code, and then comment the last two lines of code.
  19. Save the application, and then run the application and notice the message box.

REFERENCES

For more information about creating a typed DataSet, click the following article number to view the article in the Microsoft Knowledge Base:

315678 How to create, use typed DataSet by using Visual Basic .NET

For more information about ADO.NET, click the following article number to view the article in the Microsoft Knowledge Base:

313590 Roadmap for ADO.NET


Modification Type:MinorLast Reviewed:10/3/2006
Keywords:kbprb kbSystemData KB310371 kbAudDeveloper