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 objeto CommandBuilder para obtener explícitamente comandos para el objeto DataAdapter de la siguiente manera:

da.InsertCommand = cb.GetInsertCommand

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

cb.DataAdapter = Nothing

Los comandos que agregue 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 están desvinculados o desasociados, los comandos se anulan. Este problema no afecta a los comandos que se compilan desde el principio.

Resolución

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

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

Estado

Este comportamiento es por diseño.

Pasos para reproducir el comportamiento

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

  2. Agregue un control de botón 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 del botón:

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

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