DataAdapters Kullanarak Toplu İşlemleri Gerçekleştirme
ADO.NET'de toplu iş desteği, bir DataAdapter veya sunucusundaki INSERT, UPDATE ve DELETE işlemlerinin aynı anda bir DataSetDataTable işlem göndermek yerine gruplenmesine olanak tanır. Sunucuya gidiş dönüş sayısındaki azalma genellikle önemli performans kazanımlarına neden olur. Toplu güncelleştirmeler SQL Server () ve Oracle (System.Data.SqlClientSystem.Data.OracleClient) için .NET veri sağlayıcıları için desteklenir.
Bir veritabanını önceki ADO.NET sürümlerindeki değişikliklerle DataSet güncelleştirirken, Update
gerçekleştirilen bir DataAdapter
veritabanının yöntemi veritabanına bir kerede bir satır güncelleştirilir. Belirtilen DataTableiçindeki satırlar arasında yinelenirken, değiştirilip değiştirilmediğini görmek için her DataRow biri incelendi. Satır değiştirilmişse, ilgili satır için özelliğin değerine RowState bağlı olarak uygun UpdateCommand
, InsertCommand
veya DeleteCommand
olarak adlandırılır. Her satır güncelleştirmesi veritabanına bir ağ gidiş dönüş içerir.
ADO.NET 2.0'dan başlayarak özelliği DbDataAdapterUpdateBatchSize kullanıma sunar. UpdateBatchSize
değerini pozitif bir tamsayı değerine ayarlamak, veritabanındaki güncelleştirmelerin belirtilen boyutta toplu olarak gönderilmesine neden olur. Örneğin, değerini 10 olarak ayarlamak UpdateBatchSize
10 ayrı deyimi gruplandırıp tek bir toplu iş olarak gönderir. ayarının UpdateBatchSize
0 olarak ayarlanması, DataAdapter sunucusunun işleyebileceği en büyük toplu iş boyutunu kullanmasına neden olur. Satırlar birer birer gönderildiğinden, bunu 1 olarak ayarlamak toplu güncelleştirmeleri devre dışı bırakır.
Son derece büyük bir toplu iş yürütmek performansı düşürebilir. Bu nedenle, uygulamanızı uygulamadan önce en uygun toplu iş boyutu ayarını test etmeniz gerekir.
UpdateBatchSize Özelliğini Kullanma
Toplu güncelleştirmeler etkinleştirildiğinde DataAdapter'ın UpdatedRowSourceUpdateCommand
, InsertCommand
ve DeleteCommand
özellik değeri veya OutputParametersolarak None ayarlanmalıdır. Toplu güncelleştirme gerçekleştirirken, komutun UpdatedRowSource özellik değeri FirstReturnedRecord veya Both geçersizdir.
Aşağıdaki yordam, özelliğinin UpdateBatchSize
kullanımını gösterir. Yordam iki bağımsız değişken alır: DataSet Production.ProductCategory tablosundaki ProductCategoryID ve Name alanlarını temsil eden sütunlar içeren bir nesne ve toplu iş boyutunu temsil eden bir tamsayı (toplu iş içindeki satır sayısı). Kod, , InsertCommandve DeleteCommand özelliklerini ayarlayarak UpdateCommandyeni SqlDataAdapter bir nesne oluşturur. Kod, nesnenin DataSet satırları değiştirdiğini varsayar. Özelliğini ayarlar UpdateBatchSize
ve güncelleştirmeyi yürütür.
Public Sub BatchUpdate( _
ByVal dataTable As DataTable, ByVal batchSize As Int32)
' Assumes GetConnectionString() returns a valid connection string.
Dim connectionString As String = GetConnectionString()
' Connect to the AdventureWorks database.
Using connection As New SqlConnection(connectionString)
' Create a SqlDataAdapter.
Dim adapter As New SqlDataAdapter()
'Set the UPDATE command and parameters.
adapter.UpdateCommand = New SqlCommand( _
"UPDATE Production.ProductCategory SET " _
& "Name=@Name WHERE ProductCategoryID=@ProdCatID;", _
connection)
adapter.UpdateCommand.Parameters.Add("@Name", _
SqlDbType.NVarChar, 50, "Name")
adapter.UpdateCommand.Parameters.Add("@ProdCatID", _
SqlDbType.Int, 4, " ProductCategoryID ")
adapter.UpdateCommand.UpdatedRowSource = _
UpdateRowSource.None
'Set the INSERT command and parameter.
adapter.InsertCommand = New SqlCommand( _
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);", _
connection)
adapter.InsertCommand.Parameters.Add("@Name", _
SqlDbType.NVarChar, 50, "Name")
adapter.InsertCommand.UpdatedRowSource = _
UpdateRowSource.None
'Set the DELETE command and parameter.
adapter.DeleteCommand = New SqlCommand( _
"DELETE FROM Production.ProductCategory " _
& "WHERE ProductCategoryID=@ProdCatID;", connection)
adapter.DeleteCommand.Parameters.Add("@ProdCatID", _
SqlDbType.Int, 4, " ProductCategoryID ")
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None
' Set the batch size.
adapter.UpdateBatchSize = batchSize
' Execute the update.
adapter.Update(dataTable)
End Using
End Sub
public static void BatchUpdate(DataTable dataTable,Int32 batchSize)
{
// Assumes GetConnectionString() returns a valid connection string.
string connectionString = GetConnectionString();
// Connect to the AdventureWorks database.
using (SqlConnection connection = new
SqlConnection(connectionString))
{
// Create a SqlDataAdapter.
SqlDataAdapter adapter = new SqlDataAdapter();
// Set the UPDATE command and parameters.
adapter.UpdateCommand = new SqlCommand(
"UPDATE Production.ProductCategory SET "
+ "Name=@Name WHERE ProductCategoryID=@ProdCatID;",
connection);
adapter.UpdateCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.UpdateCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the INSERT command and parameter.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",
connection);
adapter.InsertCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the DELETE command and parameter.
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Production.ProductCategory "
+ "WHERE ProductCategoryID=@ProdCatID;", connection);
adapter.DeleteCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the batch size.
adapter.UpdateBatchSize = batchSize;
// Execute the update.
adapter.Update(dataTable);
}
}
Toplu Güncelleştirmeyle İlgili Olayları ve Hataları İşleme
DataAdapter'ın güncelleştirmeyle ilgili iki olayı vardır: RowUpdating ve RowUpdated. ADO.NET önceki sürümlerinde toplu işlem devre dışı bırakıldığında, işlenen her satır için bu olayların her biri bir kez oluşturulur. RowUpdating , güncelleştirme gerçekleşmeden önce oluşturulur ve veritabanı güncelleştirmesi tamamlandıktan sonra RowUpdated oluşturulur.
Batch Güncelleştirmeler ile Olay Davranışı Değişiklikleri
Toplu işlem etkinleştirildiğinde, tek bir veritabanı işleminde birden çok satır güncelleştirilir. Bu nedenle, her toplu iş için yalnızca bir RowUpdated
olay gerçekleşirken RowUpdating
, olay işlenen her satır için gerçekleşir. Toplu işlem devre dışı bırakıldığında, iki olay bire bir araya toplama ile tetiklenir; burada RowUpdating
bir olay ve bir RowUpdated
olay bir satır için tetiklenir ve sonra RowUpdating
tüm satırlar işlenene kadar bir ve bir RowUpdated
olay sonraki satır için tetiklenir.
Güncelleştirilmiş Satırlara Erişme
Toplu işlem devre dışı bırakıldığında, güncelleştirilen satıra sınıfın RowRowUpdatedEventArgs özelliği kullanılarak erişilebilir.
Toplu işlem etkinleştirildiğinde, birden çok satır için tek RowUpdated
bir olay oluşturulur. Bu nedenle, her satır için özelliğinin Row
değeri null'tır. RowUpdating
olaylar yine de her satır için oluşturulur. CopyToRows sınıfının yöntemiRowUpdatedEventArgs, satırların başvurularını bir diziye kopyalayarak işlenen satırlara erişmenizi sağlar. İşlenen satır yoksa, CopyToRows
bir ArgumentNullExceptionoluşturur. RowCount yöntemini çağırmadan önce işlenen satır sayısını döndürmek CopyToRows için özelliğini kullanın.
Veri Hatalarını İşleme
Toplu yürütme, her bir deyimin yürütülmesiyle aynı etkiye sahiptir. Deyimler, deyimlerin toplu işe eklenme sırasına göre yürütülür. Hatalar toplu iş modunda, toplu iş modu devre dışı bırakıldığında olduğu gibi işlenir. Her satır ayrı işlenir. Yalnızca veritabanında başarıyla işlenen satırlar içinde DataTablekarşılık gelen DataRow içinde güncelleştirilir.
Veri sağlayıcısı ve arka uç veritabanı sunucusu, toplu yürütme için hangi SQL yapılarının destekleneceğini belirler. Yürütme için desteklenmeyen bir deyim gönderilirse bir özel durum oluşturulabilir.