Example #1
0
        /// <summary>
        /// 修改一个实例
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="entity">实体</param>
        /// <returns>影响行数</returns>
        public static int Update <T>(T entity)
        {
            var type       = typeof(T);
            var properties = type.GetProperties().Where(p => !GetAttributes(p).OfType <NonFieldAttribute>().Any());
            ParameterizedQueryBuilder parms  = new ParameterizedQueryBuilder();
            StringBuilder             strSql = new StringBuilder();

            strSql.Append("Update " + type.Name + " set ");
            string fields       = "";
            string primarykey   = "";
            string primaryvalue = "";
            int    loop         = 0;

            foreach (var p in properties)
            {
                var name = GetFieldname(p);
                if (name.IndexOf("OID") == -1)
                {
                    fields += name + "={" + loop + "},";
                    parms.AppendParameter(p.GetValue(entity, null));
                    loop++;
                }
                else
                {
                    primarykey   = name;
                    primaryvalue = p.GetValue(entity, null).ToString();
                }
            }
            strSql.Append(fields.Substring(0, fields.Length - 1) + " where " + primarykey + "=" + primaryvalue);
            return(db.T(strSql.ToString(), parms.CreateQuery().ParameterValues).ExecuteNonQuery());
        }
Example #2
0
        /// <summary>
        /// 得到Model组成SQL对象
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="entity">实体</param>
        /// <returns>Model组成SQL对象</returns>
        public static TModel GetInsertTModel <T>(T entity)
        {
            TModel tmodel     = new TModel();
            var    type       = typeof(T);
            var    properties = type.GetProperties().Where(p => !GetAttributes(p).OfType <NonFieldAttribute>().Any());
            ParameterizedQueryBuilder parms  = new ParameterizedQueryBuilder();
            StringBuilder             strSql = new StringBuilder();

            strSql.Append("insert into " + type.Name + "(");
            string fields = "";

            foreach (var p in properties)
            {
                var name = GetFieldname(p);
                if (name.IndexOf("NOID") == -1)
                {
                    fields += name + ",";
                    parms.AppendParameter(p.GetValue(entity, null));
                }
            }
            strSql.Append(fields.Substring(0, fields.Length - 1) + ") values({...});select @@IDENTITY");
            tmodel.SQL             = strSql.ToString();
            tmodel.ParameterValues = parms.CreateQuery().ParameterValues;

            return(tmodel);
        }
Example #3
0
        private static void AddParameters(ParameterizedQueryBuilder builder, object[] parameters, int begin, int end)
        {
            for (int parameterIndex = begin; parameterIndex < end; parameterIndex++)
            {
                AddParameter(builder, parameters[parameterIndex]);
                builder.AppendText(",");
            }

            AddParameter(builder, parameters[end]);
        }
        /// <summary>
        /// 串联多个参数化查询对象
        /// </summary>
        /// <param name="firstQuery">第一个参数化查询对象</param>
        /// <param name="otherQueries">要串联的其他参数化查询对象</param>
        /// <returns>串联后的参数化查询对象</returns>
        public static ParameterizedQuery Concat(this ParameterizedQuery firstQuery, params ParameterizedQuery[] otherQueries)
        {
            var builder = new ParameterizedQueryBuilder();

            firstQuery.AppendTo(builder);
            foreach (var query in otherQueries)
            {
                if (!builder.IsEndWithWhiteSpace() && !query.IsStartWithWhiteSpace() && Db.AddWhiteSpaceOnConcat)
                {
                    builder.Append(' ');
                }

                query.AppendTo(builder);
            }

            return(builder.CreateQuery());
        }
Example #5
0
        private static void AddParameter(ParameterizedQueryBuilder builder, object value)
        {
            var partial = value as IParameterizedQueryPartial;

            if (partial == null)
            {
                var container = value as IDbQueryContainer;
                if (container != null)
                {
                    partial = container.Query as IParameterizedQueryPartial;
                }
            }

            if (partial != null)
            {
                partial.AppendTo(builder);
                return;
            }


            var array = value as Array;

            if (array != null)
            {
                if (array.Length == 0)
                {
                    return;
                }


                for (int i = 0; i < array.Length - 1; i++)
                {
                    AddParameter(builder, array.GetValue(i));
                    builder.AppendText(",");
                }

                AddParameter(builder, array.GetValue(array.Length - 1));
                return;
            }


            builder.AppendParameter(value);
        }
Example #6
0
        /// <summary>
        /// 将多个参数化查询串联起来并用指定的字符串分隔
        /// </summary>
        /// <param name="sperator">分隔符</param>
        /// <param name="queries">参数化查询</param>
        /// <returns>串联后的结果</returns>
        public static ParameterizedQuery Join(this string sperator, params ParameterizedQuery[] queries)
        {
            if (!queries.Any())
            {
                return(null);
            }

            var builder = new ParameterizedQueryBuilder();

            queries[0].AppendTo(builder);

            foreach (var q in queries.Skip(1))
            {
                builder.AppendText(sperator);
                builder.AppendPartial(q);
            }


            return(builder.CreateQuery());
        }
        /// <summary>
        /// 串联多个参数化查询对象
        /// </summary>
        /// <param name="firstQuery">第一个参数化查询对象</param>
        /// <param name="otherQueries">要串联的其他参数化查询对象</param>
        /// <returns>串联后的参数化查询对象</returns>
        public static ParameterizedQuery Concat(this ParameterizedQuery firstQuery, params ParameterizedQuery[] otherQueries)
        {
            var builder = new ParameterizedQueryBuilder();

            firstQuery.AppendTo(builder);
            foreach (var query in otherQueries)
            {
                if (query == null || string.IsNullOrEmpty(query.TextTemplate))
                {
                    continue;
                }

                if (!builder.IsEndWithWhiteSpace() && !query.IsStartWithWhiteSpace() && Db.AddWhiteSpaceOnConcat)
                {
                    builder.Append(' ');
                }

                query.AppendTo(builder);
            }

            return(builder.CreateQuery());
        }
Example #8
0
        /// <summary>
        /// 将多个参数化查询串联起来并用指定的字符串分隔
        /// </summary>
        /// <param name="sperator">分隔符</param>
        /// <param name="queries">参数化查询</param>
        /// <returns>串联后的结果</returns>
        public static ParameterizedQuery Join(this string sperator, params ParameterizedQuery[] queries)
        {
            if (queries == null)
            {
                throw new ArgumentNullException("queries");
            }


            queries = queries.Where(i => i != null).ToArray();//去除所有为 null 的参数化查询对象
            if (!queries.Any())
            {
                return(null);
            }

            var builder = new ParameterizedQueryBuilder();

            queries[0].AppendTo(builder);

            foreach (var q in queries.Skip(1))
            {
                if (!builder.IsEndWithWhiteSpace() && !char.IsWhiteSpace(sperator[0]) && Db.AddWhiteSpaceOnConcat)
                {
                    builder.Append(' ');
                }

                builder.AppendText(sperator);

                if (!builder.IsEndWithWhiteSpace() && !q.IsStartWithWhiteSpace() && Db.AddWhiteSpaceOnConcat)
                {
                    builder.Append(' ');
                }

                builder.AppendPartial(q);
            }


            return(builder.CreateQuery());
        }
Example #9
0
        /// <summary>
        /// 插入多个实例
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="entity">实体</param>
        /// <returns>影响行数</returns>
        public static int Insert <T>(List <T> entitys)
        {
            var type       = typeof(T);
            var properties = type.GetProperties().Where(p => !GetAttributes(p).OfType <NonFieldAttribute>().Any());
            int res        = 0;

            try
            {
                using (var tran = db.BeginTransaction())
                {
                    foreach (T entity in entitys)
                    {
                        ParameterizedQueryBuilder parms  = new ParameterizedQueryBuilder();
                        StringBuilder             strSql = new StringBuilder();
                        strSql.Append("insert into " + type.Name + "(");
                        string fields = "";
                        foreach (var p in properties)
                        {
                            var name = GetFieldname(p);
                            if (name.IndexOf("NOID") == -1)
                            {
                                fields += name + ",";
                                parms.AppendParameter(p.GetValue(entity, null));
                            }
                        }
                        strSql.Append(fields.Substring(0, fields.Length - 1) + ") values({...})");
                        res += tran.T(strSql.ToString(), parms.CreateQuery().ParameterValues).ExecuteNonQuery();
                    }
                    tran.Commit();
                }
            }
            catch
            {
                res = 0;
            }
            return(res);
        }
Example #10
0
        /// <summary>
        /// 解析查询模板
        /// </summary>
        /// <param name="builder">参数化查询构建器</param>
        /// <param name="templateText">模板文本</param>
        /// <param name="args">模板参数</param>
        /// <returns>解析结果</returns>
        public static ParameterizedQuery ParseTemplate(ParameterizedQueryBuilder builder, string templateText, object[] args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("parameters");
            }

            lock (builder.SyncRoot)
            {
                for (var i = 0; i < templateText.Length; i++)
                {
                    var ch = templateText[i];

                    if (ch == '{')
                    {
                        if (i == templateText.Length - 1)
                        {
                            throw FormatError(templateText, i);
                        }

                        if (templateText[i + 1] == '{')
                        {
                            i++;
                            builder.Append('{');
                            continue;
                        }



                        Match match = null;

                        do
                        {
                            match = numberRegex.Match(templateText, i);

                            if (match.Success)
                            {
                                int parameterIndex;
                                if (!int.TryParse(match.Groups["index"].Value, out parameterIndex))
                                {
                                    throw FormatError(templateText, i);
                                }

                                AddParameter(builder, args[parameterIndex]);
                                break;
                            }

                            match = rangeRegex.Match(templateText, i);
                            if (match.Success)
                            {
                                int begin, end;
                                if (!int.TryParse(match.Groups["begin"].Value, out begin))
                                {
                                    throw FormatError(templateText, i);
                                }

                                if (match.Groups["end"] != null)
                                {
                                    if (!int.TryParse(match.Groups["end"].Value, out end))
                                    {
                                        throw FormatError(templateText, i);
                                    }
                                }
                                else
                                {
                                    end = args.Length - 1;
                                }


                                if (begin > end || end >= args.Length)
                                {
                                    throw FormatError(templateText, i);
                                }


                                AddParameters(builder, args, begin, end);
                                break;
                            }


                            match = allRegex.Match(templateText, i);
                            if (match.Success)
                            {
                                AddParameters(builder, args, 0, args.Length - 1);
                                break;
                            }
                        } while (false);


                        if (match == null || !match.Success)
                        {
                            throw FormatError(templateText, i);
                        }
                        i += match.Length - 1;
                    }
                    else if (ch == '}')
                    {
                        if (i == templateText.Length - 1)
                        {
                            throw FormatError(templateText, i);
                        }

                        if (templateText[i + 1] == '}')
                        {
                            i++;
                            builder.Append('}');
                            continue;
                        }
                    }

                    else
                    {
                        builder.Append(ch);
                    }
                }


                return(builder.CreateQuery());
            }
        }
Example #11
0
        /// <summary>
        /// 解析查询模板
        /// </summary>
        /// <param name="templateText">模板文本</param>
        /// <param name="args">模板参数</param>
        /// <returns>解析结果</returns>
        public static ParameterizedQuery ParseTemplate(string templateText, object[] args)
        {
            var builder = new ParameterizedQueryBuilder();

            return(ParseTemplate(builder, templateText, args));
        }