Partager via


DataAdapter.AcceptChangesDuringUpdate Propriété

Définition

Obtient ou définit si AcceptChanges() est appelé pendant un 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

Valeur de propriété

true si AcceptChanges() est appelé pendant un Update(DataSet) ; sinon, false. La valeur par défaut est true.

Exemples

Cet exemple illustre l'extraction des lignes modifiées d'un objet DataTable et l'utilisation d'un objet SqlDataAdapter pour mettre à jour la source de données et récupérer une nouvelle valeur de colonne d'identité. En définissant la AcceptChangesDuringUpdate propriété de sur SqlDataAdapterfalse pour conserver la valeur d’incrément automatique d’origine, les nouvelles données peuvent ensuite être fusionnées dans l’élément d’origine DataTable, même si la nouvelle valeur d’identité ne correspond pas à la valeur d’incrément automatique d’origine dans .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

Remarques

Lors d’un appel à la Update méthode d’un DataAdapter, la base de données peut renvoyer des données à votre application ADO.NET en tant que paramètres de sortie ou comme premier enregistrement retourné d’un jeu de résultats. ADO.NET peut récupérer ces valeurs et mettre à jour les colonnes correspondantes dans l'objet DataRow en cours de mise à jour. Par défaut, ADO.NET appelle la AcceptChanges méthode du DataRow après la mise à jour. Toutefois, si vous souhaitez fusionner la ligne mise à jour dans une autre DataTable, vous pouvez conserver la valeur d’origine d’une colonne de clé primaire. Par exemple, une colonne de clé primaire correspondant à une colonne d’incrémentation automatique dans la base de données, telle qu’une colonne d’identité, peut contenir de nouvelles valeurs affectées par la base de données qui ne correspondent pas aux valeurs d’origine attribuées dans .DataRow Par défaut, AcceptChanges est appelé implicitement après une mise à jour, et les valeurs d’origine de la ligne, qui peuvent être AutoIncrement des valeurs attribuées par ADO.NET, sont perdues. Vous pouvez conserver les valeurs d’origine dans le en empêchant d’appeler DataRowAcceptChanges une fois qu’il a effectué une mise à jour sur une ligne, en définissant la AcceptChangesDuringUpdate propriété sur false, qui conserve les valeurs ADO.NET d’origine.

Notes

La définition de la AcceptChangesDuringUpdate propriété sur false s’applique à toutes les modifications de données, et pas seulement aux insertions. Si vous souhaitez modifier ou supprimer des lignes dans la même mise à jour, et si vous souhaitez supprimer l’appel à AcceptChanges uniquement pour les insertions, au lieu de définir falseAcceptChangesDuringUpdate sur , utilisez un gestionnaire d’événements pour l’événement RowUpdated de .DataAdapter Dans le gestionnaire d’événements, vous pouvez case activée pour StatementType déterminer si la modification de données est une insertion et si true, définissez la Status propriété du RowUpdatedEventArgs sur SkipCurrentRow. Pour plus d’informations et un exemple, consultez Extraction de l’identité ou de valeurs à numérotation automatique.

S’applique à

Voir aussi