Nasıl yapılır: Dataset değişikliklerini veritabanına Kaydet
Sizin DataSet'teki verileri değiştiren ve doğrulanmış sonra büyük olasılıkla güncelleştirilmiş verileri bir veritabanına geri göndermek istiyorsunuz. Değiştirilmiş verileri bir veritabanına göndermek için arama Update yöntemi bir TableAdapter veya veri bağdaştırıcısı. Bağdaştırıcının Update yöntemi bir tek veri tablosunu güncelleştirir ve temel doğru komut (INSERT, update veya delete) yürüten RowState , her veri satırı tablosundaki.
İlgili tablolarda veri kaydederken, Visual Studio veritabanı içinde tanımlanan yabancı anahtar kısıtlamalarını temel doğru sırada kaydeder gerçekleştirmede yardımcı olur bir TableAdapterManager bileşeni sağlar. Daha fazla bilgi için bkz. Hiyerarşik Update genel bakış.
Not
Bağdaştırıcının çağıran kodun bir dataset içeriğini bir veri kaynağını güncelleştirmek çalışırken hatalara neden olabilir çünkü koyun Update yöntemi içinde bir try/catch blok.
Veri kaynağını güncelleştirmek için aynı yordamın iş gereksinimlerinize göre değişebilir, ancak aşağıdaki adımları uygulamanız içermelidir:
Veritabanı içinde güncelleştirmeleri gönderme girişimleri kod yürütmesine bir try/catch blok.
Bir özel durum yakalandı, hataya neden olan veri satırı bulun. Daha fazla bilgi için bkz. Nasıl yapılır: hata bulunan satırları bulun.
Veri sorunu mutabakat (programlı olarak mümkün değilse, veya geçersiz satır değişikliği kullanıcıya sunmak) simgesini tıklatın ve ardından güncelleştirmeyi deneyin (HasErrors özelliği, GetErrors yöntemi).
Bir veritabanına veri kaydetme
Call Update yöntemi, veri tablosunun adını geçirerek bir TableAdapter veya veri bağdaştırıcısı, veritabanına yazılması için değerleri içerir. Tek veri tablosundan verileri bir veritabanına kaydetme hakkında daha fazla bilgi için bkz: İzlenecek yol: Bir veritabanı (tek tablo) verilerini kaydetme.
Bir TableAdapter kullanarak bir dataset ile bir veritabanını güncelleştirme
İçine TableAdapter.Update yönteminin içine bir try/catch blok. Nasıl içeriğiyle ilgili bir güncelleştirme denemesi aşağıdaki örnekte gösterilmektedir Customers , tablo NorthwindDataSet.
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 veritabanına veri bağdaştırıcısı kullanarak bir dataset ile güncelleştirmek için
İçine DataAdapter.Update yönteminin içine bir try/catch blok. Nasıl içeriğini içeren bir veri kaynağı için bir güncelleştirme girişimi aşağıdaki örnekte gösterilmektedir Table1 , DataSet1.
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. }
Dataset içindeki iki ilişkili tablonun güncelleştiriliyor
Bir dataset içindeki ilgili tablolarını güncelleştirirken başvurusal bütünlük kısıtlamalarını ihlal etme olasılığını azaltmak için doğru sırada güncelleştirmek önemlidir. Komut yürütme sırasını, indices takip edecek DataRowCollection DataSet. Veri tutarlılığı hataları artırılmasını engellemek için aþaðýdaki sýrada veritabanýný güncelleþtirmek için en iyi yöntem olacaktır:
Alt tablo: kayıtları silme.
Üst Tablo: ekleme, güncelleştirme ve kayıtlarını silmek.
Alt tablo: ekleme ve kayıtları güncelleştirmek.
Birden çok tablodan gelen verileri kaydetme ile ilgili ayrıntılı bilgi için bkz: İzlenecek yol: Bir veritabanı (birden çok tabloları) verilerini kaydetme.
İki veya daha fazla ilişkili tabloları güncelleştiriyorsanız, işlem içindeki tüm güncelleştirme mantığı eklemeniz gerekir. Bir hareket, herhangi bir değişiklik yapılıyor önce tüm ilgili değişiklikleri veritabanına başarılı olmasını sağlar bir işlemdir. Daha fazla bilgi için bkz. Performing Transactions.
İki ilişkili tablonun bir TableAdapter kullanarak güncelleştirmek için
Üç geçici oluşturmak DataTables farklı kayıtları tutmak için.
Call Update yöntemi her alt içinden satır kümesi için bir try/catch blok. Güncelleştirme hataları oluşursa, şube ve bunları çözmek için önerilen eylem olur.
Değişiklikleri veritabanına dataset nesnesinden uygulayın.
Kaynakları serbest bırakmak için geçici tablolar çöpe atın.
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 tablonun veri bağdaştırıcısı kullanarak güncelleştirmek için
Call Update yöntemi, her veri bağdaştırıcısı.
Aşağıdaki örnek, ilişkili tabloları içeren bir dataset ile bir veri kaynağını güncelleştirmek gösterilmiştir. Yukarıdaki üç geçici sırasının gelmesini DataTables oluşturulan farklı kayıtları tutmak için. Sonra Update yöntemi adlı için her alt satır kümesi içinden bir try/catch blok. Güncelleştirme hataları oluşursa, şube ve bunları çözmek için önerilen eylem olur. Daha sonra DataSet'i değişiklikleri kaydeder. Son olarak, kaynakları serbest bırakmak için geçici veri tablolarından atın.
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 2012'deki Veri Uygulaması Geliştirme Yenilikleri
Windows Forms denetimleri Visual Studio veri bağlama
Uygulamanız veri almaya hazırlanıyor
Visual Studio veri denetimleri