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 DataSet veya DataTable üzerinden INSERT, UPDATE ve DELETE 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 DataAdapter nesnesinin Update 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 RowState özelliğinin değerine bağlı olarak uygun UpdateCommand, InsertCommand veya DeleteCommand ç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 UpdateCommand, InsertCommand ve DeleteCommand öğelerinin UpdatedRowSource ö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. RowUpdatedEventArgs sınıfının CopyToRows 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. CopyToRows yöntemini çağırmadan önce işlenen satır sayısını döndürmek için RowCount ö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, DataTable içindeki karşılık gelen DataRow 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.

Ayrıca bakınız