System.NullReferenceException tritt auf, wenn Sie das CommandBuilder-Objekt verwenden

Dieser Artikel hilft Ihnen, die System.NullReferenceException Ausnahme zu beheben, die auftritt, wenn Sie das CommandBuilder Objekt verwenden.

Originalversion des Produkts:   Visual Basic .NET
Ursprüngliche KB-Nummer:   310367

Problembeschreibung

Wenn Sie das CommandBuilder Objekt zum expliziten Abrufen von Befehlen für das DataAdapter Objekt wie folgt verwenden:

da.InsertCommand = cb.GetInsertCommand

Führen Sie dann den folgenden Visual Basic .NET-Code aus:

cb.DataAdapter = Nothing

Die Befehle, die Sie dem DataAdapter hinzufügen, werden gelöscht, und Sie erhalten die folgende Fehlermeldung:

Eine unbehandelte Ausnahme vom Typ "System.NullReferenceException" ist in app_name.exe
Zusätzliche Informationen: Der Objektbezug ist nicht auf eine Instanz eines Objekts festgelegt.

Ursache

CommandBuilder löscht die Befehle, die generiert werden, wenn sie von einem DataAdapter.CommandBuilder aufgehoben werden und DataAdapter verknüpft sind. Wenn sie nicht verknüpft oder nicht verknüpft sind, werden die Befehle nulliert. Dieses Problem wirkt sich nicht auf Befehle aus, die Sie von Anfang an erstellen.

Lösung

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu beheben:

  • Trennen Sie nicht die Zuordnung von der CommandBuilder DataSet.
  • Erstellen Sie die Befehle selbst, entweder im Code oder mithilfe von Visual Data Tools.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie ein neues Visual Basic .NET Windows Application-Projekt. Form1 wird dem Projekt standardmäßig hinzugefügt.

  2. Fügen Sie formular1 ein Schaltflächensteuerelement hinzu.

  3. Wechseln Sie zur Codeansicht, und fügen Sie oben im Codefenster den folgenden Code hinzu:

    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    
  4. Fügen Sie dem Click Ereignis der Schaltfläche den folgenden Code hinzu:

    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. Ändern Sie die Verbindungszeichenfolge entsprechend ihrer Umgebung.

  6. Drücken Sie F5, um die Anwendung zu kompilieren und auszuführen.