Aracılığıyla paylaş


.NET Framework uygulamalarında veri kümelerindeki verileri doğrulama

Not

Veri kümeleri ve ilgili sınıflar, uygulamaların veritabanıyla bağlantısı kesilirken uygulamaların bellekteki verilerle çalışmasını sağlayan 2000'lerin başlarındaki eski .NET Framework teknolojileridir. Teknolojiler özellikle kullanıcıların verileri değiştirmesine ve değişiklikleri veritabanında kalıcı hale getirebilmesine olanak tanıyan uygulamalar için kullanışlıdır. Veri kümelerinin çok başarılı bir teknoloji olduğu kanıtlanmış olsa da, yeni .NET uygulamalarının Entity Framework Core kullanmasını öneririz. Entity Framework, tablosal verilerle nesne modelleri olarak çalışmak için daha doğal bir yol sağlar ve daha basit bir programlama arabirimine sahiptir.

Verilerin doğrulanması, veri nesnelerine girilen değerlerin bir veri kümesinin şemasındaki kısıtlamalara uygun olduğunu onaylama işlemidir. Doğrulama işlemi, bu değerlerin uygulamanız için oluşturulan kurallara uyduğunu da onaylar. Temel alınan veritabanına güncelleştirme göndermeden önce verileri doğrulamak iyi bir uygulamadır. Bu, hataların yanı sıra bir uygulama ile veritabanı arasındaki olası gidiş dönüş sayısını azaltır.

Veri kümesinde doğrulama denetimleri oluşturarak veri kümesine yazılan verilerin geçerli olduğunu onaylayabilirsiniz. Veri kümesi, güncelleştirmenin nasıl gerçekleştirildiğine bakılmaksızın( doğrudan bir formdaki, bir bileşendeki veya başka bir şekilde denetimler tarafından) verileri denetleyebilir. Veri kümesi uygulamanızın bir parçası olduğundan (veritabanı arka uçlarından farklı olarak), uygulamaya özgü doğrulama oluşturmak için mantıksal bir yerdir.

Uygulamanıza doğrulama eklemek için en iyi yer veri kümesinin kısmi sınıf dosyasındadır. Visual Basic veya Visual C# içinde Veri Kümesi Tasarımcısı'nı açın ve doğrulama oluşturmak istediğiniz sütuna veya tabloya çift tıklayın. Bu eylem, bir veya RowChanging olay işleyicisi oluşturabileceğiniz ColumnChanging kod dosyasını açar.

private static void OnColumnChanging(object sender, DataColumnChangeEventArgs e)
{

}

Verileri doğrulama

Bir veri kümesindeki doğrulama aşağıdaki yollarla gerçekleştirilir:

  • Değişiklikler sırasında tek bir veri sütunundaki değerleri denetleyebilen, uygulamaya özgü kendi doğrulamanızı oluşturarak. Daha fazla bilgi için bkz . Nasıl yapılır: Sütun değişiklikleri sırasında verileri doğrulama.

  • Bir veri satırının tamamı değişirken verileri değerlere denetleyebilen, uygulamaya özgü kendi doğrulamanızı oluşturarak. Daha fazla bilgi için bkz . Nasıl yapılır: Satır değişiklikleri sırasında verileri doğrulama.

  • Veri kümesinin gerçek şema tanımının bir parçası olarak anahtarlar, benzersiz kısıtlamalar vb. oluşturarak.

  • Nesnenin DataColumn özelliklerini ayarlayarak, örneğin MaxLength, , AllowDBNullve Unique.

Kayıtta DataTable bir değişiklik gerçekleştiğinde nesne tarafından birkaç olay tetiklenir:

  • ColumnChanging ve ColumnChanged olayları tek bir sütunda yapılan her değişiklik sırasında ve sonrasında oluşturulur. Olay ColumnChanging , belirli sütunlardaki değişiklikleri doğrulamak istediğinizde kullanışlıdır. Önerilen değişiklik hakkındaki bilgiler, olayla bağımsız değişken olarak geçirilir.
  • RowChanging ve RowChanged olayları, bir satırdaki herhangi bir değişiklik sırasında ve sonrasında tetiklenir. Olay RowChanging daha geneldir. Bu, satırın herhangi bir yerinde bir değişiklik olduğunu gösterir, ancak hangi sütunun değiştiğini bilmezsiniz.

Varsayılan olarak, bir sütunda yapılan her değişiklik dört olay oluşturur. Birincisi, ColumnChanging değiştirilen belirli bir sütunun ve ColumnChanged olaylarıdır. Sırada ve RowChanged olayları yer alırRowChanging. Satırda birden çok değişiklik yapılıyorsa, her değişiklik için olaylar tetiklenir.

Not

Veri satırının BeginEdit yöntemi, her bir sütun değişikliğinden RowChanging sonra ve RowChanged olaylarını kapatır. Bu durumda, ve RowChanged olayları yalnızca bir kez tetiklendiğinde yöntemi çağrılana RowChanging kadar EndEdit olay tetiklenmez. Daha fazla bilgi için bkz . Veri kümesini doldururken kısıtlamaları kapatma.

Seçtiğiniz olay, doğrulamanın ne kadar ayrıntılı olmasını istediğinize bağlıdır. Bir sütun değiştiğinde hemen bir hata yakalamanız önemliyse, olayı kullanarak derleme doğrulaması yapın ColumnChanging . Aksi takdirde, aynı anda birkaç hata yakalamaya neden olabilecek olayı kullanın RowChanging . Ayrıca, verileriniz bir sütunun değerinin başka bir sütunun içeriğine göre doğrulanması için yapılandırılmışsa, doğrulamanızı olay sırasında gerçekleştirin RowChanging .

Kayıtlar güncelleştirildiğinde, DataTable nesne değişiklikler gerçekleşirken ve değişiklikler yapıldıktan sonra yanıt verebileceğiniz olayları tetikler.

Uygulamanız türü belirlenmiş bir veri kümesi kullanıyorsa, kesin olarak yazılan olay işleyicileri oluşturabilirsiniz. Bu, işleyicileri oluşturabileceğiniz dört ek türlenmiş olay ekler: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeletingve dataTableNameRowDeleted. Bu türdeki olay işleyicileri, kodunuzun yazmasını ve okunmasını kolaylaştıran tablonuzun sütun adlarını içeren bir bağımsız değişken geçirir.

Veri güncelleştirme olayları

Olay Açıklama
ColumnChanging Sütundaki değer değiştiriliyor. Olay, önerilen yeni değerle birlikte satırı ve sütunu size geçirir.
ColumnChanged Sütundaki değer değiştirildi. Olay, önerilen değerle birlikte satırı ve sütunu size geçirir.
RowChanging Bir DataRow nesnede yapılan değişiklikler veri kümesine geri işlenmek üzeredir. yöntemini çağırmadıysanız BeginEdit , RowChanging olay oluşturulduktan hemen sonra ColumnChanging bir sütuna yapılan her değişiklik için olay oluşturulur. Değişiklik yapmadan önce çağırdıysanız BeginEdit , RowChanging olay yalnızca yöntemini çağırdığınızda EndEdit oluşturulur.

Olay, satırı size ile birlikte hangi eylem türünün (değişiklik, ekleme vb.) gerçekleştirildiğini belirten bir değer ile birlikte geçirir.
RowChanged Satır değiştirildi. Olay, satırı size ile birlikte hangi eylem türünün (değişiklik, ekleme vb.) gerçekleştirildiğini belirten bir değer ile birlikte geçirir.
RowDeleting Bir satır siliniyor. Olay, satırı size ve gerçekleştirilmekte olan eylem türünü (silme) belirten bir değer ile birlikte geçirir.
RowDeleted Bir satır silindi. Olay, satırı size ve gerçekleştirilmekte olan eylem türünü (silme) belirten bir değer ile birlikte geçirir.

ColumnChanging, RowChangingve RowDeleting olayları güncelleştirme işlemi sırasında oluşturulur. Verileri doğrulamak veya diğer işleme türlerini gerçekleştirmek için bu olayları kullanabilirsiniz. Bu olaylar sırasında güncelleştirme işlemi devam ettiğinden, güncelleştirmenin tamamlanmasını engelleyen bir özel durum oluşturarak bunu iptal edebilirsiniz.

ColumnChangedve RowChanged RowDeleted olayları, güncelleştirme başarıyla tamamlandığında tetiklenen bildirim olaylarıdır. Bu olaylar, başarılı bir güncelleştirmeye göre daha fazla işlem yapmak istediğinizde kullanışlıdır.

Sütun değişiklikleri sırasında verileri doğrulama

Not

Veri Kümesi Tasarımcısı, doğrulama mantığının bir veri kümesine eklenebileceği kısmi bir sınıf oluşturur. Tasarımcı tarafından oluşturulan veri kümesi kısmi sınıftaki hiçbir kodu silmez veya değiştirmez.

Bir veri sütunundaki değer değiştiğinde olayı yanıtlayarak ColumnChanging verileri doğrulayabilirsiniz. Bu olay tetiklendiğinde, geçerli sütun için önerilen değeri içeren bir olay bağımsız değişkeni (ProposedValue) geçirir. içeriğini e.ProposedValuetemel alarak şunları yapabilirsiniz:

  • Hiçbir şey yapmadan önerilen değeri kabul edin.

  • Sütun değiştirme olay işleyicisinin içinden sütun hatasını (SetColumnError) ayarlayarak önerilen değeri reddedin.

  • İsteğe bağlı olarak, ErrorProvider kullanıcıya bir hata iletisi görüntülemek için bir denetim kullanın. Daha fazla bilgi için bkz . ErrorProvider bileşeni.

Doğrulama, olay sırasında RowChanging da gerçekleştirilebilir.

Satır değişiklikleri sırasında verileri doğrulama

Doğrulamak istediğiniz her sütunun uygulamanızın gereksinimlerini karşılayan veriler içerdiğini doğrulamak için kod yazabilirsiniz. Önerilen bir değer kabul edilemezse, sütunu hata içerdiğini gösterecek şekilde ayarlayarak bunu yapın. Aşağıdaki örneklerde sütun 0 veya daha az olduğunda Quantity bir sütun hatası ayarlanmıştır. Satır değiştiren olay işleyicileri aşağıdaki örneklere benzemelidir.

Satır değiştiğinde verileri doğrulamak için (Visual Basic)

  1. Veri kümenizi Veri Kümesi Tasarımcısı'nda açın. Daha fazla bilgi için bkz . İzlenecek Yol: Veri Kümesi Tasarımcısı'nda Veri Kümesi Oluşturma.

  2. Doğrulamak istediğiniz tablonun başlık çubuğuna çift tıklayın. Bu eylem, veri kümesinin RowChanging kısmi sınıf dosyasında öğesinin olay işleyicisini DataTable otomatik olarak oluşturur.

    İpucu

    Satır değiştirme olay işleyicisini oluşturmak için tablo adının soluna çift tıklayın. Tablo adına çift tıklarsanız, tabloyu düzenleyebilirsiniz.

    Private Sub Order_DetailsDataTable_Order_DetailsRowChanging(
        ByVal sender As System.Object, 
        ByVal e As Order_DetailsRowChangeEvent
      ) Handles Me.Order_DetailsRowChanging
    
        If CType(e.Row.Quantity, Short) <= 0 Then
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError("Quantity", "")
        End If
    End Sub
    

Satır değiştiğinde verileri doğrulamak için (C#)

  1. Veri kümenizi Veri Kümesi Tasarımcısı'nda açın. Daha fazla bilgi için bkz . İzlenecek yol: Veri Kümesi Tasarımcısı'nda veri kümesi oluşturma.

  2. Doğrulamak istediğiniz tablonun başlık çubuğuna çift tıklayın. Bu eylem için DataTablekısmi sınıf bir dosya oluşturur.

    Not

    Veri Kümesi Tasarımcısı, olay için otomatik olarak bir olay işleyicisi RowChanging oluşturmaz. Olayı işlemek RowChanging için bir yöntem oluşturmanız ve tablonun başlatma yönteminde olayı bağlamak için kod çalıştırmanız gerekir.

  3. Aşağıdaki kodu kısmi sınıfa kopyalayın:

    public override void EndInit()
    {
        base.EndInit();
        Order_DetailsRowChanging += TestRowChangeEvent;
    }
    
    public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e)
    {
        if ((short)e.Row.Quantity <= 0)
        {
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
        }
        else
        {
            e.Row.SetColumnError("Quantity", "");
        }
    }
    

Değiştirilen satırları almak için

Veri tablosundaki her satır, numaralandırmadaki değerleri DataRowState kullanarak bu satırın geçerli durumunu izleyen bir RowState özelliğe sahiptir. veya yöntemini DataSet DataTableçağırarak bir veri kümesinden veya veri tablosundan GetChanges değiştirilen satırları döndürebilirsiniz. Bir veri kümesinin yöntemini çağırarak HasChanges çağrısından GetChanges önce değişikliklerin mevcut olduğunu doğrulayabilirsiniz.

Not

Veri kümesinde veya veri tablosundaki değişiklikleri işledikten sonra (yöntemini çağırarak AcceptChanges ), GetChanges yöntem veri döndürmez. Uygulamanızın değiştirilen satırları işlemesi gerekiyorsa, yöntemini çağırmadan AcceptChanges önce değişiklikleri işlemeniz gerekir.

Bir veri kümesinin GetChanges veya veri tablosunun yöntemini çağırmak, yalnızca değiştirilmiş kayıtları içeren yeni bir veri kümesi veya veri tablosu döndürür. Belirli kayıtları (örneğin, yalnızca yeni kayıtlar veya yalnızca değiştirilmiş kayıtlar) almak istiyorsanız, sabit listesindeki DataRowState bir değeri yönteme GetChanges parametre olarak geçirebilirsiniz.

Bir satırın DataRowVersion farklı sürümlerine (örneğin, işlemeden önce bir satırda yer alan özgün değerler) erişmek için numaralandırmayı kullanın.

Bir veri kümesinden tüm değiştirilmiş kayıtları almak için

  • Veri kümesinin GetChanges yöntemini çağırın.

    Aşağıdaki örnek adlı changedRecords yeni bir veri kümesi oluşturur ve bu veri kümesini adlı dataSet1başka bir veri kümesinden değiştirilen tüm kayıtlarla doldurur.

    DataSet changedRecords = dataSet1.GetChanges();
    

Veri tablosundan değiştirilen tüm kayıtları almak için

  • GetChanges DataTable yöntemini çağırın.

    Aşağıdaki örnek adlı changedRecordsTable yeni bir veri tablosu oluşturur ve adlı başka bir veri tablosundan dataTable1değiştirilen tüm kayıtlarla doldurur.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Belirli bir satır durumuna sahip tüm kayıtları almak için

  • Bir veri kümesinin GetChanges veya veri tablosunun yöntemini çağırın ve bir DataRowState sabit listesi değerini bağımsız değişken olarak geçirin.

    Aşağıdaki örnekte adlı addedRecords yeni bir veri kümesinin nasıl oluşturulacağı ve yalnızca veri kümesine dataSet1 eklenmiş olan kayıtlarla nasıl doldurulacağı gösterilmektedir.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    

    Aşağıdaki örnekte, tabloya son eklenen tüm kayıtların nasıl döndürüleceği gösterilmektedir Customers :

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    

DataRow'un özgün sürümüne erişme

Veri satırlarında değişiklik yapıldığında, veri kümesi satırın hem özgün (Original) hem de yeni (Current) sürümlerini korur. Örneğin, yöntemini çağırmadan AcceptChanges önce uygulamanız kaydın farklı sürümlerine erişebilir (numaralandırmada DataRowVersion tanımlandığı gibi) ve değişiklikleri buna göre işleyebilir.

Not

Satırın farklı sürümleri yalnızca düzenlendikten sonra ve yöntemi çağrıldıktan önce AcceptChanges bulunur. AcceptChanges Yöntem çağrıldıktan sonra geçerli ve özgün sürümler aynıdır.

DataRowVersion Değeri sütun dizini (veya sütun adı dize olarak) ile birlikte geçirmek, söz konusu sütunun belirli satır sürümündeki değeri döndürür. değiştirilen sütun ve ColumnChanged olayları sırasında ColumnChanging tanımlanır. Doğrulama amacıyla farklı satır sürümlerini incelemek için iyi bir zaman. Ancak kısıtlamaları geçici olarak askıya aldıysanız bu olaylar tetiklenmez ve hangi sütunların değiştiğini program aracılığıyla belirlemeniz gerekir. Bunu yapmak için koleksiyonda Columns yineleme yapabilir ve farklı DataRowVersion değerleri karşılaştırabilirsiniz.

Kaydın özgün sürümünü almak için

  • Döndürmek istediğiniz satırı geçirerek DataRowVersion sütunun değerine erişin.

    Aşağıdaki örnekte, içindeki bir DataRowVersion alanın DataRowözgün değerini almak için bir CompanyName değerin nasıl kullanılacağı gösterilmektedir:

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    

DataRow'un geçerli sürümüne erişme

Kaydın geçerli sürümünü almak için

  • Bir sütunun değerine erişin ve dizine bir satırın hangi sürümünü döndürmek istediğinizi belirten bir parametre ekleyin.

    Aşağıdaki örnekte, içindeki bir DataRowVersion alanın DataRowgeçerli değerini almak için bir CompanyName değerin nasıl kullanılacağı gösterilmektedir:

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();