Microsoft KB Archive/310371

From BetaArchive Wiki

Article ID: 310371

Article Last Modified on 2/27/2007



APPLIES TO

  • Microsoft ADO.NET 2.0
  • Microsoft .NET Framework 1.1 Service Pack 1
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition



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 (myserver) as appropriate server name 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


Keywords: kbprb kbsystemdata KB310371