Aracılığıyla paylaş


Nasıl yapılır: Veri Kümesi Değişikliklerini Veritabanına Kaydetme

Veri setininizdaki verinin değiştirilmesinden ve doğrulanmasından sonra, büyük olasılıkla güncelleştirilmiş verileri bir veritabanına geri göndermek istiyeceksiniz.Değiştirilmiş verileri bir veritabanına göndermek için, TableAdapter in Update yöntemini veya veri bağdaştırıcısını çağırabilirsiniz.Bağdaştırıcının Update methodu tek bir veri tablosunu günceller ve tablodaki her veri satırının RowState 'e göre doğru komutlarını (INSERT, UPDATE veya DELETE) çalıştırır.

İlgili tablolardaki veriler kaydedilirken, Visual Studio veritabanı içinde tanımlanan yabancı anahtar kısıtlamalarını temel alarak doğru sırada kaydedilmesine yardımcı olan bir TableAdapterManager bileşeni sağlar.Daha fazla bilgi için bkz. Hiyerarşik Güncelleştirmeye Genel Bakış.

[!NOT]

bir try/catch bloğunun içinde bağdaştırıcının Update yöntemini çağıran kodu koymalısınız çünkü bir veri seti içeriği ile bir veri kaynağını güncellemeye çalışırmak hatalara neden olabilir.

Bir veri kaynağını güncellemek için aynı yordamın iş ihtiyaçlarınıza bağlı olarak değişebilir, ancak uygulama aşağıdakileri içermelidir:

  1. Bir try/catch içinde veritabana güncelleştirmeleri gönderme girişimleri için kod çalıştırmak.

  2. Bir özel durum yakalanırsa, hataya neden olan veri satırı bulun.Daha fazla bilgi için bkz. Nasıl yapılır: Hatalar İçeren Satırların Konumunu Bulma.

  3. Veri satırındaki problemde uzlaşma sağla (mümkünse program aracılığıyla veya geçersiz satır değişikliğini kullanıcıya sunarak) ve sonra güncelleştirmeyi deneyin (HasErrors özelliği, GetErrors yöntemi).

Verileri bir veritabanına kaydetme

veri bağdaştırıcısının veritabanına yazılması için değerleri içeren veri tablosunun adını geçiren TableAdapter veya Veri adapterin Update metodunu çağırma.Verileri tek bir veri tablosundan bir veritabanına kaydetme hakkında daha fazla bilgi için bkz: İzlenecek yol: Verileri Bir Veritabanına Kaydetme (Tek Tablo).

Bir TableAdapter kullanarak bir veri seti ile bir veritabanını güncelleme.

  • Bir try/catch bloğunda TableAdapter.Update metodunu içerme.Aşağıdaki örnek, NorthwindDataSet nde Customers tablosunun içeriği ile güncelleştirmenin nasıl deneneceği gösterilmiştir.

    Try 
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers)
        MsgBox("Update successful")
    
    Catch ex As Exception
        MsgBox("Update failed")
    End Try
    
    try
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.customersTableAdapter.Update(this.northwindDataSet.Customers);
        MessageBox.Show("Update successful");
    }
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    

Bir Data Adapter kullanarak bir veri seti ile bir veritabanını güncelleme.

  • Bir try/catch bloğunda DataAdapter.Update metodunu içerme.Aşağıdaki örnek, DataSet1 nde Table1 içeriği ile bir veri kaynağı için güncelleştirme girişiminde gösterilmiştir.

    Try
        SqlDataAdapter1.Update(Dataset1.Tables("Table1"))
    
    Catch x As Exception
        ' Error during Update, add code to locate error, reconcile  
        ' and try to update again. 
    End Try
    
    try
    {
        SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
    }
    catch (Exception e)
    {
        // Error during Update, add code to locate error, reconcile  
        // and try to update again.
    }
    

Veri seti içindeki iki ilişkili tablonun güncelleştirilmesi

Veri setindeki ilişkili tablolar güncellenirken, bilgi tutarlılığı kısıtlamaları ihlal olasılığını azaltmak için doğru sırada güncelleştirmek önemlidir.Komut yürütme sırası veri setinde DataRowCollection nin endeksi takip edilecek.Yükselen veri bütünlüğü hatalarını önlemek için aşağıdaki dizide veritabanını güncellemek için en iyi yöntem olacaktır:

  1. Alt tablo: kayıtları silin.

  2. Üst tablo: ekleme, güncelleştirme ve kayıtlarını silin.

  3. Alt tablo: ekleme ve güncelleştirme kayıtları.

Birden çok tablodan gelen verileri kaydetme hakkında ayrıntılı bilgi için bkz: İzlenecek yol: Verileri Bir Veritabanına Kaydetme (Birden Çok Tablo).

İki veya daha fazla ilişkili tabloları güncelleştiriyorsanız, bir işlem içinde tüm güncelleştirme mantığını eklemeniz gerekir.Bir transaksiyon değişiklikleri uygulamadan önce ilgili tüm değişiklikleri veritabanına başarılı bir şekilde işleyen işlemdir.Daha fazla bilgi için bkz. Transactions and Concurrency.

İki ilişkili tablonuyu bir TableAdapter kullanarak güncelleştirme

  1. Farklı kayıtları tutmak için üç geçici DataTableoluşturma.

  2. Bir try/catch bloğu içinden her alt satır kümesi için Update metodunu çağırma.Güncelleştirme hataları oluşursa, eylemin önerilen sırası dallara ayrılır ve çözümlenir.

  3. Değişiklikleri veri setinden veritabanına uygulayın.

  4. Kaynakları serbest bırakmak için geçici tabloları yok edin.

    Private Sub UpdateDB()
        Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
        Dim newChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
        Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
        Try 
            If deletedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(deletedChildRecords)
            End If
    
            CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
            If newChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(newChildRecords)
            End If 
    
            If modifiedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(modifiedChildRecords)
            End If
    
            NorthwindDataSet.AcceptChanges()
    
        Catch ex As Exception
            MessageBox.Show("An error occurred during the update process")
            ' Add code to handle error here. 
    
        Finally 
            If deletedChildRecords IsNot Nothing Then
                deletedChildRecords.Dispose()
            End If 
    
            If newChildRecords IsNot Nothing Then
                newChildRecords.Dispose()
            End If 
    
            If modifiedChildRecords IsNot Nothing Then
                modifiedChildRecords.Dispose()
            End If 
    
        End Try 
    End Sub
    
    void UpdateDB()
    {
        NorthwindDataSet.OrdersDataTable deletedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        NorthwindDataSet.OrdersDataTable newChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        NorthwindDataSet.OrdersDataTable modifiedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
        try
        {
            if (deletedChildRecords != null)
            {
                ordersTableAdapter.Update(deletedChildRecords);
            }
    
            customersTableAdapter.Update(northwindDataSet.Customers);
    
            if (newChildRecords != null)
            {
                ordersTableAdapter.Update(newChildRecords);
            }
    
            if (modifiedChildRecords != null)
            {
                ordersTableAdapter.Update(modifiedChildRecords);
            }
    
            northwindDataSet.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            MessageBox.Show("An error occurred during the update process");
            // Add code to handle error here.
        }
    
        finally
        {
            if (deletedChildRecords != null)
            {
                deletedChildRecords.Dispose();
            }
            if (newChildRecords != null)
            {
                newChildRecords.Dispose();
            }
            if (modifiedChildRecords != null)
            {
                modifiedChildRecords.Dispose();
            }
        }
    }
    

İki ilişkili tabloyu veri bağdaştırıcısı kullanarak güncelleştirme

  • Her veri bağdaştırıcısının Update methodunu çağırma

    Aşağıdaki örnek, ilişkili tabloları içeren bir veri seti ile bir veri kaynağınının nasıl güncelleneği gösterilmiştir.Yukarıdaki sırayı takip etmek için, farklı kayıtları tutmak için üç geçici DataTableoluşturulacaktır.Daha sonra Update yöntemi try/catch içinden her alt satır kümesi için çağrılır.Güncelleştirme hataları oluşursa, eylemin önerilen sırası dallara ayrılır ve çözümlenir.Daha sonra ver' seti değişiklikleri kaydeder.Sonuç olarak kaynakları serbest bırakmak için geçici tabloları yok edin.

    Private Sub UpdateDB()
        Dim DeletedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Deleted)
    
        Dim NewChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Added)
    
        Dim ModifiedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Modified)
    
        Try 
            If Not DeletedChildRecords Is Nothing Then
                daOrders.Update(DeletedChildRecords)
            End If
    
            daCustomers.Update(dsNorthwind1, "Customers")
    
            If Not NewChildRecords Is Nothing Then
                daOrders.Update(NewChildRecords)
            End If 
    
            If Not ModifiedChildRecords Is Nothing Then
                daOrders.Update(ModifiedChildRecords)
            End If
    
            dsNorthwind1.AcceptChanges()
    
        Catch ex As Exception
            ' Update error, resolve and try again 
    
        Finally 
            If Not DeletedChildRecords Is Nothing Then
                DeletedChildRecords.Dispose()
            End If 
    
            If Not NewChildRecords Is Nothing Then
                NewChildRecords.Dispose()
            End If 
    
            If Not ModifiedChildRecords Is Nothing Then
                ModifiedChildRecords.Dispose()
            End If 
        End Try 
    End Sub
    
    void UpdateDB()
    {
        System.Data.DataTable DeletedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Deleted);
    
        System.Data.DataTable NewChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Added);
    
        System.Data.DataTable ModifiedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Modified);
    
        try
        {
            if (DeletedChildRecords != null)
            {
                daOrders.Update(DeletedChildRecords);
            }
            if (NewChildRecords != null)
            {
                daOrders.Update(NewChildRecords);
            }
            if (ModifiedChildRecords != null)
            {
                daOrders.Update(ModifiedChildRecords);
            }
    
            dsNorthwind1.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            // Update error, resolve and try again
        }
    
        finally
        {
            if (DeletedChildRecords != null)
            {
                DeletedChildRecords.Dispose();
            }
            if (NewChildRecords != null)
            {
                NewChildRecords.Dispose();
            }
            if (ModifiedChildRecords != null)
            {
                ModifiedChildRecords.Dispose();
            }
        }
    }
    

Ayrıca bkz.

Kavramlar

Visual Studio'da Verilere Windows Forms Denetimleri Bağlama

Uygulamanızı Veri Almaya Hazırlama

Uygulamanıza Veri Getirme

Visual Studio'da Verilere Denetimler Bağlama

Uygulamanızdaki Verileri Düzenleme

Verileri Doğrulama

Verileri Kaydetme

Diğer Kaynaklar

Veri İzlenecek Yollar

Visual Studio'da Verilere Bağlanma