CommandBuilders ile Komut Oluşturma

SelectCommand Özellik, kullanıcıdan metin komutu alan bir sorgu aracı aracılığıyla çalışma zamanında dinamik olarak belirtildiğinde, uygun InsertCommand, UpdateCommandveya DeleteCommand tasarım zamanında belirtemeyebilirsiniz. ile DataTable eşleniyorsanız veya tek bir veritabanı tablosundan oluşturulduysa, nesnesinin DbCommandBuilder avantajlarından yararlanarak , ve UpdateCommandDbDataAdapteröğesini otomatik olarak oluşturabilirsinizDeleteCommandInsertCommand.

En düşük gereksinim olarak, otomatik komut oluşturmanın SelectCommand çalışması için özelliğini ayarlamanız gerekir. özelliği tarafından SelectCommand alınan tablo şeması, otomatik olarak oluşturulan INSERT, UPDATE ve DELETE deyimlerinin söz dizimini belirler.

DbCommandBuilder INSERT, UPDATE ve DELETE SQL komutlarını oluşturmak için gereken meta verileri döndürmek için komutunu yürütmelidirSelectCommand. Sonuç olarak, veri kaynağına ek bir yolculuk yapılması gerekir ve bu da performansı engelleyebilir. En iyi performansı elde etmek için komutunu kullanmak DbCommandBuilderyerine komutlarınızı açıkça belirtin.

ayrıca SelectCommand en az bir birincil anahtar veya benzersiz sütun döndürmelidir. Hiçbiri yoksa, bir InvalidOperation özel durum oluşturulur ve komutlar oluşturulmaz.

ile DataAdapterilişkilendirildiğinde, DbCommandBuilder null başvurularsa, öğesinin DataAdapter , UpdateCommandve DeleteCommand özelliklerini otomatik olarak oluştururInsertCommand. Command Bir özellik için zaten bir varsa, var olan Command kullanılır.

İki veya daha fazla tablo birleştirilerek oluşturulan veritabanı görünümleri tek bir veritabanı tablosu olarak kabul edilmez. Bu örnekte otomatik olarak komut oluşturmak için komutunu DbCommandBuilder kullanamazsınız; komutlarınızı açıkça belirtmeniz gerekir. Veri kaynağına yönelik güncelleştirmeleri DataSet çözümlemek için komutları açıkça ayarlama hakkında bilgi için bkz . DataAdapters ile Veri Kaynaklarını Güncelleştirme.

Çıkış parametrelerini bir öğesinin güncelleştirilmiş satırına DataSetgeri eşlemek isteyebilirsiniz. Yaygın görevlerden biri, veri kaynağından otomatik olarak oluşturulan bir kimlik alanının veya zaman damgasının değerini almaktır. varsayılan DbCommandBuilder olarak çıkış parametrelerini güncelleştirilmiş bir satırdaki sütunlara eşlemez. Bu örnekte komutunuzu açıkça belirtmeniz gerekir. Otomatik olarak oluşturulan bir kimlik alanını eklenen satırın sütununa geri eşleme örneği için bkz . Kimlik alma veya Otomatik Sayı Değerleri.

Otomatik Olarak Oluşturulan Komutlar için Kurallar

Aşağıdaki tabloda otomatik olarak oluşturulan komutların nasıl oluşturulduğuna ilişkin kurallar gösterilmektedir.

Command Kural
InsertCommand ile tablodaki tüm satırlar için veri kaynağına bir RowStateAddedsatır ekler. Güncelleştirilebilir tüm sütunlar için değerler ekler (ancak kimlikler, ifadeler veya zaman damgaları gibi sütunlar için eklemez).
UpdateCommand tablodaki tüm satırlar için veri kaynağındaki satırları Güncelleştirmeler RowStateModified. Kimlikler veya ifadeler gibi güncelleştirilemeyen sütunlar dışında tüm sütunların değerlerini Güncelleştirmeler. Veri kaynağındaki sütun değerlerinin satırın birincil anahtar sütun değerleriyle eşleştiği ve veri kaynağındaki kalan sütunların satırın özgün değerleriyle eşleştiği tüm satırları Güncelleştirmeler. Daha fazla bilgi için, bu konunun devamında yer alan "Güncelleştirmeler ve Silmeler için İyimser Eşzamanlılık Modeli" konusuna bakın.
DeleteCommand ile tablodaki RowStateDeletedtüm satırlar için veri kaynağındaki satırları siler. Sütun değerlerinin satırın birincil anahtar sütun değerleriyle eşleştiği ve veri kaynağındaki kalan sütunların satırın özgün değerleriyle eşleştiği tüm satırları siler. Daha fazla bilgi için, bu konunun devamında yer alan "Güncelleştirmeler ve Silmeler için İyimser Eşzamanlılık Modeli" konusuna bakın.

Güncelleştirmeler ve Silmeler için İyimser Eşzamanlılık Modeli

UPDATE ve DELETE deyimleri için otomatik olarak komut oluşturma mantığı iyimser eşzamanlılığı temel alır; yani kayıtlar düzenleme için kilitlenmez ve diğer kullanıcılar veya işlemler tarafından herhangi bir zamanda değiştirilebilir. Kayıt SELECT deyiminden döndürüldükten sonra ancak UPDATE veya DELETE deyimi verilmeden önce değiştirilmiş olabileceğinden, otomatik olarak oluşturulan UPDATE veya DELETE deyimi bir WHERE yan tümcesi içerir ve satırın yalnızca tüm özgün değerleri içeriyorsa güncelleştirileceğini ve veri kaynağından silinmediğini belirtir. Bu, yeni verilerin üzerine yazılmasını önlemek için yapılır. Otomatik olarak oluşturulan güncelleştirme, silinmiş veya içinde DataSetbulunan özgün değerleri içermeyen bir satırı güncelleştirmeye çalıştığında, komutu hiçbir kaydı etkilemez ve bir DBConcurrencyException oluşturulur.

UPDATE veya DELETE'in özgün değerlerden bağımsız olarak tamamlanmasını istiyorsanız, için DataAdapter öğesini açıkça ayarlamanız UpdateCommand ve otomatik komut oluşturma özelliğini kullanmamalısınız.

Otomatik Komut Oluşturma Mantığının Sınırlamaları

Otomatik komut oluşturma için aşağıdaki sınırlamalar geçerlidir.

Yalnızca İlişkisiz Tablolar

Otomatik komut oluşturma mantığı, veri kaynağındaki diğer tablolarla hiçbir ilişkiyi hesaba katmadan bağımsız tablolar için INSERT, UPDATE veya DELETE deyimleri oluşturur. Sonuç olarak, veritabanındaki yabancı anahtar kısıtlamasına katılan bir sütun için değişiklikleri göndermek için çağrısı Update yaparken bir hatayla karşılaşabilirsiniz. Bu özel durumu önlemek için, yabancı anahtar kısıtlamasına dahil olan sütunları güncelleştirmek için öğesini kullanmayın DbCommandBuilder ; bunun yerine, işlemi gerçekleştirmek için kullanılan deyimleri açıkça belirtin.

Tablo ve Sütun Adları

Sütun adları veya tablo adları boşluk, nokta, tırnak işareti veya köşeli ayraçlarla sınırlandırılmış olsa bile diğer önemli olmayan karakterler gibi özel karakterler içeriyorsa otomatik komut oluşturma mantığı başarısız olabilir. Sağlayıcıya bağlı olarak, QuotePrefix ve QuoteSuffix parametrelerini ayarlamak, oluşturma mantığının alanları işlemesine izin verebilir, ancak özel karakterlerden kaçamaz. Catalog.schema.table biçiminde tam tablo adları desteklenir.

Sql Deyimini Otomatik Olarak Oluşturmak için CommandBuilder Kullanma

bir DataAdapteriçin sql deyimlerini otomatik olarak oluşturmak için, önce özelliğini DataAdapterayarlayınSelectCommand, sonra bir CommandBuilder nesne oluşturun ve için sql deyimlerinin otomatik olarak oluşturulacağı bağımsız değişken DataAdapterCommandBuilder olarak belirtin.

' Assumes that connection is a valid SqlConnection object
' inside of a Using block.  
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT * FROM dbo.Customers", connection)  
Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter)  
builder.QuotePrefix = "["  
builder.QuoteSuffix = "]"  
// Assumes that connection is a valid SqlConnection object  
// inside of a using block.  
SqlDataAdapter adapter = new SqlDataAdapter(  
  "SELECT * FROM dbo.Customers", connection);  
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);  
builder.QuotePrefix = "[";  
builder.QuoteSuffix = "]";  

SelectCommand'ı Değiştirme

INSERT, UPDATE veya DELETE komutları otomatik olarak oluşturulduktan sonra öğesini değiştirirseniz CommandTextSelectCommand , bir özel durum oluşabilir. Değiştirilen SelectCommand.CommandText , ekleme, güncelleştirme veya silme komutları otomatik olarak oluşturulurken kullanılanla SelectCommand.CommandText tutarsız şema bilgileri içeriyorsa, yöntemine DataAdapter.Update yapılan gelecekteki çağrılar tarafından başvurulan SelectCommandgeçerli tabloda artık bulunmayan sütunlara erişmeye çalışabilir ve bir özel durum oluşturulur.

yöntemini CommandBuilderçağırarak RefreshSchema komutları otomatik olarak oluşturmak için tarafından CommandBuilder kullanılan şema bilgilerini yenileyebilirsiniz.

Otomatik olarak hangi komutun oluşturulduğunu öğrenmek istiyorsanız, nesnesinin , GetUpdateCommandve yöntemlerini kullanarak GetInsertCommandve GetDeleteCommand ilişkili komutun özelliğini denetleyerek CommandText otomatik olarak oluşturulan komutlara CommandBuilder başvuru alabilirsiniz.

Aşağıdaki kod örneği, konsola otomatik olarak oluşturulan güncelleştirme komutunu yazar.

Console.WriteLine(builder.GetUpdateCommand().CommandText)  
Console.WriteLine(builder.GetUpdateCommand().CommandText);

Aşağıdaki örnek, veri kümesindeki CustomerscustDS tabloyu yeniden oluşturur. Otomatik olarak oluşturulan komutları bu yeni sütun bilgileriyle yenilemek için RefreshSchema yöntemi çağrılır.

' Assumes an open SqlConnection and SqlDataAdapter inside of a Using block.  
adapter.SelectCommand.CommandText = _  
  "SELECT CustomerID, ContactName FROM dbo.Customers"  
builder.RefreshSchema()  
  
custDS.Tables.Remove(custDS.Tables("Customers"))  
adapter.Fill(custDS, "Customers")  
// Assumes an open SqlConnection and SqlDataAdapter inside of a using block.  
adapter.SelectCommand.CommandText =
  "SELECT CustomerID, ContactName FROM dbo.Customers";  
builder.RefreshSchema();  
  
custDS.Tables.Remove(custDS.Tables["Customers"]);  
adapter.Fill(custDS, "Customers");  

Ayrıca bkz.