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

文書翻訳 文書翻訳
文書番号: 310371 - 対象製品
この記事は、以前は次の 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 - 最終更新日: 2007年3月26日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

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