この記事は、CommandBuilder
オブジェクトを使用するときに発生するSystem.NullReferenceException
例外を解決するのに役立ちます。
元の製品バージョン: 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.CommandBuilder
から関連付けが解除され、 DataAdapter
がリンクされたときに生成されるコマンドを削除します。リンク解除または関連付けを解除すると、コマンドは null になります。 この問題は、最初からビルドするコマンドには影響しません。
解決方法
この問題を解決するには、次のいずれかの方法を使用します。
DataSet
からCommandBuilder
の関連付けを解除しないでください。- コードまたは Visual Data Tools を使用して、コマンドを自分でビルドします。
状態
この動作は仕様によるものです。
動作を再現する手順
新しい Visual Basic .NET Windows アプリケーション プロジェクトを作成します。 既定では、Form1 はプロジェクトに追加されます。
Form1 に Button コントロールを追加します。
コード ビューに切り替え、[コード] ウィンドウの上部に次のコードを追加します。
Imports System.Data.OleDb Imports System.Data.SqlClient
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.
環境に合わせて接続文字列を変更します。
F5 キーを押してコンパイルし、アプリケーションを実行します。