DataAdapter.AcceptChangesDuringUpdate Properti
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mendapatkan atau mengatur apakah AcceptChanges() dipanggil selama Update(DataSet).
public:
property bool AcceptChangesDuringUpdate { bool get(); void set(bool value); };
public bool AcceptChangesDuringUpdate { get; set; }
member this.AcceptChangesDuringUpdate : bool with get, set
Public Property AcceptChangesDuringUpdate As Boolean
Nilai Properti
true
jika AcceptChanges() dipanggil selama Update(DataSet); jika tidak false
. Default adalah true
.
Contoh
Contoh ini menunjukkan mengekstrak baris yang diubah dari DataTable
dan menggunakan SqlDataAdapter untuk memperbarui sumber data dan mengambil nilai kolom identitas baru. Dengan mengatur AcceptChangesDuringUpdate
properti ke SqlDataAdapterfalse
untuk mempertahankan nilai kenaikan otomatis asli, data baru kemudian dapat digabungkan ke dalam aslinya DataTable, bahkan jika nilai identitas baru tidak cocok dengan nilai kenaikan otomatis asli di DataTable
.
private static void MergeIdentityColumns(string connectionString)
{
using (SqlConnection connection =
new SqlConnection(connectionString))
{
// Create the DataAdapter
SqlDataAdapter adapter =
new SqlDataAdapter(
"SELECT ShipperID, CompanyName FROM dbo.Shippers",
connection);
//Add the InsertCommand to retrieve new identity value.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO dbo.Shippers (CompanyName) " +
"VALUES (@CompanyName); " +
"SELECT ShipperID, CompanyName FROM dbo.Shippers " +
"WHERE ShipperID = SCOPE_IDENTITY();", connection);
// Set AcceptChangesDuringUpdate to false
adapter.AcceptChangesDuringUpdate = false;
// Add the parameter for the inserted value.
adapter.InsertCommand.Parameters.Add(
new SqlParameter("@CompanyName", SqlDbType.NVarChar, 40,
"CompanyName"));
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;
// MissingSchemaAction adds any missing schema to
// the DataTable, including auto increment columns
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
// Fill a DataTable.
DataTable shipper = new DataTable();
adapter.Fill(shipper);
// Add a new shipper row.
DataRow newRow = shipper.NewRow();
newRow["CompanyName"] = "New Shipper";
shipper.Rows.Add(newRow);
// Add changed rows to a new DataTable. This
// DataTable will be used to update the data source.
DataTable dataChanges = shipper.GetChanges();
adapter.Update(dataChanges);
connection.Close();
Console.WriteLine("Rows after merge.");
foreach (DataRow rowBefore in shipper.Rows)
{
{
Console.WriteLine("{0}: {1}", rowBefore[0], rowBefore[1]);
}
}
// Merge the two DataTables to get new values.
shipper.Merge(dataChanges);
// Commit the changes.
shipper.AcceptChanges();
Console.WriteLine("Rows after merge.");
foreach (DataRow rowAfter in shipper.Rows)
{
{
Console.WriteLine("{0}: {1}", rowAfter[0], rowAfter[1]);
}
}
}
}
Private Sub MergeIdentityColumns(ByVal connectionString As String)
Using connection As SqlConnection = New SqlConnection( _
connectionString)
' Create the DataAdapter
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT ShipperID, CompanyName FROM dbo.Shippers", connection)
' Add the InsertCommand to retrieve new identity value.
adapter.InsertCommand = New SqlCommand( _
"INSERT INTO dbo.Shippers (CompanyName) " & _
"VALUES (@CompanyName); " & _
"SELECT ShipperID, CompanyName FROM dbo.Shippers " & _
"WHERE ShipperID = SCOPE_IDENTITY();", _
connection)
' Set AcceptChangesDuringUpdate to false.
adapter.AcceptChangesDuringUpdate = False
' Add the parameter for the inserted value.
adapter.InsertCommand.Parameters.Add( _
New SqlParameter("@CompanyName", SqlDbType.NVarChar, 40, _
"CompanyName"))
adapter.InsertCommand.UpdatedRowSource = _
UpdateRowSource.FirstReturnedRecord
' MissingSchemaAction adds any missing schema to
' the DataTable, including auto increment columns
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
' Fill a DataTable.
Dim shipper As New DataTable
adapter.Fill(shipper)
' Add a new shipper row.
Dim newRow As DataRow = shipper.NewRow()
newRow("CompanyName") = "New Shipper"
shipper.Rows.Add(newRow)
' Add changed rows to a new DataTable. This
' DataTable will be used to update the data source.
Dim dataChanges As DataTable = shipper.GetChanges()
' Update the data source with the modified records.
adapter.Update(dataChanges)
Console.WriteLine("Rows before merge.")
Dim rowBefore As DataRow
For Each rowBefore In shipper.Rows
Console.WriteLine("{0}: {1}", rowBefore(0), rowBefore(1))
Next
' Merge the two DataTables to get new values.
shipper.Merge(dataChanges)
' Commit the changes.
shipper.AcceptChanges()
Console.WriteLine("Rows after merge.")
Dim rowAfter As DataRow
For Each rowAfter In shipper.Rows
Console.WriteLine("{0}: {1}", rowAfter(0), rowAfter(1))
Next
End Using
End Sub
Keterangan
Selama panggilan ke Update
metode DataAdapter
, database dapat mengirim data kembali ke aplikasi ADO.NET Anda sebagai parameter output atau sebagai rekaman pertama yang dikembalikan dari kumpulan hasil. ADO.NET dapat mengambil nilai-nilai ini dan memperbarui kolom terkait dalam yang DataRow sedang diperbarui. Secara default, ADO.NET memanggil AcceptChanges
metode DataRow
setelah pembaruan. Namun, jika Anda ingin menggabungkan baris yang diperbarui kembali ke baris lain DataTable, Anda mungkin ingin mempertahankan nilai asli kolom kunci primer. Misalnya, kolom kunci primer yang sesuai dengan kolom yang bertambah secara otomatis dalam database, seperti kolom identitas, bisa berisi nilai baru yang ditetapkan oleh database yang tidak cocok dengan nilai asli yang ditetapkan di DataRow
. Secara default, AcceptChanges
dipanggil secara implisit setelah pembaruan, dan nilai asli dalam baris, yang mungkin memiliki AutoIncrement nilai yang ditetapkan oleh ADO.NET, hilang. Anda dapat mempertahankan nilai asli di dengan DataRow
mencegah ADO.NET
panggilan AcceptChanges
setelah melakukan pembaruan pada baris, dengan mengatur AcceptChangesDuringUpdate properti ke false
, yang mempertahankan nilai asli.
Catatan
AcceptChangesDuringUpdate
Mengatur properti ke false
berlaku untuk semua modifikasi data, tidak hanya sisipan. Jika Anda ingin mengedit atau menghapus baris dalam pembaruan yang sama, dan jika Anda ingin menekan panggilan hanya untuk AcceptChanges
sisipan, maka alih-alih mengatur AcceptChangesDuringUpdate
ke false
, gunakan penanganan aktivitas untuk RowUpdated
peristiwa DataAdapter
. Di penanganan aktivitas, Anda dapat memeriksa StatementType untuk menentukan apakah modifikasi data adalah sisipan, dan jika true
, atur Status properti dari RowUpdatedEventArgs ke SkipCurrentRow. Untuk mendapatkan informasi selengkapnya, lihat Mengambil Nilai Identitas atau Jumlah Otomatis.