現在オフラインです。再接続するためにインターネットの接続を待っています

NULL の DataColumn の値を参照すると InvalidCastException 例外が発生する

この記事は、以前は次の ID で公開されていました: JP310371
この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.Data
  • System.Data.SqlClient
現象
DataColumn の値が NULL の場合、この値を参照すると、型指定されているかどうかに関係なく、例外が発生します。

型指定されたデータセットの場合、次の例外が発生します。
'System.Data.StrongTypingException' のハンドルされていない例外が invalidcast.exe で発生しました。
追加情報 : Cannot get value because it is DBNULL.
型指定されていないデータセットの場合、次の例外が発生します。
'System.InvalidCastException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。
追加情報 : 型 'DBNULL' から型 'String' へのキャストが有効ではありません。
原因

原因 1

型指定されたデータセットを使用すると、NULL の列値を参照したときに例外が発生します。

原因 2

型指定されていないデータセットを使用する際に、列の値が NULL で、それを代入した変数が NULL をサポートしていません。
解決方法

原因 1

列の値にアクセスする前に NULL のテストを行います。型指定されていないデータセットでは、DataRow.IsNull メソッドを使用します。型指定されたデータセットでは、DataRow.IscolumnnameNull プロパティを使用します。

原因 2

NULL を格納できる適切なデータ型の変数を使用します。
状況
この動作は仕様です。
詳細

現象の再現手順

  1. Microsoft Visual Studio .NET を起動します。
  2. Visual Basic .NET で Windows アプリケーション プロジェクトを新規作成します。デフォルトで Form1 がプロジェクトに追加されます。
  3. プロジェクトで System.Data 名前空間を参照していることを確認します。
  4. Button コントロールを Form1 に配置します。
  5. ボタンの Name プロパティを btnUntype に、Text プロパティを Untype に変更します。
  6. System の名前空間および System.Data の名前空間に対応する Imports ステートメントを追加します。これにより、以降のコードではこれらの名前空間に含まれる宣言の修飾子が不要になります。次のコードを Form1 の General Declarations セクションに追加します。
       Imports System   Imports System.Data   Imports System.Data.SqlClient					
  7. 次のコードを btnUntype の Click イベントに追加します。
            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. 接続文字列 (myserver) は、使用している環境のサーバー名に合わせて変更してください。
  9. プロジェクトを保存します。[デバッグ] メニューの [開始] (または [デバッグ開始]) をクリックしてプロジェクトを実行します。
  10. [Untype] をクリックします。上記に示した、型指定されていないデータセットの場合の例外が発生することを確認してください。
  11. IF ステートメントのコメントを外して、NULL のチェックを行う IF ステートメントの下にある行をコメント アウトします。
  12. プロジェクトを保存します。[デバッグ] メニューの [開始] をクリックして、プロジェクトを実行します。メッセージ ボックスに "Value is Null "と表示されることを確認してください。
  13. 別の Button コントロールを Form1 の上に配置します。
  14. ボタンの Name プロパティを btntype に、Text プロパティを type に変更します。
  15. Northwind データベースの customers テーブルを使用して、型指定されたデータセットを作成します。SQLDataAdapter の名前を sqlda に変更します。
  16. 次のコードを btntype の Click イベントに追加します。
            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. アプリケーションを実行して、[type] ボタンをクリックします。例外が発生することを確認してください。
  18. コード内の If...Then ブロックのコメントを外し、コード内の最後の 2 行をコメント アウトします。
  19. アプリケーションを保存してからアプリケーションを実行し、メッセージ ボックスを確認してください。
関連情報
型指定されたデータセットの作成方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
315678 Visual Basic .NET を使用して型指定されたデータセットを作成して使用する方法
ADO.NET の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
313590 [INFO] ADO.NET のロードマップ
プロパティ

文書番号:310371 - 最終更新日: 03/26/2007 01:49:41 - リビジョン: 2.6

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

  • kbprb kbsystemdata KB310371
フィードバック