Dataset.Merge problem
-
Hey there, I have two datasets with exactly the same tables and exactly the same columns. I want to merge the second dataset into the first dataset, but i want to maintain the original row version of the first dataset. ds1.Merge(ds2, true, MissingSchemaAction.Ignore) only changes the Original Row version of ds1's rows and ds1.Merge(ds2, false, MissingSchemaAction.Ignore) changes both Original AND current value... is there no way to change only the Current version of a row?? I cannot ds2.Merge(ds1) because i have a modified dataset class which inherits datasets but also maintain a connection to a database. ds1 and ds2 are both connected to diffrent databases and changing the connection after merge doesn't work ;-(
-
Hey there, I have two datasets with exactly the same tables and exactly the same columns. I want to merge the second dataset into the first dataset, but i want to maintain the original row version of the first dataset. ds1.Merge(ds2, true, MissingSchemaAction.Ignore) only changes the Original Row version of ds1's rows and ds1.Merge(ds2, false, MissingSchemaAction.Ignore) changes both Original AND current value... is there no way to change only the Current version of a row?? I cannot ds2.Merge(ds1) because i have a modified dataset class which inherits datasets but also maintain a connection to a database. ds1 and ds2 are both connected to diffrent databases and changing the connection after merge doesn't work ;-(
thinking one step beyond solves the problem, which means I've already got a solution... for this interested, you need two merges... ds2.merge(ds1, true, MissingSchemaAction.Ignore) ds1.merge(ds2, false, MissingSchemaAction.Ignore)
-
Hey there, I have two datasets with exactly the same tables and exactly the same columns. I want to merge the second dataset into the first dataset, but i want to maintain the original row version of the first dataset. ds1.Merge(ds2, true, MissingSchemaAction.Ignore) only changes the Original Row version of ds1's rows and ds1.Merge(ds2, false, MissingSchemaAction.Ignore) changes both Original AND current value... is there no way to change only the Current version of a row?? I cannot ds2.Merge(ds1) because i have a modified dataset class which inherits datasets but also maintain a connection to a database. ds1 and ds2 are both connected to diffrent databases and changing the connection after merge doesn't work ;-(
Hi! I have written my own datatable merge function. It merges 2 datables, adding ew clumns to the source if those dont exists, and also append the new rows to the source. Hope my code is of help to you? Michiel Erasmus MaxCredible B.V. Nieuwezijds Voorburgwal 44 1012 SB Amsterdam Postbus 11079 1001 GB Amsterdam Postbus 11079 1001 GB Amsterdam T: +31(0)20-3449070 F: +31(0)20-3449071 I: http://www.maxcredible.com
#region MergeDataTables(), merge 2 datatables. /// /// DOEL: Merge 2 datatables. /// AUTEUR: Michiel Erasmus /// DATUM: ©30-maart-2005 Maxcredible B.V. /// /// /// /// /// public DataTable MergeDataTables(DataTable dtInput, DataTable dtOutput) { return MergeDataTables(dtInput, dtOutput, false); } public DataTable MergeDataTables(DataTable dtInput, DataTable dtOutput, bool addNewRowsToMerged) { if(dtInput == null) { return dtOutput; } try { if(dtOutput == null) { dtOutput = dtInput.Clone(); //kopieer de structuur van de bron, straks kopieer allse van bron naar dtOutput. if(dtOutput == null) // het is onmogelijk die bron datatable te kopieren. { return dtOutput; } } try { foreach(DataColumn dc in dtInput.Columns) { if(dtOutput.Columns[dc.ColumnName] == null) { dtOutput.Columns.Add(dc.ColumnName, dc.DataType); } } } catch { string strTijdelijk; strTijdelijk = "dummy"; } //kopieer de data foreach(DataRow drInput in dtInput.Rows) { DataRow drOutput; if(dtOutput.Rows.Count == 0 || addNewRowsToMerged) { drOutput = dtOutput.NewRow(); // kopieer een rij uit de datatable. } else { drOutput = dtOutput.Rows[0]; } drOutput.BeginEdit(); foreach(DataColumn dcInput in dtInput.Columns) { try // kopieer de kolom, als die in de mergetable is, anders gewoon doorgaan. { drOutput[dcInput.ColumnName] = drInput[dcInput.ColumnName]; // kopieer per kolom } catch { string strTijdelijk; strTijdelijk = "dummy"; } } drOutput.EndEdit(); if(dtOutput.Rows.Count == 0 || addNewRowsToMerged) { dtOutput.Rows.Add(drOutput); } dtOutput.AcceptChanges(); } dtOutput.AcceptChanges(); } catch(Exception ex) { throw new Exception(ex.Message + "; Stacktrace=" + ex.StackTrace,
-
Hi! I have written my own datatable merge function. It merges 2 datables, adding ew clumns to the source if those dont exists, and also append the new rows to the source. Hope my code is of help to you? Michiel Erasmus MaxCredible B.V. Nieuwezijds Voorburgwal 44 1012 SB Amsterdam Postbus 11079 1001 GB Amsterdam Postbus 11079 1001 GB Amsterdam T: +31(0)20-3449070 F: +31(0)20-3449071 I: http://www.maxcredible.com
#region MergeDataTables(), merge 2 datatables. /// /// DOEL: Merge 2 datatables. /// AUTEUR: Michiel Erasmus /// DATUM: ©30-maart-2005 Maxcredible B.V. /// /// /// /// /// public DataTable MergeDataTables(DataTable dtInput, DataTable dtOutput) { return MergeDataTables(dtInput, dtOutput, false); } public DataTable MergeDataTables(DataTable dtInput, DataTable dtOutput, bool addNewRowsToMerged) { if(dtInput == null) { return dtOutput; } try { if(dtOutput == null) { dtOutput = dtInput.Clone(); //kopieer de structuur van de bron, straks kopieer allse van bron naar dtOutput. if(dtOutput == null) // het is onmogelijk die bron datatable te kopieren. { return dtOutput; } } try { foreach(DataColumn dc in dtInput.Columns) { if(dtOutput.Columns[dc.ColumnName] == null) { dtOutput.Columns.Add(dc.ColumnName, dc.DataType); } } } catch { string strTijdelijk; strTijdelijk = "dummy"; } //kopieer de data foreach(DataRow drInput in dtInput.Rows) { DataRow drOutput; if(dtOutput.Rows.Count == 0 || addNewRowsToMerged) { drOutput = dtOutput.NewRow(); // kopieer een rij uit de datatable. } else { drOutput = dtOutput.Rows[0]; } drOutput.BeginEdit(); foreach(DataColumn dcInput in dtInput.Columns) { try // kopieer de kolom, als die in de mergetable is, anders gewoon doorgaan. { drOutput[dcInput.ColumnName] = drInput[dcInput.ColumnName]; // kopieer per kolom } catch { string strTijdelijk; strTijdelijk = "dummy"; } } drOutput.EndEdit(); if(dtOutput.Rows.Count == 0 || addNewRowsToMerged) { dtOutput.Rows.Add(drOutput); } dtOutput.AcceptChanges(); } dtOutput.AcceptChanges(); } catch(Exception ex) { throw new Exception(ex.Message + "; Stacktrace=" + ex.StackTrace,
Ziet er op zich wel OK uit, maar denk dat het niet een oplossing was geweest voor mijn probleem. Ik heb een selectie van data die ik uit de database trek, op een laptop zet en zonder database connectie wijzig. Daana wil ik een sync doen van de data terug naar de db. Ik heb dan twee identieke datasets (qua structuur dan) alleen is de 'sql' dataset gevuld met oude data, en de 'nieuwe' dataset gevuld met de up-to-date data. Ik moet in de 'sql' dataset dan wel de gewijzigde rijden bijhouden (nieuwe, gewijzigde en verwijderde) om aan een adapter door te geven wat hij in mijn db moet wijzigen... moeilijk verhaal allemaal (waarschijnlijk omdat ik het onhandig uitleg) maar vooral door de AcceptChanges kan ik de wijzigingen niet meer terugvinden en ben ik dus alsnog de row states kwijt.. echter, de oplossing was al gevonden middels een dubbele merge..