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, InsertCommandveya DeleteCommandolarak 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, InsertCommandve 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);  
    }  
}  

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.

Ayrıca bkz.