Example #1
0
		//Copy all values of this DataRow to the row parameter.
		internal void CopyValuesToRow(DataRow row)
		{
			if (row == null)
				throw new ArgumentNullException("row");
			if (row == this)
				throw new ArgumentException("'row' is the same as this object");

			// create target records if missing.
			if (HasVersion(DataRowVersion.Original)) {
				if (row.Original < 0)
					row.Original = row.Table.RecordCache.NewRecord();
				else if (row.Original == row.Current) {
					row.Original = row.Table.RecordCache.NewRecord();
					row.Table.RecordCache.CopyRecord (row.Table, row.Current, row.Original);
				}
			} else {
				if (row.Original > 0) {
					if (row.Original != row.Current)
						row.Table.RecordCache.DisposeRecord(row.Original);
					row.Original = -1;
				}
			}

			if (HasVersion(DataRowVersion.Current)) {
				if (Current == Original) {
					if (row.Current >= 0)
						row.Table.RecordCache.DisposeRecord(row.Current);
					row.Current = row.Original;
				}else {
					if (row.Current < 0)
						row.Current = row.Table.RecordCache.NewRecord();
				}
			} else {
				if (row.Current > 0) {
					row.Table.RecordCache.DisposeRecord(row.Current);
					row.Current = -1;
				}
			}

			if (HasVersion(DataRowVersion.Proposed)) {
				if (row.Proposed < 0)
					row.Proposed = row.Table.RecordCache.NewRecord();
			} else {
				if (row.Proposed > 0) {
					row.Table.RecordCache.DisposeRecord(row.Proposed);
					row.Proposed = -1;
				}
			}
			
			// copy source record values to target records
			foreach(DataColumn column in Table.Columns) {
				DataColumn targetColumn = row.Table.Columns[column.ColumnName];
				//if a column with the same name exists in both rows copy the values
				if(targetColumn != null) {
					if (HasVersion(DataRowVersion.Original)) {
						object val = column[Original];
						row.CheckValue(val, targetColumn);
						targetColumn[row.Original] = val;
					}

					if (HasVersion(DataRowVersion.Current)
					    && Current != Original) {
						object val = column[Current];
						row.CheckValue(val, targetColumn);
						targetColumn[row.Current] = val;
					}

					if (HasVersion(DataRowVersion.Proposed)) {
						object val = column[row.Proposed];
						row.CheckValue(val, targetColumn);
						targetColumn[row.Proposed] = val;
					}
				}
			}
			if (HasErrors) {
				CopyErrors(row);
			}
		}
Example #2
0
		//Merge all values of this DataRow to the row parameter according to merge rules.
		internal void MergeValuesToRow (DataRow row, bool preserveChanges)
		{
			if (row == null)
				throw new ArgumentNullException ("row");
			if (row == this)
				throw new ArgumentException ("'row' is the same as this object");

			// Original values are anyway copied
			if (HasVersion (DataRowVersion.Original)) {
				if (row.Original < 0)
					row.Original = row.Table.RecordCache.NewRecord ();
				else if (row.Original == row.Current && !(Original == Current && !preserveChanges)) {
					row.Original = row.Table.RecordCache.NewRecord ();
					row.Table.RecordCache.CopyRecord (row.Table, row.Current, row.Original);
				}
			} else {
				if (row.Original == row.Current) { // if target has same current, better create new original
					row.Original = row.Table.RecordCache.NewRecord ();
					row.Table.RecordCache.CopyRecord (row.Table, row.Current, row.Original);
				}
			}

			// if i have current, push all
			if (HasVersion (DataRowVersion.Current)) {
				if (! preserveChanges && row.Current < 0)
					row.Current = row.Table.RecordCache.NewRecord ();
			} else {
				if (row.Current > 0 && ! preserveChanges) {
					row.Table.RecordCache.DisposeRecord (row.Current);
					row.Current = -1;
				}
			}

			// copy source record values to target records
			foreach (DataColumn column in Table.Columns) {
				DataColumn targetColumn = row.Table.Columns[column.ColumnName];
				//if a column with the same name exists in both rows copy the values
				if (targetColumn != null) {
					if (HasVersion (DataRowVersion.Original)) {
						object val = column [Original];
						row.CheckValue (val, targetColumn);
						targetColumn [row.Original] = val;
					}

					if (HasVersion (DataRowVersion.Current) && !preserveChanges) {
						object val = column [Current];
						row.CheckValue (val, targetColumn);
						targetColumn [row.Current] = val;
					}
				}
			}

			if (HasErrors)
				CopyErrors(row);
		}