DataAdapters kullanarak toplu işlemler

Şunlar için geçerlidir: .NET Framework .NET .NET Standard

ADO.NET indirin

ADO.NET'te toplu iş desteği, bir DataAdapter öğesinin, işlemleri tek tek göndermek yerine, bir INSERT veya UPDATE üzerinden DELETE, DataSet ve DataTable işlemlerini sunucuya gruplandırmasına olanak tanır. Sunucuya gidiş dönüş sayısındaki azalma genellikle önemli performans kazanımlarına neden olur. Toplu güncelleştirme, SQL ServerMicrosoft.Data.SqlClient () için Microsoft SqlClient veri sağlayıcısı için desteklenir.

ADO.NET’in önceki sürümlerinde, bir veritabanını bir DataSet içindeki değişikliklerle güncelleştirirken, bir Update nesnesinin DataAdapter yöntemi veritabanını her seferinde bir satır olacak şekilde güncelliyordu. Belirtilen DataTable içindeki satırları tek tek işlerken, değiştirilip değiştirilmediğini görmek için her DataRow incelendi. Satır değiştirilmişse, o satırın UpdateCommand özelliğinin değerine bağlı olarak uygun InsertCommand, DeleteCommand veya RowState çağrıldı. Her satır güncelleştirmesi veritabanına bir ağ gidiş dönüş içerir.

SQL Server için Microsoft SqlClient Veri Sağlayıcısı'nda SqlDataAdapter bir UpdateBatchSize özelliği 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, UpdateBatchSize değerini 10 olarak ayarlamak, 10 ayrı ifadeyi gruplandırır ve bunları tek bir toplu işlem olarak gönderir. ayarının UpdateBatchSize 0 olarak ayarlanması, SqlDataAdapter 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.

Uyarı

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 ve InsertCommand öğelerinin 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 yordam, UpdateBatchSize özelliğinin kullanımını gösterir. Yordam iki bağımsız değişken alır: DataSetProduction.ProductCategorytablosundaki 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, yeni bir SqlDataAdapter nesnesi oluşturur ve UpdateCommand, InsertCommand ve DeleteCommand özelliklerini ayarlar. Kod, DataSet nesnesinin değiştirilmiş satırlar içerdiğini varsayar. UpdateBatchSize özelliğini ayarlar ve güncellemeyi gerçekleştirir.

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. Daha fazla bilgi için bkz DataAdapter olaylarını işleme.

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şleme devre dışı bırakıldığında, iki olay bire bir dönüşümlü olarak tetiklenir; yani bir satır için bir RowUpdating olayı ve bir RowUpdated olayı tetiklenir, ardından sonraki satır için bir RowUpdating olayı ve bir RowUpdated olayı tetiklenir; bu düzen tüm satırlar işlenene kadar sürer.

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ırlara ait başvuruları bir diziye kopyalayarak işlenmiş satırlara erişmenizi sağlar. Hiçbir satır işlenmiyorsa, CopyToRows bir ArgumentNullException fırlatır. RowCount yöntemini çağırmadan önce işlenen satır sayısını döndürmek için CopyToRows özelliğini kullanın.

Veri hatalarını işleme

Toplu çalıştırma, her bir ifadenin tek tek çalıştırılmasıyla aynı etkiye sahiptir. İfadeler, toplu işleme eklendikleri sırayla 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 karşılık gelen DataTable içinde güncellenecektir.

Uyarı

SQL Server için Microsoft SqlClient 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.