Exemplo n.º 1
0
        protected IDataParameter[] DoDictSqlParamsForeach(ISqlPreExecutePolicyExecutorInfo info, SqlForeachDictPolicy policy,
                                                          IDataParameter[] parameters, string sql,
                                                          out IDataParameter[] newParameters, out string outSql)
        {
            newParameters = null;
            SqlForeachDictPolicyInfo pinfo;
            List <IDataParameter[]>  listNewParams = new List <IDataParameter[]>(); //用于保存新生成的SqlParams

            IDataParameter[] newParams = null;
            int i = 0;

            //判断是否为检测所有的list类型进行遍历
            if (policy.IsAll)
            {
                parameters = DoForeachAndRemove(parameters, p =>
                {
                    if (IsDictType(p.Value))
                    {
                        pinfo = GetPInfo(policy.Infos, p.ParameterName, policy.DefInfo);
                        CheckPInfo(pinfo, nameof(SqlForeachDictPolicyInfo), p.ParameterName, SqlConfigConst.SqlForeachDictPolicyName, info);

                        var dict = GetDict(p.Value, pinfo);
                        //遍历与替换sql
                        sql = DoKVPairForeach(info.DB, pinfo, p.ParameterName,
                                              dict, sql, SqlConfigConst.ForeachDictVNamePrefix + p.ParameterName + "_" + i++ + "_", out newParams);
                        listNewParams.Add(newParams);
                        return(true);
                    }
                    return(false);
                });
            }
            else if (policy.Infos?.Count > 0)
            {
                //对指定名称的进行遍历
                parameters = DoForeachAndRemove(parameters, p =>
                {
                    if (TryGetPInfo(policy.Infos, p.ParameterName, policy.DefInfo, out pinfo))
                    {
                        CheckDictType(p.Value, p.ParameterName);
                        CheckPInfo(pinfo, nameof(SqlForeachDictPolicyInfo), p.ParameterName, SqlConfigConst.SqlForeachDictPolicyName, info);

                        var dict = GetDict(p.Value, pinfo);
                        //遍历与替换sql
                        sql = DoKVPairForeach(info.DB, pinfo, p.ParameterName,
                                              dict, sql, SqlConfigConst.ForeachDictVNamePrefix + p.ParameterName + "_" + i++ + "_", out newParams);
                        listNewParams.Add(newParams);
                        return(true);
                    }
                    return(false);
                });
            }

            //合并新的SqlParams
            newParameters = CombineListParams(listNewParams);

            outSql = sql;
            return(parameters);
        }
Exemplo n.º 2
0
 protected void CheckPInfo(SqlParamObjEachPolicyInfoBase pinfo, string pinfoName, string sqlParamName,
                           string policyName, ISqlPreExecutePolicyExecutorInfo info)
 {
     if (pinfo == null)
     {
         throw new ArgumentException(
                   $"{pinfoName} not found, SqlParameterName=[{sqlParamName}], " +
                   $"PolicyName=[{policyName}], " +
                   $"SqlName=[{info.SqlName}], " +
                   $"TableName=[{info.TableName}]");
     }
 }
Exemplo n.º 3
0
        public void Execute(ISqlPreExecutePolicyExecutorInfo info)
        {
            var policy = info.GetPolicy() as SqlForeachModelPolicy;

            if (IsUsePolicy(policy) && info.SqlParams?.Length > 0)
            {
                string tempSql    = info.Sql;
                var    tempParams = info.SqlParams;

                IDataParameter[] newParams = null;
                tempParams = DoModelSqlParamsForeach(info, policy, tempParams, tempSql, out newParams, out tempSql);

                //旧的SqlParams和新的SqlParams合并
                tempParams = _util.CombineDataParams(tempParams, newParams);

                info.SqlParams = tempParams;
                info.Sql       = tempSql;
            }
        }
Exemplo n.º 4
0
        protected IDataParameter[] DoModelSqlParamsForeach(ISqlPreExecutePolicyExecutorInfo info, SqlForeachModelPolicy policy,
                                                           IDataParameter[] parameters, string sql,
                                                           out IDataParameter[] newParameters, out string outSql)
        {
            newParameters = null;
            SqlForeachModelPolicyInfo pinfo;
            List <IDataParameter[]>   listNewParams = new List <IDataParameter[]>(); //用于保存新生成的SqlParams

            IDataParameter[] newParams = null;
            int i = 0;

            if (policy.Infos?.Count > 0)
            {
                //对指定名称的进行遍历
                parameters = DoForeachAndRemove(parameters, p =>
                {
                    if (TryGetPInfo(policy.Infos, p.ParameterName, policy.DefInfo, out pinfo))
                    {
                        CheckPInfo(pinfo, nameof(SqlForeachModelPolicyInfo), p.ParameterName, SqlConfigConst.SqlForeachModelPolicyName, info);

                        var dict = _objReflec.GetPublicInstanceProptValues(p.Value, pinfo.IgnoreKeys);
                        //遍历与替换sql
                        sql = DoKVPairForeach(info.DB, pinfo, p.ParameterName,
                                              dict, sql, SqlConfigConst.ForeachModelVNamePrefix + p.ParameterName + "_" + i++ + "_", out newParams);
                        listNewParams.Add(newParams);
                        return(true);
                    }
                    return(false);
                });
            }

            //合并新的SqlParams
            newParameters = CombineListParams(listNewParams);

            outSql = sql;
            return(parameters);
        }
Exemplo n.º 5
0
        public void Execute(ISqlPreExecutePolicyExecutorInfo info)
        {
            var policy = info.GetPolicy() as SqlForeachParamsPolicy;

            if (IsUsePolicy(policy) && info.SqlParams?.Length > 0)
            {
                IDataParameter[] feachParams, reserveParams;
                GetSqlParams(policy, info.SqlParams, out feachParams, out reserveParams);

                if (feachParams?.Length > 0)
                {
                    if (policy.IsKVSplit)
                    {
                        info.Sql = DoForeachKVSplit(info, policy, info.Sql, feachParams, reserveParams, out reserveParams);
                    }
                    else
                    {
                        info.Sql = DoForeachNotKVSplit(info, policy, info.Sql, feachParams, reserveParams, out reserveParams);
                    }
                }

                info.SqlParams = reserveParams;
            }
        }
Exemplo n.º 6
0
        protected string DoForeachNotKVSplit(ISqlPreExecutePolicyExecutorInfo info, SqlForeachParamsPolicy policy, string sql,
                                             IDataParameter[] feachParams, IDataParameter[] reserveParams, out IDataParameter[] outParams)
        {
            outParams = reserveParams;
            var tag = string.IsNullOrEmpty(policy.Tag) ? SqlConfigConst.SqlForeachParamsLabel : policy.Tag;

            if (policy.IsToSqlParam)
            {
                int    i = 0;
                string vname;
                IDictionary <string, object> dictParams = new Dictionary <string, object>();
                //对key-value进行拼接
                var strVals = feachParams.JoinToString(policy.Separator, l =>
                {
                    vname             = SqlConfigConst.ForeachParamsVNamePrefix + l.ParameterName + "_" + i++;
                    dictParams[vname] = l.Value;
                    return(policy.KPrefix + l.ParameterName + policy.KSuffix + policy.KVSeparator +
                           policy.VPrefix + SqlConfigConst.DBSymbol + vname + policy.VSuffix);
                });
                //合并SqlParameter
                outParams = _util.CombineDataParams(reserveParams,
                                                    _sqlParamCvt.DictionaryToDBParams(info.DB, dictParams));
                //替换到sql中
                sql = sql.Replace(tag, strVals);
            }
            else
            {
                //对key-value进行拼接
                var strVals = feachParams.JoinToString(policy.Separator,
                                                       l => policy.KPrefix + l.ParameterName + policy.KSuffix + policy.KVSeparator +
                                                       policy.VPrefix + l.Value + policy.VSuffix);
                //替换到sql中
                sql = sql.Replace(tag, strVals);
            }
            return(sql);
        }
Exemplo n.º 7
0
        protected string DoForeachKVSplit(ISqlPreExecutePolicyExecutorInfo info, SqlForeachParamsPolicy policy, string sql,
                                          IDataParameter[] feachParams, IDataParameter[] reserveParams, out IDataParameter[] outParams)
        {
            outParams = reserveParams;
            var  tag    = string.IsNullOrEmpty(policy.Tag) ? SqlConfigConst.SqlForeachParamsLabel : policy.Tag;
            var  ksb    = new StringBuilder();
            var  vsb    = new StringBuilder();
            bool bSplit = false;

            if (policy.IsToSqlParam)
            {
                int    i = 0;
                string vname;
                IDictionary <string, object> dictParams = new Dictionary <string, object>();

                foreach (var l in feachParams)
                {
                    if (bSplit)
                    {
                        ksb.Append(policy.KSeparator);
                        vsb.Append(policy.VSeparator);
                    }
                    else
                    {
                        bSplit = true;
                    }
                    vname             = SqlConfigConst.ForeachParamsVNamePrefix + l.ParameterName + "_" + i++;
                    dictParams[vname] = l.Value;
                    ksb.Append(policy.KPrefix + l.ParameterName + policy.KSuffix);
                    vsb.Append(policy.VPrefix + SqlConfigConst.DBSymbol + vname + policy.VSuffix);
                }

                //合并SqlParameter
                outParams = _util.CombineDataParams(reserveParams,
                                                    _sqlParamCvt.DictionaryToDBParams(info.DB, dictParams));
                //替换到sql中
                sql = sql.Replace(tag + SqlConfigConst.SqlForeachKeyLabel, ksb.ToString());
                sql = sql.Replace(tag + SqlConfigConst.SqlForeachValueLabel, vsb.ToString());
            }
            else
            {
                foreach (var l in feachParams)
                {
                    if (bSplit)
                    {
                        ksb.Append(policy.KSeparator);
                        vsb.Append(policy.VSeparator);
                    }
                    else
                    {
                        bSplit = true;
                    }
                    ksb.Append(policy.KPrefix + l.ParameterName + policy.KSuffix);
                    vsb.Append(policy.VPrefix + l.Value + policy.VSuffix);
                }

                //替换到sql中
                sql = sql.Replace(tag + SqlConfigConst.SqlForeachKeyLabel, ksb.ToString());
                sql = sql.Replace(tag + SqlConfigConst.SqlForeachValueLabel, vsb.ToString());
            }
            return(sql);
        }
Exemplo n.º 8
0
        protected IDataParameter[] DoListSqlParamsForeach(ISqlPreExecutePolicyExecutorInfo info, SqlForeachListPolicy policy,
                                                          IDataParameter[] parameters, string sql,
                                                          out IDataParameter[] newParameters, out string outSql)
        {
            newParameters = null;
            SqlForeachListPolicyInfo pinfo;
            Tuple <string, string>   symbol;
            List <IDataParameter[]>  listNewParams = new List <IDataParameter[]>(); //用于保存新生成的SqlParams

            IDataParameter[] newParams = null;
            int i = 0;

            //判断是否为检测所有的list类型进行遍历
            if (policy.IsAll)
            {
                parameters = DoForeachAndRemove(parameters, p =>
                {
                    if (IsListType(p.Value))
                    {
                        pinfo = GetPInfo(policy.Infos, p.ParameterName, policy.DefInfo);
                        CheckPInfo(pinfo, nameof(SqlForeachListPolicyInfo), p.ParameterName, SqlConfigConst.SqlForeachListPolicyName, info);

                        symbol = GetSymbol(pinfo);
                        //遍历与替换sql
                        sql = DoListForeach(info.DB, pinfo, symbol.Item1 + p.ParameterName + symbol.Item2,
                                            SqlConfigConst.ForeachListVNamePrefix + p.ParameterName + "_" + i++ + "_",
                                            p.Value as IEnumerable, sql, out newParams);
                        listNewParams.Add(newParams);
                        return(true);
                    }
                    return(false);
                });
            }
            else if (policy.Infos?.Count > 0)
            {
                //对指定名称的进行遍历
                parameters = DoForeachAndRemove(parameters, p =>
                {
                    if (TryGetPInfo(policy.Infos, p.ParameterName, policy.DefInfo, out pinfo))
                    {
                        CheckListType(p.Value, p.ParameterName);
                        CheckPInfo(pinfo, nameof(SqlForeachListPolicyInfo), p.ParameterName, SqlConfigConst.SqlForeachListPolicyName, info);

                        symbol = GetSymbol(pinfo);
                        //遍历与替换sql
                        sql = DoListForeach(info.DB, pinfo, symbol.Item1 + p.ParameterName + symbol.Item2,
                                            SqlConfigConst.ForeachListVNamePrefix + p.ParameterName + "_" + i++ + "_",
                                            p.Value as IEnumerable, sql, out newParams);
                        listNewParams.Add(newParams);
                        return(true);
                    }
                    return(false);
                });
            }

            //合并新的SqlParams
            newParameters = CombineListParams(listNewParams);

            outSql = sql;
            return(parameters);
        }