コード例 #1
0
        static String UpdateSQL(IEntity entity, ref IDataParameter[] parameters)
        {
            /*
             * 实体更新原则:
             * 1,自增不参与
             * 2,没有脏数据不参与
             * 3,大字段参数化特殊处理
             * 4,累加字段特殊处理
             */

            var fact = EntityFactory.CreateOperate(entity.GetType());
            var db   = fact.Session.Dal.Db;

            var exp = DefaultCondition(entity);
            var ps  = !db.UseParameter ? null : new Dictionary <String, Object>();
            var def = exp?.GetString(ps);

            if (def.IsNullOrEmpty())
            {
                return(null);
            }

            // 处理累加字段
            var dfs = entity.Addition?.Get();

            var sb  = Pool.StringBuilder.Get();
            var dps = new List <IDataParameter>();

            // 只读列没有更新操作
            foreach (var fi in fact.Fields)
            {
                if (fi.IsIdentity)
                {
                    continue;
                }

                //脏数据判断
                if (!entity.IsDirty(fi.Name))
                {
                    continue;
                }

                var value = entity[fi.Name];

                sb.Separate(", "); // 加逗号

                var name = fact.FormatName(fi.ColumnName);
                sb.Append(name);
                sb.Append("=");

                // 检查累加
                var flag = TryCheckAdditionalValue(dfs, fi.Name, out var val, out var sign);

                if (db.UseParameter || UseParam(fi, value))
                {
                    var dp = CreateParameter(db, fi, flag ? val : value);
                    dps.Add(dp);

                    // 检查累加
                    if (flag)
                    {
                        if (sign)
                        {
                            sb.AppendFormat("{0}+{1}", name, dp.ParameterName);
                        }
                        else
                        {
                            sb.AppendFormat("{0}-{1}", name, dp.ParameterName);
                        }
                    }
                    else
                    {
                        sb.Append(dp.ParameterName);
                    }
                }
                else
                {
                    // 检查累加
                    if (flag)
                    {
                        if (sign)
                        {
                            sb.AppendFormat("{0}+{1}", name, val);
                        }
                        else
                        {
                            sb.AppendFormat("{0}-{1}", name, val);
                        }
                    }
                    else
                    {
                        sb.Append(fact.FormatValue(fi, value));
                    }
                }
            }

            // 重置累加数据
            if (dfs != null && dfs.Count > 0)
            {
                entity.Addition.Reset(dfs);
            }

            var str = sb.Put(true);

            if (str.IsNullOrEmpty())
            {
                return(null);
            }

            // Where条件里面的参数化
            if (ps != null)
            {
                foreach (var item in ps)
                {
                    var dp = db.CreateParameter(item.Key, item.Value, fact.Table.FindByName(item.Key)?.Field);

                    dps.Add(dp);
                }
            }

            if (dps.Count > 0)
            {
                parameters = dps.ToArray();
            }
            return("Update {0} Set {1} Where {2}".F(fact.FormatedTableName, str, def));
        }
コード例 #2
0
ファイル: IEntityPersistence.cs プロジェクト: kylerlmy/X
        static String UpdateSQL(IEntity entity, ref IDataParameter[] parameters)
        {
            /*
             * 实体更新原则:
             * 1,自增不参与
             * 2,没有脏数据不参与
             * 3,大字段参数化特殊处理
             * 4,累加字段特殊处理
             */

            var def = DefaultCondition(entity);

            //if (String.IsNullOrEmpty(def)) return null;
            if (def.Empty)
            {
                return(null);
            }

            // 处理累加字段
            var dfs = (entity as EntityBase).GetAddition();

            var op = EntityFactory.CreateOperate(entity.GetType());
            var up = op.Session.Dal.Db.UseParameter;

            var sb  = Pool.StringBuilder.Get();
            var dps = new List <IDataParameter>();

            // 只读列没有更新操作
            foreach (var fi in op.Fields)
            {
                if (fi.IsIdentity)
                {
                    continue;
                }

                //脏数据判断
                if (!entity.IsDirty(fi.Name))
                {
                    continue;
                }

                var value = entity[fi.Name];

                sb.Separate(", "); // 加逗号

                var name = op.FormatName(fi.ColumnName);
                sb.Append(name);
                sb.Append("=");

                if (up || UseParam(fi, value))
                {
                    dps.Add(CreateParameter(sb, op, fi, value));
                }
                else
                {
                    // 检查累加
                    if (!CheckAdditionalValue(sb, dfs, fi.Name, name))
                    {
                        sb.Append(op.FormatValue(fi, value)); // 数据
                    }
                }
            }

            // 重置累加数据
            if (dfs != null && dfs.Count > 0)
            {
                (entity as EntityBase).Addition.Reset(dfs);
            }

            var str = sb.Put(true);

            if (str.IsNullOrEmpty())
            {
                return(null);
            }

            if (dps.Count > 0)
            {
                parameters = dps.ToArray();
            }
            return(String.Format("Update {0} Set {1} Where {2}", op.FormatedTableName, str, def));
        }
コード例 #3
0
        static String InsertSQL(IEntity entity, ref IDataParameter[] parameters)
        {
            var fact = EntityFactory.CreateOperate(entity.GetType());
            var db   = fact.Session.Dal.Db;

            /*
             * 插入数据原则:
             * 1,有脏数据的字段一定要参与
             * 2,没有脏数据,允许空的字段不参与
             * 3,没有脏数据,不允许空,有默认值的不参与
             * 4,没有脏数据,不允许空,没有默认值的参与,需要智能识别并添加相应字段的默认数据
             */

            var sbNames  = Pool.StringBuilder.Get();
            var sbValues = Pool.StringBuilder.Get();

            var dps = new List <IDataParameter>();

            // 只读列没有插入操作
            foreach (var fi in fact.Fields)
            {
                var value = entity[fi.Name];
                // 标识列不需要插入,别的类型都需要
                if (CheckIdentity(fi, value, fact, sbNames, sbValues))
                {
                    continue;
                }

                // 1,有脏数据的字段一定要参与
                if (!fact.FullInsert && !entity.IsDirty(fi.Name))
                {
                    continue;
                }

                sbNames.Separate(", ").Append(fact.FormatName(fi.ColumnName));
                sbValues.Separate(", ");

                if (db.UseParameter || UseParam(fi, value))
                {
                    var dp = CreateParameter(db, fi, value);
                    dps.Add(dp);

                    sbValues.Append(dp.ParameterName);
                }
                else
                {
                    sbValues.Append(fact.FormatValue(fi, value));
                }
            }

            var ns = sbNames.Put(true);
            var vs = sbValues.Put(true);

            if (ns.IsNullOrEmpty())
            {
                return(null);
            }

            if (dps.Count > 0)
            {
                parameters = dps.ToArray();
            }

            return("Insert Into {0}({1}) Values({2})".F(fact.FormatedTableName, ns, vs));
        }
コード例 #4
0
ファイル: IEntityPersistence.cs プロジェクト: kylerlmy/X
        static String InsertSQL(IEntity entity, ref IDataParameter[] parameters)
        {
            var op = EntityFactory.CreateOperate(entity.GetType());
            var up = op.Session.Dal.Db.UseParameter;

            /*
             * 插入数据原则:
             * 1,有脏数据的字段一定要参与
             * 2,没有脏数据,允许空的字段不参与
             * 3,没有脏数据,不允许空,有默认值的不参与
             * 4,没有脏数据,不允许空,没有默认值的参与,需要智能识别并添加相应字段的默认数据
             */

            // 缓存参数化时的SQL语句
            var key = "{0}_Insert".F(entity.GetType().FullName);
            var sql = "";

            StringBuilder sbNames  = null;
            StringBuilder sbValues = null;

            if (!up || !op.Session.Items.TryGetValue(key, out var oql))
            {
                sbNames  = Pool.StringBuilder.Get();
                sbValues = Pool.StringBuilder.Get();
            }
            else
            {
                sql = oql + "";
            }

            var dps = new List <IDataParameter>();

            // 只读列没有插入操作
            foreach (var fi in op.Fields)
            {
                var value = entity[fi.Name];
                // 标识列不需要插入,别的类型都需要
                if (sbNames != null && CheckIdentity(fi, value, op, sbNames, sbValues))
                {
                    continue;
                }

                // 1,有脏数据的字段一定要参与同时对于实体有值的也应该参与(针对通过置空主键的方式另存)
                if (!up && value == null && !entity.IsDirty(fi.Name))
                {
                    // 2,没有脏数据,允许空的字段不参与
                    if (fi.IsNullable)
                    {
                        continue;
                    }
                    //// 3,没有脏数据,不允许空,有默认值的不参与
                    //if (fi.DefaultValue != null) continue;

                    // 4,没有脏数据,不允许空,没有默认值的参与,需要智能识别并添加相应字段的默认数据
                    value = FormatParamValue(fi, null, op);
                }

                if (sbNames != null)
                {
                    sbNames.Separate(", ").Append(op.FormatName(fi.ColumnName));
                }
                if (sbValues != null)
                {
                    sbValues.Separate(", ");
                }

                if (up || UseParam(fi, value))
                {
                    dps.Add(CreateParameter(sbValues, op, fi, value));
                }
                else
                {
                    sbValues.Append(op.FormatValue(fi, value));
                }
            }

            var ns = sbNames.Put(true);
            var vs = sbValues.Put(true);

            if (ns.IsNullOrEmpty() && sql.IsNullOrEmpty())
            {
                return(null);
            }

            if (dps.Count > 0)
            {
                parameters = dps.ToArray();
            }

            if (!ns.IsNullOrEmpty())
            {
                sql = String.Format("Insert Into {0}({1}) Values({2})", op.FormatedTableName, ns, vs);
                // 缓存参数化时的SQL语句
                if (up)
                {
                    op.Session.Items[key] = sql;
                }
            }

            return(sql);
        }