System.NullReferenceException se produce cuando se usa el objeto CommandBuilder

Este artículo le ayuda a resolver la System.NullReferenceException excepción que se produce cuando se usa el CommandBuilder objeto .

Versión original del producto: Visual Basic .NET
Número de KB original: 310367

Síntomas

Si usa el CommandBuilder objeto para obtener explícitamente comandos para el DataAdapter objeto como se indica a continuación:

da.InsertCommand = cb.GetInsertCommand

A continuación, ejecute el siguiente código de Visual Basic .NET:

cb.DataAdapter = Nothing

Los comandos que agrega a DataAdapter se eliminan y recibe el siguiente mensaje de error:

Se produjo una excepción no controlada del tipo "System.NullReferenceException" en app_name.exe
Información adicional: Referencia de objeto no establecida en una instancia de un objeto.

Causa

CommandBuilder elimina los comandos que genera cuando se desasocia de y DataAdapter.CommandBuilderDataAdapter están vinculados; cuando se desvinculan o desasocian, se anulan los comandos. Este problema no afecta a los comandos que se compilan desde el principio.

Solución

Use uno de los métodos siguientes para resolver este problema:

  • No desasocie de CommandBuilderDataSet.
  • Compile los comandos usted mismo, ya sea en código o a través de Visual Data Tools.

Estado

Este comportamiento es una característica del diseño de la aplicación.

Pasos para reproducir este comportamiento

  1. Cree un nuevo proyecto de aplicación de Windows de .NET de Visual Basic. Form1 se agrega al proyecto de forma predeterminada.

  2. Agregue un control Button a Form1.

  3. Cambie a la vista Código y agregue el código siguiente a la parte superior de la ventana Código:

    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    
  4. Agregue el código siguiente al Click evento de Button:

    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. Modifique el cadena de conexión según corresponda para su entorno.

  6. Presione F5 para compilar y ejecutar la aplicación.