Exemplo n.º 1
0
        protected static string GetKeyName(UpdateConfig config, IDictionary <string, string> cols)
        {
            var key = config.Key;

            if (!string.IsNullOrEmpty(key))
            {
                return(key);
            }

            if (cols.ContainsKey(SqlKeyWorld.Id))
            {
                return(SqlKeyWorld.Id);
            }

            if (cols.ContainsKey(LowerId))
            {
                return(LowerId);
            }

            var keyColumn = TableColumnQueryHandler.QueryColumns(config).FirstOrDefault(c => c.IsKey);

            if (keyColumn != null)
            {
                return(keyColumn.ColName);
            }

            return(string.Empty);
        }
Exemplo n.º 2
0
        protected IDictionary <string, string> GetCols(UpdateConfig config)
        {
            IDictionary <string, string> cols = new Dictionary <string, string>();
            var fields = config.Fields;

            if (config.Fields == null)
            {
                fields = TableColumnQueryHandler.QueryColumns(config).Select(c => c.ColName).ToArray();
            }

            foreach (var field in fields)
            {
                if (field.IndexOf(SqlKeyWorld.Split) <= 0)
                {
                    cols.Add(field, field);
                    continue;
                }

                var fArray = field.Split(SqlKeyWorld.Split);
                cols.Add(fArray[0], fArray[1]);
            }

            return(cols);
        }
Exemplo n.º 3
0
        private object InsertOnOneTime(UpdateContext context, UpdateConfig config, IDictionary <string, string> cols, IEnumerable <object> datas, IValueSetter valueSetter)
        {
            StringBuilder sb          = new StringBuilder();
            var           columnInfos = TableColumnQueryHandler.QueryColumns(config).Where(c => cols.Keys.Contains(c.ColName) && DBHelper.SpecailColumn(c)).ToArray();

            sb.AppendLine($"insert into {config.Table} ({string.Join(SqlKeyWorld.Split1, cols.Keys)}) values ");
            var len  = datas.Count();
            var keys = valueSetter.GetFields(datas.First());

            for (var i = 0; i < len; i++)
            {
                var data = datas.ElementAt(i);
                context.ContentParams.ReplaceOrInsert(SqlKeyWorld.ComplexData, data);
                UpdateTrigger.TriggeDefaultValues(context, data, config, cols, valueSetter, keys);
                UpdateTrigger.TriggeValuesChecked(context, data, config, cols, ActionType.Insert, valueSetter, keys);

                sb.AppendLine(string.Intern("("));
                var colVals = cols.Select(c => DBHelper.BuildColVal(c, valueSetter, data, columnInfos));
                sb.Append(string.Join(SqlKeyWorld.Split1, colVals));
                sb.Append(string.Intern(")"));
                if (i != len - 1)
                {
                    sb.Append(SqlKeyWorld.Split1);
                }
            }

            config.Sql = sb.ToString();
            object result = SqlExcuter.ExcuteTrann(context);

            foreach (var data in datas)
            {
                ExcuteSubUpdate(context, config, data);
            }

            return(result);
        }
Exemplo n.º 4
0
        private object UpdateOnOneTime(UpdateContext context, UpdateConfig config, IDictionary <string, string> cols, IEnumerable <object> datas, IValueSetter valueSetter, string key)
        {
            var columnInfos = TableColumnQueryHandler.QueryColumns(config).Where(c => cols.Keys.Contains(c.ColName) && DBHelper.SpecailColumn(c)).ToArray();

            StringBuilder sb   = new StringBuilder();
            var           len  = datas.Count();
            var           keys = valueSetter.GetFields(datas.First());
            var           page = len / PerCount;

            if (page % PerCount != 0)
            {
                page++;
            }

            if (page == 0 && len > 0)
            {
                page = 1;
            }

            var cCount = cols.Count();

            for (var p = 0; p < page; p++)
            {
                var currentIndex         = p * PerCount;
                ICollection <object> ids = new List <object>();
                IDictionary <string, StringBuilder> dictSbs = new Dictionary <string, StringBuilder>();
                for (var i = currentIndex; i < currentIndex + PerCount; i++)
                {
                    if (i >= len)
                    {
                        break;
                    }

                    var data = datas.ElementAt(i);
                    context.ContentParams.ReplaceOrInsert(SqlKeyWorld.ComplexData, data);
                    UpdateTrigger.TriggeValuesChecked(context, data, config, cols, ActionType.Update, valueSetter, keys);
                    var id = valueSetter.GetValue(data, key);
                    ids.Add(id);

                    for (var c = 0; c < cCount; c++)
                    {
                        var col = cols.ElementAt(c);
                        if (col.Key.Equals(key, StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }

                        StringBuilder colSb;
                        if (!dictSbs.TryGetValue(col.Key, out colSb))
                        {
                            colSb = new StringBuilder();
                            dictSbs.Add(col.Key, colSb);
                        }

                        colSb.Append($" WHEN '{id}' THEN {DBHelper.BuildColVal(col, valueSetter, data, columnInfos)} ");
                    }
                }

                if (ids.Any() == false)
                {
                    break;
                }

                sb.AppendFormat(DBHelper.UpdateFormatter, config.Table);
                var index = 0;
                foreach (var colSb in dictSbs)
                {
                    sb.Append(string.Concat("`", colSb.Key, "` = CASE `", key, "` "));
                    sb.Append(colSb.Value.ToString());
                    sb.Append(End);
                    index++;

                    if (index < cCount)
                    {
                        sb.Append(SqlKeyWorld.Split3);
                    }
                }

                sb.Append($"{DBHelper.Where}{key} {SqlKeyWorld.In} ({string.Join(SqlKeyWorld.Split1, ids)});");
            }

            config.Sql = sb.ToString();
            object result = SqlExcuter.ExcuteTrann(context);

            foreach (var data in datas)
            {
                ExcuteSubUpdate(context, config, data);
            }

            return(result);
        }