System.NullReferenceException se produit lorsque vous utilisez l’objet CommandBuilder

Cet article vous aide à résoudre l’exception System.NullReferenceException qui se produit lorsque vous utilisez l’objet CommandBuilder .

Version d’origine du produit : Visual Basic .NET
Numéro de la base de connaissances d’origine : 310367

Symptômes

Si vous utilisez l’objet CommandBuilder pour obtenir explicitement des commandes pour l’objet DataAdapter comme suit :

da.InsertCommand = cb.GetInsertCommand

Ensuite, exécutez le code Visual Basic .NET suivant :

cb.DataAdapter = Nothing

Les commandes que vous ajoutez au DataAdapter sont supprimées et le message d’erreur suivant s’affiche :

Une exception non prise en charge de type « System.NullReferenceException » s’est produite dans app_name.exe
Informations supplémentaires : La référence d’objet n’est pas définie sur un instance d’un objet.

Cause

CommandBuilder supprime les commandes qu’il génère lorsqu’il est dissocié d’un DataAdapter.CommandBuilder et DataAdapter qu’ils sont liés ; lorsqu’ils sont dissociés ou dissociés, les commandes sont nulled. Ce problème n’affecte pas les commandes que vous générez depuis le début.

Résolution

Utilisez l’une des méthodes suivantes pour résoudre ce problème :

  • Ne dissociez pas le CommandBuilder du DataSet.
  • Générez les commandes vous-même, dans le code ou via Visual Data Tools.

Statut

Ce comportement est inhérent au produit.

Procédures pour reproduire le problème

  1. Créez un projet d’application Windows Visual Basic .NET. Form1 est ajouté au projet par défaut.

  2. Ajoutez un contrôle Button à Form1.

  3. Basculez vers la vue Code et ajoutez le code suivant en haut de la fenêtre Code :

    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    
  4. Ajoutez le code suivant à l’événement Click du Bouton :

    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. Modifiez votre chaîne de connexion en fonction de votre environnement.

  6. Appuyez sur la touche F5 pour compiler et exécuter l’application.