Aracılığıyla paylaş


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

Uyarı

Sınıf DataSet 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ümeleri başarısı kanıtlanmış bir teknoloji olsa da, yeni .NET uygulamaları için önerilen yaklaşım Entity Framework Core kullanmaktır. 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:

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 oluşturulur ve sonrasında tetiklenir. Olay ColumnChanging , belirli sütunlardaki değişiklikleri doğrulamak istediğinizde kullanışlıdır. Önerilen değişiklik hakkındaki bilgiler, olayla birlikte bir bağımsız değişken olarak iletilir.
  • 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. İlki, değiştirilen belirli bir sütun için ColumnChanging ve ColumnChanged olaylarıdır. Sıradaki RowChanging ve RowChanged olaylarıdır. Satırda birden çok değişiklik yapılıyorsa, her değişiklik için olaylar tetiklenir.

Uyarı

Veri satırının BeginEdit yöntemi, her bir sütun değişikliğinden sonra RowChanging ve RowChanged olaylarını devre dışı bırakır. Yani, EndEdit yöntemi çağrılana kadar olay tetiklenmez ve RowChanging ve RowChanged olayları sadece bir kez tetiklenir. 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 hatayı yakalamanız önemliyse, ColumnChanging olayını kullanarak doğrulama ekleyin. Aksi takdirde, aynı anda birkaç hata yakalamaya neden olabilecek RowChanging olayını kullanın. 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, güçlü türlendirilmiş olay işleyicileri oluşturabilirsiniz. Bu, işleyicileri oluşturabileceğiniz dört ek türlenmiş olay ekler: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeleting ve dataTableNameRowDeleted. Bu türdeki olay işleyicileri, tablonuzun sütun adlarını içeren ve kod yazımını ve okunmasını kolaylaştıran bir argüman geçirir.

Veri güncelleştirme olayları

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

Olay, satırı ve hangi eylem türünün (değişiklik, ekleme vb.) gerçekleştirildiğini belirten bir değeri size iletir.
RowChanged Bir satır değiştirildi. Olay, hangi eylemin (değişiklik, ekleme vb.) gerçekleştirildiğini belirten bir değerle birlikte satırı size aktarır.
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 RowChangedRowDeleted 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

Uyarı

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. e.ProposedValue içeriğine dayanarak ş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 değeri 0 veya daha az olduğunda bir sütun hatası oluşur. Satır değiştirici 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ı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 kısmi sınıf dosyasında RowChanging öğesinin DataTable olay işleyicisini otomatik olarak oluşturur.

    Tavsiye

    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ı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, DataTable için bir kısmi sınıf dosyası oluşturur.

    Uyarı

    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. Verisetinden veya veri tablosundan değiştirilmiş satırları döndürmek için bir DataSet veya DataTableGetChanges yöntemini çağırabilirsiniz. Bir veri kümesinin yöntemini çağırarak HasChanges çağrısından GetChanges önce değişikliklerin mevcut olduğunu doğrulayabilirsiniz.

Uyarı

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 veya veri tablosunun GetChanges metodunu çağırın ve bir DataRowState enum değerini argüman 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.

Uyarı

Satırın farklı sürümleri, yalnızca düzenlendikten sonra ve AcceptChanges yöntemi çağrılmadan önce 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, ColumnChanging ve ColumnChanged olayları sırasında 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 orijinal 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();