DataTable.Merge and DataTable.ImportRow does not change RowState
.net, ado.net, oledb
Solution
You need to fire off the appropriate function for each DataRow.
- DataRow.SetAdded()
- DataRow.SetModified()
This will update the DataRow.RowState value. This is what a DataAdapter goes by to determine which rows need what actions performed on them.
It would be nice if their was something like a binded dataset in .net so that it would manage these mundane details for us.
Problem
I am having issues with ADO.NET 2.0 merging/importing data. I need to update/insert data from one generic table to another table with both tables maintaining an identical schema. The following code works great locally, but does not make changes to the database: ``` OleDbDataAdapter localDA = loadLocalData(); OleDbDataAdapter hostedDA = loadHostedData(); DataSet dsLocal = new DataSet(); localDA.Fill(dsLocal); DataSet dsChanges = new DataSet(); hostedDA.Fill(dsChanges); dsLocal.Tables[0].Merge(dsChanges.Tables[0],false); localDA.Update(dsLocal.Tables[0]); ``` The same is true with this code snippet: ``` OleDbDataAdapter localDA = loadLocalData(); OleDbDataAdapter hostedDA = loadHostedData(); DataSet dsLocal = new DataSet(); localDA.Fill(dsLocal); DataSet dsChanges = new DataSet(); hostedDA.Fill(dsChanges); foreach (DataRow changedRow in dsChanges.Tables[0].Rows) { if (recordExists(dsLocal.Tables[0], changedRow["ID"])) { } else { dsLocal.Tables[0].ImportRow(changedRow); } } localDA.Update(dsLocal.Tables[0]); ``` When I looked at the RowState property for changed/appended rows they remain "unchanged". I am wanting to avoid data mapping the columns if possible, which is what I may have to do using the NewRow() method and modifying an existing row.