Aracılığıyla paylaş


CommandBuilders ile Komut Oluşturma

SelectCommand Özelliği, 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. DataTable tek bir veritabanı tablosuna eşleniyorsa veya ondan oluşturulmuşsa, DbCommandBuilder nesnesinin avantajlarından yararlanarak DeleteCommand, InsertCommand, ve UpdateCommandDbDataAdapter'i otomatik olarak oluşturabilirsiniz.

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 DbCommandBuilder yerine 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.

DataAdapter ile ilişkilendirildiğinde, DbCommandBuilder, InsertCommand öğesinin UpdateCommand, DeleteCommand ve DataAdapter özelliklerini, eğer bunlar null referanslarsa, otomatik olarak oluşturur. Bir özellik için zaten bir Command varsa, mevcut 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 güncellenmiş bir satırına DataSet geri aktarabilirsiniz. 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. DbCommandBuilder varsayılan olarak çıkış parametrelerini güncellenmiş 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.

Komut Kural
InsertCommand Tablodaki RowStateAdded'e sahip tüm satırlar için veri kaynağına bir satı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 RowState olan tüm satırlarla tablo içindeki veri kaynağında bulunan satırları Modified günceller. Kimlikler veya ifadeler gibi güncelleştirilemeyen sütunlar dışındaki tüm sütunların değerlerini güncelleştirir. 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ştirir. 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 RowState değerine sahip olan tablodaki tü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 bir güncelleştirme, silinmiş veya DataSet içermeyen özgün değerleri barındırmayan bir satırı güncelleştirmeye çalıştığında, komut hiçbir kaydı etkilemez ve bir DBConcurrencyException hatası oluşturulur.

UPDATE veya DELETE işleminin özgün değerlerden bağımsız olarak tamamlanmasını istiyorsanız, UpdateCommand için DataAdapter öğesini açıkça ayarlamalı ve otomatik komut oluşturma özelliğine güvenmemelisiniz.

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 istisnayı önlemek için, yabancı anahtar kısıtlamasına dahil olan sütunları güncellemek amacıyla DbCommandBuilder öğesini kullanmayın; bunun yerine, işlemi gerçekleştirmek için kullanılan ifadeleri açıkça belirtin.

Tablo ve Sütun Adları

Sütun adları veya tablo adları boşluk, nokta, tırnak işareti gibi özel karakterler veya köşeli ayraçlarla sınırlandırılmış olsa bile alfanümerik olmayan başka 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 DataAdapter için SQL deyimlerini otomatik olarak oluşturmak için, önce SelectCommand'nin DataAdapter özelliğini ayarlayın, sonra bir CommandBuilder nesnesi oluşturun ve SQL deyimlerinin otomatik olarak oluşturulacağı bağımsız değişken olarak DataAdapter için CommandBuilder 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

Eğer CommandText öğesinin SelectCommand'sini INSERT, UPDATE veya DELETE komutları otomatik olarak oluşturulduktan sonra değiştirirseniz, bir özel durum oluşabilir. Değiştirilen SelectCommand.CommandText, ekleme, güncelleme veya silme komutları otomatik olarak oluşturulurken kullanılan SelectCommand.CommandText ile tutarsız şema bilgileri içeriyorsa, gelecekte DataAdapter.Update yöntemine yapılan çağrılar, SelectCommand tarafından referans edilen geçerli tabloda artık bulunmayan sütunlara erişmeye çalışabilir ve bir özel durum oluşturulabilir.

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

Otomatik olarak hangi komutun oluşturulduğunu öğrenmek istiyorsanız, GetInsertCommand nesnesinin GetUpdateCommand, GetDeleteCommand ve CommandBuilder yöntemlerini kullanarak ve ilgili komutun CommandText özelliğini kontrol ederek otomatik olarak oluşturulan komutlara bir referans 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. Bu yeni sütun bilgileriyle otomatik olarak oluşturulan komutları 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 bakınız