/// <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); }