John Calsbeek
John Calsbeek

Reputation: 36547

DataAdapter.Fill() behavior for row deleted at the data source

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()

DataAdapter.Fill()

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:

So, my questions:

Upvotes: 4

Views: 3464

Answers (2)

Heinzi
Heinzi

Reputation: 172408

I see a similar problem but I cannot use .Clear since the DataTable is bound to a user interface list and .Clear followed by .Fill causes the list to lose the user's current selection. Thus, I implemented a (ugly) workaround which basically consists of

  1. changing a field in the DataTable to a value that I know this field will never have
  2. running .Fill
  3. removing all rows containing this value

In other words:

    For Each drow As DataRow In dset.Tables(0).Rows
        drow.Item("myField") = -1
    Next

    myDataAdapter.Fill(dset)

    Dim drowsRemove = (From drow In dset.Tables(0).AsEnumerable() _
                       Where drow.Field(Of Integer)("myField") = -1).ToList()
    For Each drow In drowsRemove
        dset.Tables(0).Rows.Remove(drow)
    Next

Any suggestions for more elegant solutions are appreciated.

Upvotes: 1

John Calsbeek
John Calsbeek

Reputation: 36547

Turns out that my assumption is erroneous—if a row returned by the SelectCommand is exactly the same as a row already in the DataTable, that row remains marked as DataRowState.Unchanged. So the proper procedure is removing rows from the DataTable before calling Fill(), and determining the fate of a row by comparing the new set of DataRowState.Added rows to the former list of rows.

Upvotes: 1

Related Questions