System.NullReferenceException は、CommandBuilder オブジェクトを使用するときに発生します

この記事は、オブジェクトを System.NullReferenceException 使用するときに発生する例外を CommandBuilder 解決するのに役立ちます。

元の製品バージョン: Visual Basic .NET
元の KB 番号: 310367

現象

オブジェクトを使用して、オブジェクトの CommandBuilder コマンドを次のように明示的に取得する DataAdapter 場合:

da.InsertCommand = cb.GetInsertCommand

次に、次の Visual Basic .NET コードを実行します。

cb.DataAdapter = Nothing

DataAdapter 追加したコマンドは削除され、次のエラー メッセージが表示されます。

型 'System.NullReferenceException' の未処理の例外が app_name.exe で発生しました
追加情報: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

原因

CommandBuilderは、 からDataAdapter関連付けが解除され、リンクされている場合に生成されるコマンドをDataAdapter.CommandBuilder削除します。リンク解除または関連付け解除されると、コマンドは null になります。 この問題は、最初からビルドするコマンドには影響しません。

解決方法

この問題を解決するには、次のいずれかの方法を使用します。

  • から DataSetCommandBuilder関連付け解除しないでください。
  • コード内または Visual Data Tools を使用して、コマンドを自分でビルドします。

状態

この動作は仕様です。

動作の再現手順

  1. 新しい Visual Basic .NET Windows アプリケーション プロジェクトを作成します。 Form1 は既定でプロジェクトに追加されます。

  2. Form1 に Button コントロールを追加します。

  3. [コード] ビューに切り替え、[コード] ウィンドウの上部に次のコードを追加します。

    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    
  4. Button のイベントに Click 次のコードを追加します。

    Dim con As New SqlConnection("server=myserver;uid=sa;pwd=mypassword;" & _
                                "database=northwind")
    Dim da As New SqlDataAdapter("Select * From Customers", con)
    Dim cb As New SqlCommandBuilder(da)
    Dim cmdInsert As New SqlCommand( _
            "Insert Into Customer (CustomerID) Value ('AAAAA')", con)
    da.InsertCommand = cmdInsert
    da.UpdateCommand = cb.GetUpdateCommand
    da.DeleteCommand = cb.GetDeleteCommand
    Debug.WriteLine(da.InsertCommand.CommandText)
    Debug.WriteLine(da.DeleteCommand.CommandText)
    cb.DataAdapter = Nothing ' Comment out this line to avoid the error.
    cb = Nothing
    Debug.WriteLine(da.InsertCommand.CommandText)
    Debug.WriteLine(da.DeleteCommand.CommandText)'Error occurs here.
    
  5. 環境に応じて接続文字列を変更します。

  6. F5 キーを押してコンパイルし、アプリケーションを実行します。