Toplu Silme (C#)Batch Deleting (C#)

Scott Mitchell tarafındanby Scott Mitchell

Kodu indirin veya PDF 'yi indirinDownload Code or Download PDF

Tek bir işlemde birden çok veritabanı kaydını silmeyi öğrenin.Learn how to delete multiple database records in a single operation. Kullanıcı arabirimi katmanında, daha önceki bir öğreticide oluşturulan gelişmiş bir GridView üzerinde oluşturacağız.In the User Interface Layer we build upon an enhanced GridView created in an earlier tutorial. Veri erişim katmanında, tüm silmenin başarılı veya tüm silinmelerin geri alındığından emin olmak için bir işlem içindeki birden çok silme işlemini sardık.In the Data Access Layer we wrap the multiple Delete operations within a transaction to ensure that all deletions succeed or all deletions are rolled back.

GirişIntroduction

Önceki öğreticide , tam olarak düzenlenebilir bir GridView kullanılarak toplu düzenleme arabirimi oluşturma işlemi araştırılmış.The preceding tutorial explored how to create a batch editing interface using a fully-editable GridView. Kullanıcıların birçok kaydı tek seferde düzenlemekte olduğu durumlarda, toplu bir düzenleyici arabirimi, son kullanıcının verimliliğini artırarak daha az sayıda geri yükleme ve klavyeden fareyle bağlam anahtarları gerektirir.In situations where users are commonly editing many records at once, a batch editing interface will require far fewer postbacks and keyboard-to-mouse context switches, thereby improving the end user s efficiency. Bu teknik benzer şekilde, kullanıcıların tek bir go 'da birçok kaydı silmesi için ortak olduğu sayfalar için de kullanışlıdır.This technique is similarly useful for pages where it is common for users to delete many records in one go.

Çevrimiçi bir e-posta istemcisi kullanan herkes, en yaygın toplu Batch 'yi silme arabirimlerinden birini zaten biliyor: bir kılavuzdaki her satırdaki her satırdaki onay kutusu, karşılık gelen tüm Işaretlenmiş öğeleri Sil düğmesi (bkz. Şekil 1).Anyone who has used an online email client is already familiar with one of the most common batch deleting interfaces: a checkbox in each row in a grid with a corresponding Delete All Checked Items button (see Figure 1). Bu öğreticide, hem Web tabanlı arabirim oluşturma hem de bir kayıt serisini tek atomik bir işlem olarak silmek için bir yöntem olan önceki öğreticilerdeki tüm sabit işleri zaten yaptığımız için bu öğretici daha kısadır.This tutorial is rather short because we ve already done all of the hard work in previous tutorials in creating both the web-based interface and a method to delete a series of records as a single atomic operation. Onay kutuları ekleme öğreticisindeki GridView sütununda , CheckBox 'ları Içeren bir GridView oluşturduk ve bir Işlem öğreticisindeki sarmalama veritabanı değişiklikleri içinde, bir ProductID değerlerinin List<T> silmek için bir işlem kullanan BLL 'de bir yöntem oluşturduk.In the Adding a GridView Column of Checkboxes tutorial we created a GridView with a column of checkboxes and in the Wrapping Database Modifications within a Transaction tutorial we created a method in the BLL that would use a transaction to delete a List<T> of ProductID values. Bu öğreticide, bir çalışma toplu işi oluşturmak için önceki deneyimlerimizi oluşturacak ve birleştirme işlemini gerçekleştireceğiz.In this tutorial, we will build upon and merge our previous experiences to create a working batch deleting example.

Her satır onay kutusu IçerirEach Row Includes a Checkbox

Şekil 1: her satır bir onay kutusu içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 1: Each Row Includes a Checkbox (Click to view full-size image)

1. Adım: toplu Işi silme arabirimi oluşturmaStep 1: Creating the Batch Deleting Interface

Onay kutusu öğreticisinin GridView sütununda bir GridView ekleme arabirimini zaten oluşturduğumuz için, onu sıfırdan oluşturmak yerine BatchDelete.aspx kopyalamanız yeterlidir.Since we already created the batch deleting interface in the Adding a GridView Column of Checkboxes tutorial, we can simply copy it to BatchDelete.aspx rather than creating it from scratch. BatchData klasöründeki BatchDelete.aspx sayfasını ve EnhancedGridView klasöründeki CheckBoxField.aspx sayfasını açarak başlayın.Start by opening the BatchDelete.aspx page in the BatchData folder and the CheckBoxField.aspx page in the EnhancedGridView folder. CheckBoxField.aspx sayfasında, kaynak görünümüne gidin ve Şekil 2 ' de gösterildiği gibi, <asp:Content> etiketleri arasındaki biçimlendirmeyi kopyalayın.From the CheckBoxField.aspx page, go to the Source view and copy the markup between the <asp:Content> tags as shown in Figure 2.

CheckBoxField. aspx ' in bildirim temelli Işaretlemesini panoya kopyalamak Copy the Declarative Markup of CheckBoxField.aspx to the Clipboard

Şekil 2: CheckBoxField.aspx bildirim temelli işaretlemesini panoya kopyalama (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: Copy the Declarative Markup of CheckBoxField.aspx to the Clipboard (Click to view full-size image)

Sonra, BatchDelete.aspx ' deki kaynak görünümüne gidin ve Pano içeriğini <asp:Content> etiketleri içine yapıştırın.Next, go to the Source view in BatchDelete.aspx and paste the contents of the clipboard within the <asp:Content> tags. Ayrıca, kodu CheckBoxField.aspx.cs arka plan kod sınıfı içinden BatchDelete.aspx.cs (DeleteSelectedProducts düğme s Click olay işleyicisi, ToggleCheckState yöntemi ve Click ve CheckAll düğmeleri için UncheckAll olay işleyicileri) içine kopyalayın ve yapıştırın.Also copy and paste the code from within the code-behind class in CheckBoxField.aspx.cs to within the code-behind class in BatchDelete.aspx.cs (the DeleteSelectedProducts Button s Click event handler, the ToggleCheckState method, and the Click event handlers for the CheckAll and UncheckAll Buttons). Bu içeriğin üzerine kopyaladıktan sonra, BatchDelete.aspx sayfa arka plan kod sınıfı aşağıdaki kodu içermelidir:After copying over this content, the BatchDelete.aspx page s code-behind class should contain the following code:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class BatchData_BatchDelete : System.Web.UI.Page
{
    protected void DeleteSelectedProducts_Click(object sender, EventArgs e)
    {
        bool atLeastOneRowDeleted = false;
        // Iterate through the Products.Rows property
        foreach (GridViewRow row in Products.Rows)
        {
            // Access the CheckBox
            CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
            if (cb != null && cb.Checked)
            {
                // Delete row! (Well, not really...)
                atLeastOneRowDeleted = true;
                // First, get the ProductID for the selected row
                int productID = Convert.ToInt32(Products.DataKeys[row.RowIndex].Value);
                // "Delete" the row
                DeleteResults.Text += string.Format
                    ("This would have deleted ProductID {0}<br />", productID);
                //... To actually delete the product, use ...
                //ProductsBLL productAPI = new ProductsBLL();
                //productAPI.DeleteProduct(productID);
                //............................................
            }
        }
        // Show the Label if at least one row was deleted...
        DeleteResults.Visible = atLeastOneRowDeleted;
    }
    private void ToggleCheckState(bool checkState)
    {
        // Iterate through the Products.Rows property
        foreach (GridViewRow row in Products.Rows)
        {
            // Access the CheckBox
            CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
            if (cb != null)
                cb.Checked = checkState;
        }
    }
    protected void CheckAll_Click(object sender, EventArgs e)
    {
        ToggleCheckState(true);
    }
    protected void UncheckAll_Click(object sender, EventArgs e)
    {
        ToggleCheckState(false);
    }
}

Bildirim temelli biçimlendirme ve kaynak kodu üzerine kopyaladıktan sonra, bir tarayıcıdan görüntüleyerek BatchDelete.aspx test etmek biraz zaman ayırın.After copying over the declarative markup and source code, take a moment to test BatchDelete.aspx by viewing it through a browser. Ürün adı, kategori ve fiyat onay kutusu ile birlikte her satır için GridView 'da ilk on ürünün listelendiği bir GridView görmeniz gerekir.You should see a GridView listing the first ten products in a GridView with each row listing the product s name, category, and price along with a checkbox. Üç düğme olmalıdır: tümünü Işaretleyin, tümünün Işaretini kaldırın ve seçili ürünleri silin.There should be three buttons: Check All, Uncheck All, and Delete Selected Products. Tümünü Işaretle düğmesine tıklamak tüm onay kutularını seçer, ancak tümünün Işaretini kaldır tüm onay kutularını temizler.Clicking the Check All button selects all checkboxes, while Uncheck All clears all checkboxes. Seçili ürünleri Sil ' i tıklatmak seçili ürünlerin ProductID değerlerini listeleyen bir ileti görüntüler, ancak ürünleri gerçekten silmez.Clicking Delete Selected Products displays a message that lists the ProductID values of the selected products, but does not actually delete the products.

CheckBoxField. aspx ' den arabirim Batchsilmesini. aspx ' e taşındıThe Interface from CheckBoxField.aspx has been Moved to BatchDeleting.aspx

Şekil 3: CheckBoxField.aspx arabirimi BatchDeleting.aspx taşındı (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 3: The Interface from CheckBoxField.aspx has been Moved to BatchDeleting.aspx (Click to view full-size image)

2. Adım: Işlemleri kullanarak denetlenen ürünleri silmeStep 2: Deleting the Checked Products Using Transactions

Toplu iş silme arabirimi BatchDeleting.aspx' ye başarıyla kopyalanırsa, seçili ürünleri Sil düğmesinin, ProductsBLL sınıfındaki DeleteProductsWithTransaction yöntemi kullanılarak denetlenen ürünleri silmesi için kodu güncelleştirme işlemi devam etmektedir.With the batch deleting interface successfully copied over to BatchDeleting.aspx, all that remains is to update the code so that the Delete Selected Products button deletes the checked products using the DeleteProductsWithTransaction method in the ProductsBLL class. Bir işlem öğreticisindeki sarmalama veritabanı değişikliklerine eklenen bu yöntem, ProductID değerlerinin List<T> giriş olarak kabul eder ve karşılık gelen her ProductID bir işlemin kapsamı içinde siler.This method, added in the Wrapping Database Modifications within a Transaction tutorial, accepts as its input a List<T> of ProductID values and deletes each corresponding ProductID within the scope of a transaction.

DeleteSelectedProducts Button s Click olay işleyicisi şu anda her bir GridView satırında yinelemek için aşağıdaki foreach döngüsünü kullanır:The DeleteSelectedProducts Button s Click event handler currently uses the following foreach loop to iterate through each GridView row:

// Iterate through the Products.Rows property
foreach (GridViewRow row in Products.Rows)
{
    // Access the CheckBox
    CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
    if (cb != null && cb.Checked)
    {
        // Delete row! (Well, not really...)
        atLeastOneRowDeleted = true;
        // First, get the ProductID for the selected row
        int productID = Convert.ToInt32(Products.DataKeys[row.RowIndex].Value);
        // "Delete" the row
        DeleteResults.Text += string.Format
            ("This would have deleted ProductID {0}<br />", productID);
        //... To actually delete the product, use ...
        //ProductsBLL productAPI = new ProductsBLL();
        //productAPI.DeleteProduct(productID);
        //............................................
    }
}

Her satır için ProductSelector onay kutusu Web denetimine program aracılığıyla başvurulur.For each row, the ProductSelector CheckBox Web control is programmatically referenced. İşaretliyse, satır s ProductID DataKeys koleksiyonundan alınır ve DeleteResults Label s Text özelliği, satırın silinmek üzere seçili olduğunu belirten bir ileti içerecek şekilde güncelleştirilir.If it is checked, the row s ProductID is retrieved from the DataKeys collection and the DeleteResults Label s Text property is updated to include a message indicating that the row was selected for deletion.

Yukarıdaki kod, ProductsBLL sınıf s Delete yöntemine yapılan çağrı geçersiz kılınan bir kaydı gerçekten silmez. Bu silme mantığı uygulanmıştı, kod ürünleri silecek ancak atomik bir işlem içinde değil.The above code does not actually delete any records as the call to the ProductsBLL class s Delete method is commented out. Were this delete logic to be applied, the code would delete the products but not within an atomic operation. Yani, dizideki ilk birkaç silme işlemi başarılı oldu, ancak daha sonra bir başarısız oldu (Belki de bir yabancı anahtar kısıtlaması ihlali nedeniyle), bir özel durum oluşturulur ancak zaten silinmiş olan ürünler silinmiş olarak kalır.That is, if the first few deletes in the sequence succeeded, but a later one failed (perhaps due to a foreign key constraint violation), an exception would be thrown but those products already deleted would remain deleted.

Kararlılığını güvence altına almak için bunun yerine ProductsBLL Class s DeleteProductsWithTransaction metodunu kullanmanız gerekir.In order to assure atomicity, we need to instead use the ProductsBLL class s DeleteProductsWithTransaction method. Bu yöntem ProductID değerleri listesini kabul ettiğinden, önce bu listeyi kılavuzdan derleyip sonra bir parametre olarak iletmemiz gerekir.Because this method accepts a list of ProductID values, we need to first compile this list from the grid and then pass it as a parameter. Önce inttüründe bir List<T> örneği oluşturacağız.We first create an instance of a List<T> of type int. foreach döngüsünde, seçilen ürünlerin ProductID değerlerini bu List<T>eklemesi gerekir.Within the foreach loop we need to add the selected products ProductID values to this List<T>. Döngüden sonra bu List<T> ProductsBLL sınıf s DeleteProductsWithTransaction metoduna geçirilmesi gerekir.After the loop this List<T> must be passed to the ProductsBLL class s DeleteProductsWithTransaction method. DeleteSelectedProducts Button s Click olay işleyicisini aşağıdaki kodla güncelleştirin:Update the DeleteSelectedProducts Button s Click event handler with the following code:

protected void DeleteSelectedProducts_Click(object sender, EventArgs e)
{
    // Create a List to hold the ProductID values to delete
    System.Collections.Generic.List<int> productIDsToDelete = 
        new System.Collections.Generic.List<int>();
    // Iterate through the Products.Rows property
    foreach (GridViewRow row in Products.Rows)
    {
        // Access the CheckBox
        CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
        if (cb != null && cb.Checked)
        {
            // Save the ProductID value for deletion
            // First, get the ProductID for the selected row
            int productID = Convert.ToInt32(Products.DataKeys[row.RowIndex].Value);
            // Add it to the List...
            productIDsToDelete.Add(productID);
            // Add a confirmation message
            DeleteResults.Text += string.Format
                ("ProductID {0} has been deleted<br />", productID);
        }
    }
    // Call the DeleteProductsWithTransaction method and show the Label 
    // if at least one row was deleted...
    if (productIDsToDelete.Count > 0)
    {
        ProductsBLL productAPI = new ProductsBLL();
        productAPI.DeleteProductsWithTransaction(productIDsToDelete);
        DeleteResults.Visible = true;
        // Rebind the data to the GridView
        Products.DataBind();
    }
}

Güncelleştirilmiş kod, int (productIDsToDelete) türünde bir List<T> oluşturur ve silinecek ProductID değerleriyle doldurur.The updated code creates a List<T> of type int (productIDsToDelete) and populates it with the ProductID values to delete. foreach döngüsünden sonra, en az bir ürün seçilirse ProductsBLL sınıf s DeleteProductsWithTransaction metodu çağrılır ve bu liste geçirilir.After the foreach loop, if there is at least one product selected, the ProductsBLL class s DeleteProductsWithTransaction method is called and passed this list. DeleteResults etiketi de görüntülenir ve veriler GridView 'a yeniden bağlanır (böylece yeni silinen kayıtlar kılavuzda satır olarak görünmez).The DeleteResults Label is also displayed and the data rebound to the GridView (so that the newly-deleted records no longer appear as rows in the grid).

Şekil 4 ' te, bir dizi satır silinmek üzere seçildikten sonra GridView gösterilmektedir.Figure 4 shows the GridView after a number of rows have been selected for deletion. Şekil 5 ' te, seçili ürünleri Sil düğmesine tıklandıktan hemen sonra ekran gösterilir.Figure 5 shows the screen immediately after the Delete Selected Products button has been clicked. Şekil 5 ' te, silinen kayıtların ProductID değerlerinin GridView 'un altındaki etikette görüntülendiğini ve bu satırların artık GridView 'da olmadığını unutmayın.Note that in Figure 5 the ProductID values of the deleted records are displayed in the Label beneath the GridView and those rows are no longer in the GridView.

seçili ürünler silinecekThe Selected Products Will Be Deleted

Şekil 4: Seçili Ürünler silinecek (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 4: The Selected Products Will Be Deleted (Click to view full-size image)

silinen ürünlerin ProductID değerleri GridView 'un altında listelenmiştirThe Deleted Products ProductID Values are Listed Beneath the GridView

Şekil 5: silinen ürünler ProductID değerler GridView 'un altında listelenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 5: The Deleted Products ProductID Values are Listed Beneath the GridView (Click to view full-size image)

Note

DeleteProductsWithTransaction yöntemi kararlılığını test etmek için Order Details tablosundaki bir ürün için el ile bir giriş ekleyin ve ardından bu ürünü (diğer kişilerle birlikte) silmeyi deneyin.To test the DeleteProductsWithTransaction method s atomicity, manually add an entry for a product in the Order Details table and then attempt to delete that product (along with others). Ürünü ilişkili bir siparişle silmeye çalışırken bir yabancı anahtar kısıtlaması ihlali alırsınız, ancak seçilen diğer ürün silme işlemlerinin nasıl geri alınacağını aklınızda bulabilirsiniz.You will receive a foreign key constraint violation when attempting to delete the product with an associated order, but note how the other selected products deletions are rolled back.

ÖzetSummary

Batch silme arabirimi oluşturmak, CheckBox sütunuyla bir GridView eklemeyi ve tıklandığı zaman bir düğme web denetimini, tıklatıldığında seçili satırların tümünü tek atomik bir işlem olarak silecek şekilde içerir.Creating a batch deleting interface involves adding a GridView with a column of checkboxes and a Button Web control that, when clicked, will delete all of the selected rows as a single atomic operation. Bu öğreticide, iki önceki öğreticide bir GridView sütunu ekleyerek ve bir Işlem Içindeki veritabanı değişikliklerini sarmalayarak, bu tür bir arabirimi piecing ile birlikte geliştirdik.In this tutorial we built such an interface by piecing together work done in two previous tutorials, Adding a GridView Column of Checkboxes and Wrapping Database Modifications within a Transaction. İlk öğreticide, CheckBox 'ları içeren bir GridView oluşturduğumuz ve ikinci bölümünde, bir List<T> ProductID değerleri geçirildiğinde bir işlemin kapsamı içinde silinen bir yöntemi uyguladık.In the first tutorial we created a GridView with a column of checkboxes and in the latter we implemented a method in the BLL that, when passed a List<T> of ProductID values, deleted them all within the scope of a transaction.

Sonraki öğreticide, toplu ekleme işlemi gerçekleştirmek için bir arabirim oluşturacağız.In the next tutorial we'll create an interface for performing batch inserts.

Programlamanın kutlu olsun!Happy Programming!

Yazar hakkındaAbout the Author

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.comadresinden erişilebilir .He can be reached at mitchell@4GuysFromRolla.com. ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.or via his blog, which can be found at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğreticide lider gözden geçirenler, Giesenow ve Teresa Murphy olduğunu gösterir.Lead reviewers for this tutorial were Hilton Giesenow and Teresa Murphy. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .If so, drop me a line at mitchell@4GuysFromRolla.com.