diff Source/Mapping/DataRowMapper.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DataRowMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,188 @@
+using System;
+using System.Data;
+using System.Collections;
+
+namespace BLToolkit.Mapping
+{
+	public class DataRowMapper : MapDataSourceDestinationBase
+	{
+		bool                    _createColumns;
+		readonly DataRowVersion _version;
+
+		public DataRowMapper(DataRow dataRow)
+			: this(dataRow, DataRowVersion.Default)
+		{
+		}
+
+		public DataRowMapper(DataRowView view)
+			: this(view.Row, view.RowVersion)
+		{
+		}
+
+		public DataRowMapper(DataRow dataRow, DataRowVersion version)
+		{
+			_version = version;
+
+			Init(dataRow);
+		}
+
+		private void Init(DataRow dataRow)
+		{
+			if (_dataRow == null && dataRow != null)
+				_createColumns = dataRow.Table.Columns.Count == 0;
+
+			_dataRow = dataRow;
+		}
+
+		private DataRow _dataRow;
+		public  DataRow  DataRow
+		{
+			get { return _dataRow; }
+			set { Init(value);     }
+		}
+
+		#region IMapDataSource Members
+
+		public override int Count
+		{
+			get { return _dataRow.Table.Columns.Count; }
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			return index < _dataRow.Table.Columns.Count?
+				_dataRow.Table.Columns[index].DataType: null;
+		}
+
+		public override string GetName(int index)
+		{
+			return _dataRow.Table.Columns[index].ColumnName;
+		}
+
+		public override object GetValue(object o, int index)
+		{
+			object value = _version == DataRowVersion.Default ? _dataRow[index] : _dataRow[index, _version];
+			return value is DBNull? null: value;
+		}
+
+		public override object GetValue(object o, string name)
+		{
+			object value = _version == DataRowVersion.Default ? _dataRow[name] : _dataRow[name, _version];
+			return value is DBNull? null: value;
+		}
+
+		public override bool IsNull(object o, int index)
+		{
+			if (_version == DataRowVersion.Default)
+				return _dataRow.IsNull(index);
+
+			DataColumn col = _dataRow.Table.Columns[index];
+
+			return _dataRow.IsNull(col, _version);
+		}
+
+		#endregion
+
+		#region IMapDataDestination Members
+
+		private ArrayList _nameList;
+
+		public override int GetOrdinal(string name)
+		{
+			if (_createColumns)
+			{
+				if (_nameList == null)
+					_nameList = new ArrayList();
+
+				for (int i = 0; i < _nameList.Count; i++)
+					if (name == _nameList[i].ToString())
+						return i;
+
+				return _nameList.Add(name);
+			}
+
+			return _dataRow.Table.Columns.IndexOf(name);
+		}
+
+		private void CreateColumn(int index, object value)
+		{
+			if (_dataRow.Table.Rows.Count > 1)
+			{
+				_createColumns = false;
+			}
+			else
+			{
+				DataColumnCollection cc   = _dataRow.Table.Columns;
+				string               name = _nameList[index].ToString();
+
+				DataColumn column = 
+					value == null || value is DBNull? cc.Add(name): cc.Add(name, value.GetType());
+
+				if (cc.IndexOf(column) != index)
+					throw new MappingException(string.Format("Cant create data column '{0}'.", name));
+			}
+		}
+
+		public override void SetValue(object o, int index, object value)
+		{
+			if (_createColumns)
+				CreateColumn(index, value);
+
+			if (value == null || value is DBNull)
+			{
+				_dataRow[index] = DBNull.Value;
+			}
+			else
+			{
+				DataColumn column = _dataRow.Table.Columns[index];
+
+				if (column.DataType != value.GetType())
+				{
+					if (column.DataType == typeof(Guid))
+					{
+						value = new Guid(value.ToString());
+					}
+					else
+					{
+						if (column.DataType != typeof(string))
+							value = Convert.ChangeType(value, column.DataType);
+					}
+				}
+
+				_dataRow[index] = value;
+			}
+		}
+
+		public override void SetValue(object o, string name, object value)
+		{
+			if (_createColumns)
+				CreateColumn(GetOrdinal(name), value);
+
+			if (value == null || value is DBNull)
+			{
+				_dataRow[name] = DBNull.Value;
+			}
+			else
+			{
+				DataColumn dc = _dataRow.Table.Columns[name];
+
+				if (dc.DataType != value.GetType())
+				{
+					if (dc.DataType == typeof(Guid))
+					{
+						value = new Guid(value.ToString());
+					}
+					else
+					{
+						if (dc.DataType != typeof(string))
+							value = Convert.ChangeType(value, dc.DataType);
+					}
+				}
+
+				_dataRow[name] = value;
+			}
+		}
+
+		#endregion
+	}
+}