Das CommandBuilder-Objekt kann neu einen Befehl erstellen Sie versuchen, während des nächsten Aufrufs der DataAdapter.Update-Methode zu ändern, und Ihre Änderungen des Befehls möglicherweise verloren gehen

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

310366
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Dieser Artikel bezieht sich auf das folgende Klassenbibliothek von Framework-Namespace des Microsofts:
  • System.Data.SqlClient
Problembeschreibung
Das Objekt kann neu einen Befehl erstellen, dass Sie versuchen, während des nächsten Aufrufs der Methode zu ändern, und Ihre Änderungen des Befehls gehen möglicherweise verloren. Dieses Problem tritt unter den folgenden Bedingungen auf
  • Wenn verknüpfen Sie ein Objekt mit einem Objekt .
  • Wenn verwenden Sie die Methode , oder des Objekts explizit zu dem Zuweisen von Befehlen zu dem .
  • Dass Sie das einem der Befehle ändern generiert.
Wenn Sie versuchen, den -Methode des aufzurufen, wird folgende Fehlermeldung möglicherweise Ihnen angezeigt:
Eine nicht behandelte Ausnahme des Typs 'System.Data.SqlClient.SqlException' ist in system.data.dll aufgetrete
Ursache
Dieses Problems wird dadurch verursacht, dass die Befehle dynamisch ändert, die wieder auf dem ursprünglichen Befehl von es erstellt werden.
Lösung
Wenden Sie eine der folgenden Methoden an, um dieses Problem zu beheben:
  • Ändern Sie nicht Befehle, die von erstellt werden. ändert Objekte nicht, das Sie sich erstellen.
  • In einem neuen kopieren Sie die Objekte , und (in dem Abschnitt "Weitere Informationen" für ein Beispiel siehe). Die neue Variable derselbe Gültigkeitsbereich muss haben oder schmaler als die alte Variable.
  • Verwenden Sie überhaupt nicht. Schreiben Sie eigenes Ihr Objekte oder verwenden Sie Visual Data Tools, um sie zu schreiben.
Status
Es handelt sich hierbei um ein beabsichtigtes Verhalten.
Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie ein neues Visual Basic Windows-Anwendungsprojekt Dem Projekt wird standardmäßig "Form1" hinzugefügt
  2. Doppelklicken Sie auf das Formular und fügen Sie den folgenden Code oben in das Codefenster ein
    Imports System.Data.SqlClient					
  3. Fügen Sie zu Form1 ein Steuerelement hinzu.
  4. Doppelklicken Sie auf die Schaltfläche, und fügen Sie dem Ereignis den folgenden Code hinzu:
    Dim cn As New SqlConnection()        Dim custDS As New DataSet()        Dim da1 As New SqlDataAdapter()        Dim da2 As New SqlDataAdapter()        Dim dr As DataRow        Dim cb As SqlCommandBuilder        cn.ConnectionString = "server=servername;database=northwind;uid=sa;pwd=password;"        cn.Open()        da1 = New SqlDataAdapter("select * from Customers", cn)        cb = New SqlCommandBuilder(da1)        da1.Fill(custDS, "Customers")        'Get the original commands.        da1.InsertCommand = cb.GetInsertCommand        da1.DeleteCommand = cb.GetDeleteCommand        da1.UpdateCommand = cb.GetUpdateCommand        Debug.WriteLine("Original command length: " & da1.InsertCommand.CommandText.Length)        'Modify the Insert command.        da1.InsertCommand.CommandText = "select * from customers where customerid=@@identity"        da1.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord        da2.InsertCommand = da1.InsertCommand        da2.DeleteCommand = da1.DeleteCommand        da2.UpdateCommand = da1.UpdateCommand        'Add a record to the table.        Dim tblCust As DataTable        tblCust = custDS.Tables("Customers")        Dim drCust As DataRow        drCust = tblCust.NewRow()        drCust("CustomerID") = "ZYYYY"        drCust("CompanyName") = "Zora's Yummies"        drCust("ContactName") = "Christophe Namby"        drCust("ContactTitle") = "Assistant Manager"        tblCust.Rows.Add(drCust)        'Update the backend.        Debug.WriteLine("Length da1 before insert: " & da1.InsertCommand.CommandText.Length)        da1.Update(custDS, "Customers")        Debug.WriteLine("Length da1 after insert: " & da1.InsertCommand.CommandText.Length)        Debug.WriteLine("length da2 before insert: " & da2.InsertCommand.CommandText.Length)        da2.Update(custDS, "Customers")        Debug.WriteLine("Length da2 after insert: " & da2.InsertCommand.CommandText.Length)					
  5. Ändern Sie die mit Ihrem Microsoft SQL Server-Computer zu verbindende Verbindungszeichenfolge.
  6. Drücken Sie die Taste [F5], um den Code auszuführen
  7. Um dieses Problem zu umgehen, kommentieren Sie die folgende Zeile aus
            da1.Update(custDS, "Customers")					
Diese Auflösung funktioniert, da das Ereignis auf dem (" Da1 ") verknüpft, damit es bezeichnet, wann die Befehle generiert werden. Wenn Sie die Befehle in einem anderen (" Da2 ") kopieren wird nicht länger in seinen Ereignissen verknüpft und ändert sie nicht.

Variablenbereich ist wichtig, weil seinen Befehle auf ( oder in Visual C#) festlegt, wenn "Da1" und (" Cb ") Gültigkeitsbereich verlassen und wenn Garbage Collection stattfindet. Daher können Sie diese Befehle nicht für "Da2" verwenden. Der Methodenaufruf kann vorübergehende NullReferenceException-Fehler auslösen, da Garbage Collection zu zufälligen Zeitpunkten stattfinden kann.
not saved take effect

Warnung: Dieser Artikel wurde automatisch übersetzt

Eigenschaften

Artikelnummer: 310366 – Letzte Überarbeitung: 02/24/2014 06:07:39 – Revision: 1.7

  • Microsoft ADO.NET 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic 2005
  • kbnosurvey kbarchive kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata KB310366 KbMtde kbmt
Feedback