Esempio n. 1
0
        public static string GetUpdateStringFor(IColumnMapper columnMapper, string tableName, object val)
        {
            StringBuilder builder = new StringBuilder("UPDATE " + tableName + " SET ");

            Dictionary<string, object> values = columnMapper.MapObjectValues(val);
            KeyValuePair<string, object> primaryKey = columnMapper.MapObjectPrimaryKey(val);

            foreach (string key in values.Keys.Where(k => k != primaryKey.Key))
            {
                if (AbstractColumnMapper.TypeIsEDClass(values[key].GetType()))
                {
                    KeyValuePair<string, object> foreignKeyPair = columnMapper.MapObjectPrimaryKey(values[key]);
                    builder.AppendFormat("{0} = '{1}', ", foreignKeyPair.Key, foreignKeyPair.Value);
                }
                else {
                    builder.AppendFormat("{0} = '{1}', ", key, values[key]);
                }
            }
            builder.Remove(builder.Length - 2, 2);

            builder.Append(" WHERE ");
            KeyValuePair<string, object> pair = columnMapper.MapObjectPrimaryKey(val);
            builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value));
            return builder.ToString();
        }
Esempio n. 2
0
        public CompareResult Compare(DataTable left, DataTable right)
        {
            if (left == null)
            {
                throw new ArgumentNullException(nameof(left));
            }
            if (right == null)
            {
                throw new ArgumentNullException(nameof(right));
            }

            _keyMapper   = _keyMapperFactory.Create(Config, left, right);
            _valueMapper = _valueMapperFactory.Create(Config, _keyMapper, left, right);

            _stopwatch.Restart();

            var sorted = Config.IsSorted;

            var leftSorted = sorted != DataSource.Left && sorted != DataSource.Both
                ? _sorter.Sort(_keyMapper, left, DataSource.Left)
                : left;

            var rightSorted = sorted != DataSource.Right && sorted != DataSource.Both
                ? _sorter.Sort(_keyMapper, right, DataSource.Right)
                : right;

            _stopwatch.Stop();

            TimeTakenForSorting = _stopwatch.Elapsed;


            return(CompareSorted(leftSorted, rightSorted));
        }
Esempio n. 3
0
        public static string GetUpdateStringFor(IColumnMapper columnMapper, string tableName, object val)
        {
            StringBuilder builder = new StringBuilder("UPDATE " + tableName + " SET ");

            Dictionary <string, object>   values     = columnMapper.MapObjectValues(val);
            KeyValuePair <string, object> primaryKey = columnMapper.MapObjectPrimaryKey(val);

            foreach (string key in values.Keys.Where(k => k != primaryKey.Key))
            {
                if (AbstractColumnMapper.TypeIsEDClass(values[key].GetType()))
                {
                    KeyValuePair <string, object> foreignKeyPair = columnMapper.MapObjectPrimaryKey(values[key]);
                    builder.AppendFormat("{0} = '{1}', ", foreignKeyPair.Key, foreignKeyPair.Value);
                }
                else
                {
                    builder.AppendFormat("{0} = '{1}', ", key, values[key]);
                }
            }
            builder.Remove(builder.Length - 2, 2);

            builder.Append(" WHERE ");
            KeyValuePair <string, object> pair = columnMapper.MapObjectPrimaryKey(val);

            builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value));
            return(builder.ToString());
        }
Esempio n. 4
0
 public SqlEnumerable(IConnectionPolicy connectionPolicy, IColumnMapper columnMapper, string tableName, string whereClause = "")
 {
     this.connectionPolicy = connectionPolicy;
     this.columnMapper     = columnMapper;
     this.tableName        = tableName;
     this.whereClause      = whereClause;
     results = null;
 }
Esempio n. 5
0
 public static string GetDeleteStringFor(IColumnMapper columnMapper, string tableName, object val)
 {
     StringBuilder builder = new StringBuilder("DELETE FROM " + tableName);
     builder.Append(" WHERE ");
     KeyValuePair<string, object> pair = columnMapper.MapObjectPrimaryKey(val);
     builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value));
     return builder.ToString();
 }
Esempio n. 6
0
        public static string GetDeleteStringFor(IColumnMapper columnMapper, string tableName, object val)
        {
            StringBuilder builder = new StringBuilder("DELETE FROM " + tableName);

            builder.Append(" WHERE ");
            KeyValuePair <string, object> pair = columnMapper.MapObjectPrimaryKey(val);

            builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value));
            return(builder.ToString());
        }
Esempio n. 7
0
 public SqlEnumerable(IConnectionPolicy connectionPolicy, IColumnMapper columnMapper,
                      Dictionary <Type, IDataMapper> foreignMappers, string tableName, string whereClause = "")
 {
     this.connectionPolicy = connectionPolicy;
     this.columnMapper     = columnMapper;
     this.tableName        = tableName;
     this.whereClause      = whereClause;
     results             = null;
     this.foreignMappers = foreignMappers;
 }
Esempio n. 8
0
        /// <summary>
        /// 获取根据ID查询单条记录命令生成树的子节点
        /// </summary>
        /// <returns>根据ID查询单条记录命令生成树的子节点</returns>
        private IEnumerable <INodeBuilder> GetQueryByIdChildBuilders()
        {
            //获取Select节点的子节点集合 和 From节点的子节点集合
            foreach (INodeBuilder nodeBuilder in this.NodeBuilders)
            {
                yield return(nodeBuilder);
            }
            //获取Where节点的子节点集合
            IColumnMapper keyColumnMapper = base.TableMapper.KeyMapper;

            yield return(base.CommandTreeFactory.GetEqualsBuilder(this.TableMapper.Header.TableAlias, keyColumnMapper.ColumnName, keyColumnMapper.Property.Name));
        }
Esempio n. 9
0
        public SqlDataMapper(Type objType, string connectionString, Type columnMapperType, Type connectionPolicyType)
        {
            this.objType          = objType;
            this.connectionString = connectionString;
            tableName             = objType.GetCustomAttributes(typeof(TableNameAttribute), false).FirstOrDefault().ToString();
            connectionPolicy      = (AbstractConnectionPolicy)connectionPolicyType.GetConstructor(new Type[] { typeof(String) })
                                    .Invoke(new Object[] { connectionString });

            columnMapper = (IColumnMapper)columnMapperType
                           .GetConstructor(new Type[] { typeof(Type), typeof(String), typeof(String) })
                           .Invoke(new Object[] { objType, connectionString, tableName });
            foreignMappers = BuildForeignKeyMappers();
        }
Esempio n. 10
0
        public SqlDataMapper(Type objType, string connectionString, Type columnMapperType, Type connectionPolicyType)
        {
            this.objType = objType;
            this.connectionString = connectionString;
            tableName = objType.GetCustomAttributes(typeof(TableNameAttribute), false).FirstOrDefault().ToString();
            connectionPolicy = (AbstractConnectionPolicy)connectionPolicyType.GetConstructor(new Type[] { typeof(String) })
                .Invoke(new Object[] { connectionString });

            columnMapper = (IColumnMapper)columnMapperType
                .GetConstructor(new Type[] { typeof(Type), typeof(String), typeof(String) })
                .Invoke(new Object[] { objType, connectionString, tableName });
            foreignMappers = BuildForeignKeyMappers();
        }
Esempio n. 11
0
 /// <summary>
 /// 转换获取Column节点
 /// </summary>
 /// <param name="columnMapper">Column元数据解析器</param>
 /// <returns>Column节点</returns>
 internal static IColumnNode ToColumnNode(this IColumnMapper columnMapper)
 {
     return(new ColumnNode()
     {
         ColumnName = columnMapper.ColumnName,
         DataType = columnMapper.DataType,
         Length = columnMapper.Length,
         Decimals = columnMapper.Decimals,
         IsDefault = columnMapper.ColumnAction.ToString().Contains("Default"),
         IsNull = columnMapper.AllowNull,
         IsPrimary = columnMapper.ColumnAction.ToString().StartsWith("Primary"),
         IsIdentity = columnMapper.ColumnAction == ColumnAction.PrimaryAndIdentity
     });
 }
Esempio n. 12
0
        /// <summary>
        /// 获取根据ID统计单条记录是否存在命令生成树的子节点
        /// </summary>
        /// <returns>根据ID统计单条记录是否存在命令生成树的子节点</returns>
        private IEnumerable <INodeBuilder> GetQueryCountByIdChildBuilders()
        {
            //获取Select节点的子节点集合
            yield return(new NodeBuilder(SqlType.Select, "COUNT(*)"));

            //获取From节点的子Table表达式节点
            ITableHeader tableHeader = base.TableMapper.Header;

            yield return(base.CommandTreeFactory.GetTableBuilder(tableHeader.TableName, tableHeader.TableAlias, tableHeader.SchemaName));

            //获取Where节点的子节点集合
            IColumnMapper keyColumnMapper = base.TableMapper.KeyMapper;

            yield return(base.CommandTreeFactory.GetEqualsBuilder(this.TableMapper.Header.TableAlias, keyColumnMapper.ColumnName, keyColumnMapper.Property.Name));
        }
Esempio n. 13
0
        public static string GetInsertStringFor(IColumnMapper columnMapper, string tableName, object val)
        {
            StringBuilder names  = new StringBuilder();
            StringBuilder values = new StringBuilder();

            Dictionary <string, object> objectValues = columnMapper.MapObjectValues(val);

            foreach (string key in objectValues.Keys)
            {
                names.Append(key + ", ");
                values.Append("'" + objectValues[key]);
            }
            names.Remove(names.Length - 2, 2);
            values.Remove(values.Length - 2, 2);

            return(String.Format("INSERT INTO {0}({1}) VALUES({2})", tableName, names, values));
        }
Esempio n. 14
0
        /// <summary>
        /// 获取Where节点的子sql表达式节点
        /// </summary>
        /// <param name="memberExpression">成员表达式</param>
        /// <param name="rightSqlExpression">右边的sql条件表达式</param>
        /// <returns>Where节点的子sql表达式节点</returns>
        protected INodeBuilder GetWhereChildBuilder(MemberExpression memberExpression, string rightSqlExpression)
        {
            //若Mapper容器为空
            if (_mapperContainer == null)
            {
                //则直接获取针对 WITH AS 临时表的sql表达式
                return(new NodeBuilder(SqlType.Where, "t.{0} {1}", memberExpression.Member.Name, rightSqlExpression));
            }
            //若不为空,则获取针对实体类对应的表的sql表达式
            // 获取当前实体类型的Table元数据解析器
            ITableMapper tableMapper = _mapperContainer.GetTableMapper(memberExpression.Expression.Type);
            // 获取columnMapper
            IColumnMapper columnMapper = tableMapper.GetColumnMapper(memberExpression.Member.Name);

            // 获取Where节点的子sql表达式节点
            return(_commandTreeFactory.GetWhereChildBuilder(tableMapper.Header.TableAlias, columnMapper.ColumnName, rightSqlExpression));
        }
Esempio n. 15
0
        /// <summary>
        /// 获取基本类型的sql表达式节点
        /// </summary>
        /// <param name="memberExpression">成员表达式</param>
        /// <returns>基本类型的sql表达式节点</returns>
        protected ISqlBuilder GetColumnBuilder(MemberExpression memberExpression)
        {
            //若Mapper容器为空
            if (_mapperContainer == null)
            {
                //则直接获取针对 WITH AS 临时表的sql表达式
                return(new SqlBuilder("t.{0}", memberExpression.Member.Name));
            }
            //若不为空,则获取针对表的sql表达式
            // 获取当前实体类型的Table元数据解析器
            ITableMapper tableMapper = _mapperContainer.GetTableMapper(memberExpression.Expression.Type);
            // 获取columnMapper
            IColumnMapper columnMapper = tableMapper.GetColumnMapper(memberExpression.Member.Name);

            // 获取sql列节点生成器
            return(_commandTreeFactory.GetColumnBuilder(tableMapper.Header.TableAlias, columnMapper.ColumnName));
        }
Esempio n. 16
0
        public static string GetInsertStringFor(IColumnMapper columnMapper, string tableName, object val)
        {
            StringBuilder names = new StringBuilder();
            StringBuilder values = new StringBuilder();

            Dictionary<string, object> objectValues = columnMapper.MapObjectValues(val);

            foreach (string key in objectValues.Keys)
            {
                names.Append(key + ", ");
                values.Append("'" + objectValues[key]);
            }
            names.Remove(names.Length - 2, 2);
            values.Remove(values.Length - 2, 2);

            return String.Format("INSERT INTO {0}({1}) VALUES({2})", tableName, names, values);
        }
Esempio n. 17
0
        /// <summary>
        /// 加载Update命令生成树的Set节点子节点及其附属的sql参数
        /// </summary>
        /// <param name="setParameters">属性名及属性值字典</param>
        /// <param name="nodeBuilders">Update命令生成树的Set节点子节点集合</param>
        /// <param name="sqlParameters">附属的sql参数集合</param>
        private void LoadUpdateChildNodesAndParameters(IDictionary <string, object> setParameters, List <INodeBuilder> nodeBuilders, List <IDbDataParameter> sqlParameters)
        {
            //获取table别名
            string tableAlias = this.TableMapper.Header.TableAlias;

            //遍历setParameters
            foreach (KeyValuePair <string, object> setPair in setParameters)
            {
                //获取columnMapper
                IColumnMapper columnMapper = this.TableMapper.GetColumnMapper(setPair.Key);
                //获取参数名
                string parameterName = string.Concat("New", columnMapper.Property.Name);
                //获取Update Set的子sql表达式节点
                INodeBuilder setBuilder = this.CommandTreeFactory.GetUpdateSetChildBuilder(tableAlias, columnMapper.ColumnName, parameterName);
                //添加sql表达式节点
                nodeBuilders.Add(setBuilder);
                //添加sql参数
                sqlParameters.Add(this.DbHelper.Parameter(parameterName, setPair.Value));
            }
        }
		/// <summary>
		/// Maps the columns of a reader to a type.
		/// </summary>
		/// <param name="type">The type being bound.</param>
		/// <param name="reader">The reader being bound.</param>
		/// <param name="startColumn">The index of the first column to bind.</param>
		/// <param name="columnCount">The number of columns to bind.</param>
		/// <param name="overrideMapping">An optional column mapper to override the operation</param>
		/// <returns>The mappings for the columns</returns>
		internal static List<FieldMapping> MapColumns(Type type, IDataReader reader, int startColumn = 0, int? columnCount = null, IColumnMapper overrideMapping = null)
		{
			var array = Enumerable.Range(startColumn, columnCount ?? reader.FieldCount)
				.Select(i => MapColumn(type, reader, i, overrideMapping))
				.ToArray();

			// remove duplicates from the list
			var usedFields = new HashSet<ClassPropInfo>();
			for (int i = 0; i < array.Length; i++)
			{
				if (array[i] == null)
					continue;

				if (usedFields.Contains(array[i].Member))
					array[i] = null;
				else
					usedFields.Add(array[i].Member);
			}

			return array.ToList();
		}
Esempio n. 19
0
 public SchemaReader(IForeignKeyMapper foreignKeyMapper, IColumnMapper columnMapper, IIndexMapper indexMapper)
 {
     _foreignKeyMapper = foreignKeyMapper;
     _columnMapper = columnMapper;
     _indexMapper = indexMapper;
 }
        public SqlServerReadOnlyDictionary(IDbConnection connection, string table, string schema = null, IColumnMapper columnMapper = null)
        {
            if (columnMapper == null)
            {
                columnMapper = new DefaultColumnMapper(connection, table, schema);
            }

            string keyColumn   = columnMapper.GetKeyColumnName();
            string valueColumn = columnMapper.GetValueColumnName();

            Adapter    = new SqlServerAdapter(connection, keyColumn, valueColumn, table, schema);
            IsModified = true;
            Read();
        }
 public SqlServerReadOnlyDictionary(string connectionString, string table, string schema = null, IColumnMapper columnMapper = null)
     : this(new SqlConnection(connectionString), table, schema, columnMapper)
 {
 }
 public void Init()
 {
     _mapper = new ColumnMapper();
 }
 public void Init()
 {
     _mapper = new ColumnMapper();
 }
 public ColumnDal(IColumnMapper columnMapper, IDalHelper dalHelper)
 {
     _columnMapper = columnMapper;
     _dalHelper = dalHelper;
 }
 public SqlServerDictionary(IDbConnection connection, string table, string schema = null, IColumnMapper columnMapper = null)
     : base(connection, table, schema, columnMapper)
 {
 }
		/// <summary>
		/// Maps a column of a reader to a type.
		/// </summary>
		/// <param name="type">The type being bound.</param>
		/// <param name="reader">The reader being bound.</param>
		/// <param name="column">The column to bind.</param>
		/// <param name="overrideMapping">An optional column mapper to override the operation</param>
		/// <returns>The mapping for the column</returns>
		private static FieldMapping MapColumn(Type type, IDataReader reader, int column, IColumnMapper overrideMapping)
		{
			string fieldName = null;

			// if an override mapping was used, then allow it the first go at the mapping
			if (overrideMapping != null)
				fieldName = overrideMapping.MapColumn(type, reader, column);

			// allow for custom mappings
			if (fieldName == null)
				fieldName = Tables.Mappers.Select(m => m.MapColumn(type, reader, column)).FirstOrDefault();

			// allow the first column to match the * wildcard on Guardian records
			if (fieldName == null)
			{
				var wildcards = ClassPropInfo.GetMembersForType(type).Where(m => m.ColumnName.StartsWith("*", StringComparison.OrdinalIgnoreCase)).OrderBy(m => m.ColumnName).ToList();
				if (column < wildcards.Count)
					fieldName = wildcards[column].Name;
			}

			// by default, let all of the transforms transform the name, then search for it
			if (fieldName == null)
			{
				var columnName = Tables.Transform(type, reader.GetName(column));
				fieldName = ClassPropInfo.SearchForMatchingField(type, columnName, Tables);
			}

			if (fieldName == null)
				return null;

			var member = ClassPropInfo.FindMember(type, fieldName);
			return new FieldMapping(fieldName, member, DbSerializationRule.GetSerializer(reader, column, member));
		}
Esempio n. 27
0
 public IRowComparer CreateValueComparer(IColumnMapper colMap, DataTable left, DataTable right)
 {
     return(new RowComparer(colMap.LeftColumns, colMap.RightColumns));
 }
Esempio n. 28
0
 public ColumnDal(IColumnMapper columnMapper, IDalHelper dalHelper)
 {
     _columnMapper = columnMapper;
     _dalHelper    = dalHelper;
 }
Esempio n. 29
0
        /// <summary>
        /// Maps the columns of a reader to a type.
        /// </summary>
        /// <param name="type">The type being bound.</param>
        /// <param name="reader">The reader being bound.</param>
        /// <param name="startColumn">The index of the first column to bind.</param>
        /// <param name="columnCount">The number of columns to bind.</param>
        /// <param name="overrideMapping">An optional column mapper to override the operation</param>
        /// <returns>The mappings for the columns</returns>
        internal static List <FieldMapping> MapColumns(Type type, IDataReader reader, int startColumn = 0, int?columnCount = null, IColumnMapper overrideMapping = null)
        {
            var array = Enumerable.Range(startColumn, columnCount ?? reader.FieldCount)
                        .Select(i => MapColumn(type, reader, i, overrideMapping))
                        .ToArray();

            // remove duplicates from the list
            var usedFields = new HashSet <ClassPropInfo>();

            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] == null)
                {
                    continue;
                }

                if (usedFields.Contains(array[i].Member))
                {
                    array[i] = null;
                }
                else
                {
                    usedFields.Add(array[i].Member);
                }
            }

            return(array.ToList());
        }
Esempio n. 30
0
        /// <summary>
        /// Maps a column of a reader to a type.
        /// </summary>
        /// <param name="type">The type being bound.</param>
        /// <param name="reader">The reader being bound.</param>
        /// <param name="column">The column to bind.</param>
        /// <param name="overrideMapping">An optional column mapper to override the operation</param>
        /// <returns>The mapping for the column</returns>
        private static FieldMapping MapColumn(Type type, IDataReader reader, int column, IColumnMapper overrideMapping)
        {
            string fieldName = null;

            // if an override mapping was used, then allow it the first go at the mapping
            if (overrideMapping != null)
            {
                fieldName = overrideMapping.MapColumn(type, reader, column);
            }

            // allow for custom mappings
            if (fieldName == null)
            {
                fieldName = Tables.Mappers.Select(m => m.MapColumn(type, reader, column)).FirstOrDefault();
            }

            // allow the first column to match the * wildcard on Guardian records
            if (fieldName == null)
            {
                var wildcards = ClassPropInfo.GetMembersForType(type).Where(m => m.ColumnName.StartsWith("*", StringComparison.OrdinalIgnoreCase)).OrderBy(m => m.ColumnName).ToList();
                if (column < wildcards.Count)
                {
                    fieldName = wildcards[column].Name;
                }
            }

            // by default, let all of the transforms transform the name, then search for it
            if (fieldName == null)
            {
                var columnName = reader.GetName(column);
                if (columnName != null)
                {
                    columnName = Tables.Transform(type, columnName);
                }
                fieldName = ClassPropInfo.SearchForMatchingField(type, columnName, Tables);
            }

            if (fieldName == null)
            {
                return(null);
            }

            var member = ClassPropInfo.FindMember(type, fieldName);

            if (member == null)
            {
                return(null);
            }

            return(new FieldMapping(fieldName, member, DbSerializationRule.GetSerializer(reader, column, member)));
        }
Esempio n. 31
0
        private CompareResult CompareSorted(DataTable left, DataTable right)
        {
            _stopwatch.Restart();

            var result = new CompareResult();

            _keyMapper   = _keyMapperFactory.Create(Config, left, right);
            _valueMapper = _valueMapperFactory.Create(Config, _keyMapper, left, right);

            _valueComparer = _rowComparerFactory.CreateValueComparer(_valueMapper, left, right);
            _keyComparer   = _rowComparerFactory.CreateKeyComparer(_keyMapper, left, right);

            var leftIx  = 0;
            var rightIx = 0;

            // Go Through All Left Comparing to Right
            while (leftIx < left.Rows.Count && rightIx < right.Rows.Count)
            {
                var leftRow  = left.Rows[leftIx];
                var rightRow = right.Rows[rightIx];

                var keyResult = _keyComparer.Compare(leftRow, rightRow);

                if (keyResult == 0)
                {
                    var valueResult = _valueComparer.Compare(leftRow, rightRow);

                    if (valueResult == 0)
                    {
                        result.Same.Add(new CompareResult.Entry(leftRow, rightRow));
                    }
                    else
                    {
                        result.Different.Add(new CompareResult.Entry(leftRow, rightRow));
                    }

                    leftIx++;
                    rightIx++;
                }
                else if (keyResult < 0)
                {
                    result.LeftOnly.Add(leftRow);

                    leftIx++;
                }
                else
                {
                    result.RightOnly.Add(rightRow);

                    rightIx++;
                }
            }

            while (leftIx < left.Rows.Count)
            {
                var leftRow = left.Rows[leftIx];

                result.LeftOnly.Add(leftRow);

                leftIx++;
            }

            while (rightIx < right.Rows.Count)
            {
                var rightRow = right.Rows[rightIx];

                result.RightOnly.Add(rightRow);

                rightIx++;
            }

            _stopwatch.Stop();
            TimeTakenForComparing = _stopwatch.Elapsed;

            return(result);
        }