I'm using the DataSet/DataTable/DataAdapter architecture to mediate between the database and my model objects, which have their own backing (they aren't backed by a DataRow). I've got a DataAdapter with AcceptChangesDuringFill = False, AcceptChangesDuringUpdate = False, and FillLoadOption = OverwriteChanges. Here's my understanding of the DataAdapter model under these conditions:
DataAdapter.Update()
DataRowState.Addedwill result in theInsertCommandfiringDataRowState.Modifiedwill result in theUpdateCommandfiringDataRowState.Deletedwill result in theDeleteCommandfiring
DataAdapter.Fill()
- Any row in the returned result set whose primary key corresponds to an existing row in the
DataTablewill be used to update that row, and that row's state will always becomeDataRowState.Modified, even if the returned row is identical to the current row - Any row in the returned result set whose primary key doesn't correspond to any existing row will be used to create a new row, and that row's state will become
DataRowState.Added - Any row in the
DataTablethat doesn't correspond to a row in the returned result set will stay atDataRowState.Unchanged
Given that I'm correct with this mental model, suppose I want to use Fill() to notice deleted rows in the data source. Also, suppose that the parameters of the SelectCommand don't return the entire table. I'm guessing that I have two options:
- Find all the rows that should've been updated by the
Fill()but are stillDataRowState.Unchanged(relies on my untested italicized assumption above). These rows have been deleted at the data source. - Clear all relevant rows from the
DataTablebefore theFill(); any row that doesn't show up again has been deleted at the data source. This loses the distinction betweenDataRowState.AddedandDataRowState.Modifiedthat is preserved with the first method.
So, my questions:
- Is my above model of the
DataAdaptercorrect, subject to the property values I noted at the top? - Which option should I go with to find deleted rows? I'd prefer the first one, but that relies on my assumption that all returned rows will be set to
DataRowState.Modifiedeven if the row is identical; is that a safe assumption? - Am I going about this all wrong?