DataAdapter.AcceptChangesDuringUpdate Proprietà

Definizione

Ottiene o imposta se il metodo AcceptChanges() viene chiamato durante un metodo 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

Valore della proprietà

true se AcceptChanges() viene chiamato durante il metodo Update(DataSet); in caso contrario, false. Il valore predefinito è true.

Esempio

In questo esempio vengono illustrati l'estrazione di righe modificate da un oggetto DataTable e l'uso di SqlDataAdapter per aggiornare l'origine dati e recuperare un nuovo valore per la colonna Identity. Impostando la AcceptChangesDuringUpdate proprietà di SqlDataAdapter su false per mantenere il valore di incremento automatico originale, i nuovi dati possono quindi essere uniti nell'originale DataTable, anche se il nuovo valore Identity non corrisponde al valore di incremento automatico originale in 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

Commenti

Durante una chiamata al Update metodo di un DataAdapter, il database può inviare i dati all'applicazione ADO.NET come parametri di output o come primo record restituito di un set di risultati. ADO.NET può recuperare questi valori e aggiornare le colonne corrispondenti nell'oggetto DataRow da aggiornare. Per impostazione predefinita, ADO.NET chiama il AcceptChanges metodo di DataRow dopo l'aggiornamento. Tuttavia, se si desidera unire nuovamente la riga aggiornata in un'altra DataTable, è possibile mantenere il valore originale di una colonna chiave primaria. Ad esempio, una colonna chiave primaria corrispondente a una colonna che incrementa automaticamente nel database, ad esempio una colonna Identity, può contenere nuovi valori assegnati dal database che non corrispondono ai valori originali assegnati in DataRow. Per impostazione predefinita, AcceptChanges viene chiamato in modo implicito dopo un aggiornamento e i valori originali nella riga, che potrebbero essere stati AutoIncrement assegnati da ADO.NET, vengono persi. È possibile mantenere i valori originali in DataRow impedendo di chiamare AcceptChanges dopo l'esecuzione di un aggiornamento in una riga, impostando la AcceptChangesDuringUpdate proprietà su false, che mantiene ADO.NET i valori originali.

Nota

L'impostazione della AcceptChangesDuringUpdate proprietà su false si applica a tutte le modifiche ai dati, non solo agli inserimenti. Se si desidera modificare o eliminare righe nello stesso aggiornamento e se si desidera eliminare la chiamata a AcceptChanges solo per gli inserimenti, invece di impostare AcceptChangesDuringUpdate su false, usare un gestore eventi per l'evento RowUpdated di DataAdapter. Nel gestore eventi è possibile controllare per StatementType determinare se la modifica dei dati è un inserimento e, se true, impostare la Status proprietà di RowUpdatedEventArgs su SkipCurrentRow. Per altre informazioni e un esempio, vedere Recupero di valori identity o di numerazione automatica.

Si applica a

Vedi anche