Microsoft KB Archive/310371

= InvalidCastException exception when you reference the value of a DataColumn that is NULL =

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 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.



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.



Steps to reproduce the behavior
 Start Microsoft Visual Studio .NET. Create a new Windows Application project in Visual Basic .NET. Form1 is added to the project by default. Make sure that your project contains a reference to the System.Data namespace. Place a Button control on Form1. Change the Name property of the button to btnUntype and the Text property to Untype .</li>  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 &quot;General Declarations&quot; section of Form1: Imports System Imports System.Data Imports System.Data.SqlClient </li>  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(&quot;server=myserver;integrated security=sspi;database=northwind&quot;) Dim da As New SqlDataAdapter(&quot;select * from customers where customerid='ANTON'&quot;, con) da.Fill(ds, &quot;customer&quot;) r = ds.Tables(0).Rows(0) 'Uncomment to check for Null. 'If r.IsNull(&quot;fax&quot;) Then '  MessageBox.Show(&quot;Value is Null&quot;) 'End If       str = r(&quot;fax&quot;) 'Comment line to check for Null. MessageBox.Show(str) 'Comment line to check for Null. </li> Modify the connection string (myserver) as appropriate server name for your environment.</li> Save your project. On the Debug menu, click Start to run your project.</li> Click Untype. Notice the earlier-mentioned exception for an untyped DataSet.</li> Uncomment the IF statement, and then comment the lines below the IF statement to check for NULL.</li> Save your project. On the Debug menu, click Start, and then run your project. Notice that the message box displays &quot;Value is Null&quot;.</li> Place another Button control on Form1.</li> Change the Name property of the button to btntype and the Text property to type.</li> Create a typed DataSet by using the customers table in the Northwind database. Rename the SQLDataAdapter to sqlda.</li>  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(&quot;Value is Null&quot;) 'End If       str = cust.Fax MessageBox.Show(str) '   Comment line to check for Null. </li> Run the application, and then click the type button. Notice the exception.</li> Uncomment the If...Then block of code, and then comment the last two lines of code.</li> Save the application, and then run the application and notice the message box.</li></ol>

<div class="references_section">