Objekt CommandBuilder může znovu sestavit příkaz pokusíte upravit během další volání metody DataAdapter.Update a změny příkazu budou pravděpodobně ztraceny

Překlady článku Překlady článku
ID článku: 310366 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Tento článek se týká následujícího oboru názvů knihovny tříd technologie Microsoft .NET Framework:
  • System.data.SqlClient
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Objekt CommandBuilder může znovu sestavit příkaz pokusíte upravit během další volání metody DataAdapter.Update a změny příkazu budou pravděpodobně ztraceny. Tento problém nastane za následujících okolností:
  • Pokud objekt CommandBuilder přidružit objekt DataAdapter.
  • Pokud používáte metodu GetInsertCommand, GetUpdateCommand nebo GetDeleteCommand objektu CommandBuilder explicitně přiřadit příkazy DataAdapter.
  • Pokud upravíte příkazy generuje CommandBuilder.
Při pokusu o volání metody UpdateDataAdapter obdržet následující chybovou zprávu:
Došlo k neošetřené výjimce typu 'System.data.SqlClient.SqlException v system.data.dll

Příčina

K tomuto problému dochází, protože CommandBuilder dynamicky mění příkazy generuje zpět na původní příkaz.

Řešení

Chcete-li tento problém vyřešit, použijte jednu z následujících metod:
  • Neupravujte příkazy generuje CommandBuilder. CommandBuilder nezmění objekty příkaz sestavit sami.
  • Zkopírujte objekty InsertCommand, událost DeleteCommand a vlastnost UpdateCommand nové DataAdapter (viz části "Další informace" příklad). Nové DataAdapter proměnná musí mít stejné oboru nebo užší jako staré DataAdapter proměnnou.
  • Nepoužívejte CommandBuilder vůbec. Zapsat vlastní příkaz objekty nebo pomocí nástroje Visual dat jejich zápisu.

Prohlášení

Toto chování je záměrné.

Další informace

Kroky pro reprodukci tohoto chování

  1. Vytvořit nový projekt aplikace Visual Basic Windows. Ve výchozím nastavení je Form1 přidán do projektu.
  2. Poklepejte na formulář a přidejte následující kód v horní části okna kód:
    Imports System.Data.SqlClient
    					
  3. Přidání ovládacího prvku tlačítko Form1.
  4. Poklepejte na tlačítko a přidejte následující kód události Click:
    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. Upravit řetězec připojení připojit k počítači Microsoft SQL Server.
  6. Stisknutím klávesy F5 spustit kód.
  7. Komentář mimo tento problém lze vyřešit následující řádek:
            da1.Update(custDS, "Customers")
    					
Toto řešení funguje, protože CommandBuilder zavěsí RowUpdating událost na DataAdapter ("da1") zná při generování příkazů. Při kopírování příkazy do různých DataAdapter ("da2") CommandBuilder již připojený do jeho události a jejich nemění.

Proměnné oboru je důležité, protože SqlCommandBuilder ("cb") a "da1" přejít mimo rozsah a dojde k uvolnění paměti generace, CommandBuilder nastaví jeho příkazy Nothing (nebo hodnotu null v jazyce Visual C#). Proto nelze tyto příkazy používat v "da2." Protože úklid může dojít v náhodných časech, může zvýšit volání metody da2.Update přerušované NullReferenceException chyby.

Vlastnosti

ID článku: 310366 - Poslední aktualizace: 28. února 2014 - Revize: 1.7
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbnosurvey kbarchive kbmt kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata KB310366 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:310366

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com