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
, UpdateCommand
veya DeleteCommand
tasarım zamanında belirtemeyebilirsiniz. ile DataTable eşleniyorsanız veya tek bir veritabanı tablosundan oluşturulduysa, nesnesinin DbCommandBuilder avantajlarından yararlanarak , ve UpdateCommand
DbDataAdapteröğesini otomatik olarak oluşturabilirsinizDeleteCommand
InsertCommand
.
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 DataAdapter
ilişkilendirildiğinde, DbCommandBuilder null başvurularsa, öğesinin DataAdapter
, UpdateCommand
ve 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 DataSet
geri 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 RowState Addedsatı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 RowState Modified. 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 RowState Deletedtü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 DataAdapter
için sql deyimlerini otomatik olarak oluşturmak için, önce özelliğini DataAdapter
ayarlayınSelectCommand
, sonra bir CommandBuilder
nesne oluşturun ve için sql deyimlerinin otomatik olarak oluşturulacağı bağımsız değişken DataAdapter
CommandBuilder
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 CommandText
SelectCommand
, 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 SelectCommand
geç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 , GetUpdateCommand
ve yöntemlerini kullanarak GetInsertCommand
ve 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 Customers
custDS
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");