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.
You need to fire off the appropriate function for each DataRow.
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.
To get the behavior you want, I did the following instead of dsLocal.Tables[0].Merge(dsChanges.Tables[0],false);
:
using (DataTableReader changeReader = new DataTableReader(dsChanges.Tables[0]))
dsLocal.Tables[0].Load(newTableReader, LoadOption.Upsert);
This reads the changes table and "upserts" into the 'local' table, giving you the appropriate change notifications.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With