System.NullReferenceException si verifica quando si utilizza l'oggetto CommandBuilder

Questo articolo consente di risolvere l'eccezione System.NullReferenceException che si verifica quando si usa l'oggetto CommandBuilder .

Versione originale del prodotto: Visual Basic .NET
Numero KB originale: 310367

Sintomi

Se si usa l'oggetto CommandBuilder per ottenere in modo esplicito i comandi per l'oggetto DataAdapter come indicato di seguito:

da.InsertCommand = cb.GetInsertCommand

Eseguire quindi il codice .NET di Visual Basic seguente:

cb.DataAdapter = Nothing

I comandi aggiunti a DataAdapter vengono eliminati e viene visualizzato il messaggio di errore seguente:

Eccezione non gestita di tipo 'System.NullReferenceException' in app_name.exe
Informazioni aggiuntive: riferimento all'oggetto non impostato su un'istanza di un oggetto.

Causa

CommandBuilder elimina i comandi generati quando viene disassociato da un DataAdapter.CommandBuilder oggetto e DataAdapter sono collegati. Quando vengono scollegati o disassociati, i comandi vengono null. Questo problema non influisce sui comandi compilati dall'inizio.

Risoluzione

Per risolvere il problema, usare uno dei metodi seguenti:

  • Non dissociare l'oggetto CommandBuilderDataSetda .
  • Compilare i comandi manualmente, nel codice o tramite Visual Data Tools.

Stato

Si tratta di un comportamento legato alla progettazione del prodotto.

Passaggi per riprodurre il comportamento

  1. Creare un nuovo progetto applicazione Windows .NET di Visual Basic. Form1 viene aggiunto al progetto per impostazione predefinita.

  2. Aggiungere un controllo Button a Form1.

  3. Passare alla visualizzazione Codice e aggiungere il codice seguente all'inizio della finestra Codice:

    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    
  4. Aggiungere il codice seguente all'evento Click di 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. Modificare il stringa di connessione in base alle esigenze dell'ambiente.

  6. Premere F5 per compilare ed eseguire l'applicazione.