CommandBuilder nesne komutu sonraki DataAdapter.Update yöntemi çağrısı sırasında değiştirmeye çalışın ve komutu yapılan değişiklikler kaybolabilir yeniden

Makale çevirileri Makale çevirileri
Makale numarası: 310366 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Bu makalede, aşağıdaki Microsoft .NET Framework Sınıf Kitaplığı ad alanına başvurulmaktadır:
  • System.Data.SqlClient
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

CommandBuilder nesne sonraki DataAdapter.Update yöntemi çağrısı sırasında değiştirmeye çalışan bir komut yeniden ve komutu yapılan değişiklikler kaybolabilir. Bu sorun, aşağıdaki durumlarda oluşur:
  • Bir DataAdapter nesnesiyle bir CommandBuilder nesnesi ilişkilendirirseniz.
  • Komutları için DataAdapter açıkça atamak CommandBuilder</a0> nesnesinin <a1>GetInsertCommand, GetUpdateCommand veya GetDeleteCommand</a3> yöntemini kullanıyorsanız.
  • CommandBuilder oluşturduğu komutlardan birini değiştirirseniz.
DataAdapter <a1>Update</a1> yöntemini çağırmak çalıştığınızda aşağıdaki hata iletisini alabilirsiniz:
Içinde system.data.dll 'System.Data.SqlClient.SqlException' türünde işlenmeyen bir özel durum oluştu

Neden

Bu sorun, özgün komutu oluşturduğu komutları CommandBuilder bir dinamik olarak değiştirir nedeniyle oluşur.

Çözüm

Bu sorunu gidermek için aşağıdaki yöntemlerden birini kullanın:
  • CommandBuilder oluşturan komutları değiştirmeyin. CommandBuilder kendiniz oluşturan Command nesnesini değiştirmez.
  • ınsertcommandDeleteCommand ve UpdateCommand nesneleri için yeni bir DataAdapter kopyalamak (bir örnek için "Daha fazla bilgi" bölümüne bakın). Yeni DataAdapter değişken aynı kapsam olmalıdır veya dar eski DataAdapter değişkeni.
  • CommandBuilder hiç kullanmayın. Kendi Command nesnesini yazmak veya bunları yazmak için Visual veri Araçları'nı kullanın.

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

Davranışı Yeniden Oluşturma Adımları

  1. Yeni bir Visual Basic Windows Application projesi oluşturun. Form1, varsayılan olarak projeye eklenir.
  2. Formu çift tıklatıp Code penceresinin en üstünde aşağıdaki kodu ekleyin:
    Imports System.Data.SqlClient
    					
  3. Bir Düğme denetimi Form1'e ekleyin.
  4. Düğmeyi çift tıklatın ve olaya tıklatın aşağıdaki kodu ekleyin:
    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. Microsoft SQL Server bilgisayarınıza bağlanmak için bağlantı dizesini değiştirin.
  6. Kodu çalıştırmak için F5 tuşuna basın.
  7. Bu sorunu gidermek için aşağıdaki satırı dışında Açıklama:
            da1.Update(custDS, "Customers")
    					
Bu çözümü çalışır, çünkü, böylece bu komutları oluşturma zamanını biliyor CommandBuilderDataAdapter ("da1") RowUpdating olayı için kanca oluşturur. Farklı DataAdapter için ("da2") komutları kopyaladığınızda, CommandBuilder artık olaylarını da bilinmektedir ve bunları değiştirmez.

Değişken kapsamı, kapsam dışında giderseniz "da1" ve SqlCommandBuilder ("cb") ve atık toplama işlemi gerçekleştiğinde, CommandBuilderNothing (veya null Visual C# içinde) alt komutlarını ayarlar için önemlidir. Bu nedenle, bu komutları "da2." kullanamazsınız Atık toplama işlemi rasgele zamanlarda da oluşabilir, çünkü da2.Update yöntem çağrısı aralıklı NullReferenceException hatalara neden olabilir.

Özellikler

Makale numarası: 310366 - Last Review: 24 Şubat 2014 Pazartesi - Gözden geçirme: 1.7
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata KB310366 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:310366

Geri Bildirim Ver

 

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