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:
Bir try/catch içinde veritabana güncelleştirmeleri gönderme girişimleri için kod çalıştırmak.
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.
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:
Alt tablo: kayıtları silin.
Üst tablo: ekleme, güncelleştirme ve kayıtlarını silin.
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
Farklı kayıtları tutmak için üç geçici DataTableoluşturma.
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.
Değişiklikleri veri setinden veritabanına uygulayın.
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
Visual Studio'da Verilere Denetimler Bağlama
Uygulamanızdaki Verileri Düzenleme