Aracılığıyla paylaş


DataAdapters kullanarak toplu işlem gerçekleştirme

ADO.NET'teki toplu iş desteği, INSERT, UPDATE ve DELETE işlemlerini bir DataAdapter üzerinden sunucuya göndermek için bir DataSet veya DataTable'yu kullanarak gruplandırmanıza olanak tanır, bu da işlemleri tek tek göndermek yerine topluca gönderme imkanı sağlar. 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üncellerken, bir Update nesnesinin DataAdapter yöntemi veritabanını her seferinde bir satır güncelleyerek güncellemeleri gerçekleştirdi. Belirtilen DataTable içindeki satırlar arasında döngü yaparken, değiştirilip değiştirilmediğini görmek için her DataRow tek tek incelendi. Satır değiştirilmişse, o satırdaki UpdateCommand özelliğinin değerine bağlı olarak uygun InsertCommand, DeleteCommand veya RowState çağrılır. Her satır güncelleştirmesi veritabanına bir ağ gidiş dönüş içerir.

ADO.NET 2.0'dan itibaren, DbDataAdapter bir UpdateBatchSize özelliği sunar. UpdateBatchSize değerini pozitif bir tamsayı değerine ayarlamak, veritabanındaki güncelleştirmelerin belirtilen boyutta toplu olarak gönderilmesine neden olur. UpdateBatchSize'ü 10 olarak ayarlamak, 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 UpdatedRowSource, UpdateCommand, InsertCommand ve DeleteCommand özellik değeri None veya OutputParameters olarak ayarlanmalıdır. Toplu güncelleştirme gerçekleştirirken, komutun UpdatedRowSource özellik değeri FirstReturnedRecord veya Both geçersizdir.

Aşağıdaki işlem, UpdateBatchSize özelliğinin nasıl kullanılacağını anlatır. Yordam, DataSet tablosundaki ProductCategoryID ve Name alanlarını temsil eden sütunları olan bir nesne ve toplu iş boyutunu temsil eden bir tamsayı (toplu iş içindeki satır sayısı) olmak üzere iki bağımsız değişken alır. Kod, yeni bir SqlDataAdapter nesnesi oluşturur, ardından UpdateCommand, InsertCommand ve DeleteCommand özelliklerini ayarlar. Kod, DataSet nesnesinin satırları değiştirmiş olduğunu varsayar. UpdateBatchSize özelliğini ayarlar 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);
    }
}

güncelleştirmeyle DataAdapter ilgili iki olay içerir: 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 RowUpdated veritabanı güncelleştirmesi tamamlandıktan sonra oluşturulur.

Toplu Güncelleştirmelerle 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, bir RowUpdating olayı ve bir RowUpdated olayının bir satır için, ardından bir RowUpdating ve bir RowUpdated olayının sonraki satır için sırayla tetiklenmesiyle bire bir araya sıralama yöntemiyle gerçekleşir; bu süreç tüm satırlar işlenene kadar devam eder.

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 RowUpdatedEventArgs yöntemi, satırların referanslarını bir diziye kopyalayarak işlenen satırlara erişmenizi sağlar. İşlenen satır yoksa, CopyToRows bir ArgumentNullException oluşturur. RowCount özelliğini, CopyToRows yöntemini çağırmadan önce işlenen satırların sayısını döndürmek için kullanın.

Veri Hatalarını İşleme

Toplu yürütme, her bir deyimin yürütülmesiyle aynı etkiye sahiptir. İfadeler, toplu işlemlere 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, DataRow içindeki ilgili DataTable'da 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ütülmesi için desteklenmeyen bir ifade gönderilirse bir istisna tetiklenebilir.

Ayrıca bkz.