}
if (HasVersion(DataRowVersion.Current)) {
- if (row.Current < 0) {
- row.Current = row.Table.RecordCache.NewRecord();
+ if (Current == Original) {
+ row.Current = row.Original;
+ }else {
+ if (row.Current < 0)
+ row.Current = row.Table.RecordCache.NewRecord();
+ object val = column[Current];
+ row.CheckValue(val, targetColumn);
+ targetColumn[row.Current] = val;
}
- object val = column[Current];
- row.CheckValue(val, targetColumn);
- targetColumn[row.Current] = val;
}
else {
if (row.Current > 0) {
return null;\r
\r
DataSet copySet = Clone ();\r
+ bool prev = copySet.EnforceConstraints;\r
+ copySet.EnforceConstraints = false;\r
+\r
Hashtable addedRows = new Hashtable ();\r
\r
- IEnumerator tableEnumerator = Tables.GetEnumerator ();\r
- DataTable origTable;\r
- DataTable copyTable;\r
- while (tableEnumerator.MoveNext ()) {\r
- origTable = (DataTable)tableEnumerator.Current;\r
- copyTable = copySet.Tables[origTable.TableName];\r
- \r
- // Look for relations that have this table as child\r
- IEnumerator relations = origTable.ParentRelations.GetEnumerator ();\r
-\r
- IEnumerator rowEnumerator = origTable.Rows.GetEnumerator ();\r
- while (rowEnumerator.MoveNext ()) {\r
- DataRow row = (DataRow)rowEnumerator.Current;\r
- \r
- if (row.IsRowChanged (rowStates))\r
- AddChangedRow (addedRows, copySet, copyTable, relations, row);\r
+ for (int i = 0; i < Tables.Count; i++) {\r
+ DataTable origTable = Tables [i];\r
+ DataTable copyTable = copySet.Tables[origTable.TableName];\r
+ for (int j = 0; j < origTable.Rows.Count; j++) {\r
+ DataRow row = origTable.Rows [j];\r
+ if (!row.IsRowChanged (rowStates)\r
+ || addedRows.Contains (row))\r
+ continue;\r
+ AddChangedRow (addedRows, copyTable, row);\r
}\r
}\r
+ copySet.EnforceConstraints = prev;\r
return copySet;\r
}\r
\r
- void AddChangedRow (Hashtable addedRows, DataSet copySet, DataTable copyTable, IEnumerator relations, DataRow row)\r
+ private void AddChangedRow (Hashtable addedRows, DataTable copyTable, DataRow row)\r
{\r
if (addedRows.ContainsKey (row)) return;\r
- \r
- relations.Reset ();\r
- while (relations.MoveNext ()) {\r
- DataRow parentRow = row.GetParentRow ((DataRelation) relations.Current);\r
- if (parentRow == null || addedRows.ContainsKey (parentRow)) continue;\r
- DataTable parentCopyTable = copySet.Tables [parentRow.Table.TableName];\r
- AddChangedRow (addedRows, copySet, parentCopyTable, parentRow.Table.ParentRelations.GetEnumerator (), parentRow);\r
+\r
+ foreach (DataRelation relation in row.Table.ParentRelations) {\r
+ DataRow parent = row.GetParentRow (relation);\r
+ if (parent == null)\r
+ continue;\r
+ // add the parent row\r
+ DataTable parentCopyTable = copyTable.DataSet.Tables [parent.Table.TableName];\r
+ AddChangedRow (addedRows, parentCopyTable, parent);\r
}\r
- \r
- DataRow newRow = copyTable.NewRow ();\r
- copyTable.Rows.Add (newRow);\r
- row.CopyValuesToRow (newRow); \r
+\r
+ // add the current row\r
+ DataRow newRow = copyTable.NewNotInitializedRow();\r
+ copyTable.Rows.AddInternal(newRow);\r
+ row.CopyValuesToRow (newRow);\r
newRow.XmlRowID = row.XmlRowID;\r
- addedRows.Add (row,row);\r
+ addedRows.Add (row, row);\r
}\r
\r
#if NET_2_0\r