コード例 #1
0
        /// <summary>
        /// SuperHelper_SQLite内部方法,
        /// 根据sql语句、object类型List参数集合,生成含有该sql语句中所有参数以及对应的值的SQLiteParameter[]数组
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="pam_obj">object类型List参数集合</param>
        /// <returns>根据sql语句生成的SQLiteParameter[]数组</returns>
        public static SQLiteParameter[] BaseMethod_ParamProcessed(string sql, List <object> pam_obj)
        {
            //1、找出sql语句中所有参数

            #region 第一步,找出sql语句中所有参数
            //定义正则表达式,用于匹配出sql语句中所有参数
            string          partten = @"[@](\w+)";
            MatchCollection mc      = Regex.Matches(sql, partten);

            #endregion


            //此处要判断sql语句中有没有参数,有参数执行第二、第三步,没有则跳出方法
            if (mc.Count == 0)
            {
                return(new SQLiteParameter[0]);
            }

            //异常判断,如果sql语句中有参数,但参数集合pam_obj为空时
            if (mc.Count > 0 && pam_obj.Count == 0)
            {
                throw new Exception(HelperVar.DLL_Name + "组件捕捉到的异常:sql语句中有参数,但实参pam_obj为空!");
            }

            //对获取到的sql语句中的参数进行去重复处理,并处理结果存储到一个泛型集合中
            #region 对获取到的sql语句中的参数进行去重复处理,并处理结果存储到一个集合中
            List <string> str_param = new List <string>();
            foreach (Match item in mc)
            {
                if (!str_param.Contains(item.Groups[1].Value))
                {
                    str_param.Add(item.Groups[1].Value);
                }
            }

            SQLiteParameter[] param = new SQLiteParameter[str_param.Count];  //定义用来访问数据库的SQLiteParameter参数数组
            #endregion

            //2、遍历pam_obj集合,提取所有参数和值,包括class类型以及值类型,分别存与一个参数字典和object集合中,等待匹配
            #region 第二步,遍历pam_obj集合,提取所有参数和值

            //定义参数字典和object集合
            Dictionary <string, object> dic = new Dictionary <string, object>();
            List <object> obj = new List <object>();

            for (int i = 0; i < pam_obj.Count; i++)
            {
                //获取该类类型的type
                Type type = pam_obj[i].GetType();

                //如果pam_obj子元素是用户自定义的class类型,则将它的公共字段和属性作为参数名以及参数值存于参数字典dic中
                #region 如果pam_obj子元素是用户自定义的class类型
                if (BaseMethods.GetParamType(type) == ParamType.UserClass)
                {
                    //获取类的所有公共字段
                    FieldInfo[] fields = type.GetFields();
                    //获取类的所有公共属性
                    PropertyInfo[] properties = type.GetProperties();

                    //遍历该类所有公共字段
                    for (int j = 0; j < fields.Length; j++)
                    {
                        //判断参数字典的键中是否含有当前字段名,如果有,则覆盖该键的值
                        if (!dic.ContainsKey(fields[j].Name))
                        {
                            dic.Add(fields[j].Name, fields[j].GetValue(pam_obj[i]));
                        }
                        else
                        {
                            dic[fields[j].Name] = fields[j].GetValue(pam_obj[i]);
                        }
                    }
                    //遍历该类所有公共属性
                    for (int k = 0; k < properties.Length; k++)
                    {
                        //判断参数字典的键中是否含有当前属性名,如果有,则覆盖该键的值
                        if (!dic.ContainsKey(properties[k].Name))
                        {
                            dic.Add(properties[k].Name, properties[k].GetValue(pam_obj[i], null));
                        }
                        else
                        {
                            dic[properties[k].Name] = properties[k].GetValue(pam_obj[i], null);
                        }
                    }
                }
                #endregion
                //如果pam_obj子元素是非用户自定义class类型,则直接将它添加到参数集合obj中
                #region 如果pam_obj子元素是非用户自定义class类型
                else if (BaseMethods.GetParamType(type) != ParamType.UserClass)
                {
                    //如果pam_obj子元素是值类型,则直接将它添加到参数集合obj中
                    obj.Add(pam_obj[i]);
                }
                #endregion
            }
            #endregion


            //3、遍历SQL语句中的所有参数,优先从参数字典中匹配相应的参数名,获取对应的参数值,若没有找到,则从object数组中按索引顺序提取子元素作为参数值(若sql语句中有n个参数在字典中没有找到,而object数组数量小于n的话,抛出异常)
            #region 第三步,遍历SQL语句中的所有参数
            //SQLiteParameter[] param = new SQLiteParameter[mc.Count];  //定义用来访问数据库的SQLiteParameter参数数组
            int index_param = 0;    //指示局部变量param的当前索引值
            int index_obj   = 0;    //指示object参数集合的当前索引值
            foreach (string str in str_param)
            {
                //先从参数字典中匹配相应的参数名,获取对应的参数值
                if (dic.ContainsKey(str))
                {
                    //这里需要注意:上面正则表达式第一组匹配项获取到的参数名是不带@的字符串,所以这里需要补上
                    param[index_param] = new SQLiteParameter("@" + str, dic[str]);
                }
                //若没有找到,则从object数组中按索引顺序提取子元素作为参数值
                else
                {
                    try//若sql语句中有n个参数在字典中没有找到,而object参数集合数量小于n的话,抛出异常
                    {
                        //这里需要注意:上面正则表达式第一组匹配项获取到的参数名是不带@的字符串,所以这里需要补上
                        param[index_param] = new SQLiteParameter("@" + str, obj[index_obj]);
                        index_obj         += 1;
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(HelperVar.DLL_Name + "组件捕捉到的异常:" + ex.Message);
                    }
                }
                index_param += 1;
            }
            #endregion

            return(param);
        }