Bagikan melalui


DataAdapter.AcceptChangesDuringUpdate Properti

Definisi

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. Defaultnya adalah true.

Contoh

Contoh ini menunjukkan mengekstrak baris yang diubah dari DataTabledan 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 dalam 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-kolom bersangkutan untuk DataRow yang 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 utama. Misalnya, kolom kunci primer yang terkait dengan kolom yang bertambah secara otomatis dalam database, seperti kolom identitas, dapat berisi nilai baru yang ditetapkan oleh database yang tidak cocok dengan nilai asli yang ditetapkan dalam DataRow. Secara default, AcceptChanges dipanggil secara implisit setelah pembaruan, dan nilai asli dalam baris, yang mungkin merupakan AutoIncrement nilai yang ditetapkan oleh ADO.NET, hilang. Anda dapat mempertahankan nilai asli dalam DataRow dengan mencegah ADO.NET panggilan AcceptChanges setelah melakukan pembaruan pada baris, dengan mengatur AcceptChangesDuringUpdate properti ke false, yang mempertahankan nilai asli.

Nota

AcceptChangesDuringUpdate Mengatur properti agar 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 ke RowUpdatedEventArgsSkipCurrentRow. Untuk informasi lebih lanjut dan contohnya, lihat bagian Mengambil Nilai Identitas atau Jumlah Otomatis.

Berlaku untuk

Lihat juga