/// <summary> /// 将含参数的SQL语句通过实体类进行转换(如INSERT或UPDATE语句),参数形为#{some,jdbcType=XXX}或#{prop} /// </summary> /// <typeparam name="T">用作转换参考的实体类</typeparam> /// <param name="sqlString">待转换的INSERT或UPDATE语句</param> /// <param name="obj">实体类对象,可为空</param> /// <returns>返回转换后的语句</returns> public string ConvertSqlStringByObject <T>(string sqlString, T obj) { //找出所有符合正则表达式的字符串,假如没有匹配项或对象为空,直接返回源字符串 string[] parameters = RegexMatcher.FindMatches(sqlString, RegexMatcher.RegexPattern_BatisParam); if (parameters == null || parameters.Length == 0 || obj == null) { //return null; return(sqlString); } else if (obj == null) { obj = Activator.CreateInstance <T>(); } string propName; //属性名称 string jdbcType; //待转换数据库类型名称 string realParam; //待存储属性的值 int startIndex, midIndex, endIndex; try { foreach (string param in parameters) { //找出各字符索引,并根据索引找出属性名称与转换类型名称 startIndex = param.IndexOf('{'); endIndex = param.IndexOf('}'); midIndex = param.Contains(',') ? param.IndexOf(',') : endIndex; propName = param.Substring(startIndex + 1, midIndex - startIndex - 1); jdbcType = param.Contains(",jdbcType=") ? param.Substring(param.IndexOf('=') + 1, endIndex - param.IndexOf('=') - 1) : string.Empty; //根据对象属性名称找出属性类型,并根据类型决定属性存储方式(值) PropertyInfo property = obj.GetType().GetProperty(propName); //假如属性为空(不存在),则抛出类成员不存在异常 if (property == null) { throw new MissingMemberException(string.Format("{0}类中不存在属性{1}", obj.GetType().ToString(), propName)); } object realParam_obj = property.GetValue(obj); //属性值 //假如属性为空 if (realParam_obj == null) { realParam = jdbcType.Equals("VARCHAR") ? string.Empty : "null"; //根据转换类型是否为VARCHAR决定储存的值 } ////假如欲转换为VARCHAR2 //if (jdbcType.Equals("VARCHAR")) // realParam = string.Empty; ////假如为其他类型空值 //else // realParam = "null"; else { realParam = realParam_obj.ToString(); } //假如欲转换为VARCHAR或属性类型为string,字符串前后添加单引号,并替换参数 realParam = string.Format(jdbcType.Equals("VARCHAR") || property.PropertyType.Name.Equals("String") ? "'{0}'" : "{0}", realParam); sqlString = sqlString.Replace(param, realParam); //sqlString = sqlString.Replace(param, string.Format(jdbcType.Equals("VARCHAR") || property.GetType().ToString().Equals("System.String") ? "'{0}'" : "{0}", obj.GetType().GetProperty(propName).GetValue(obj).ToString())); } } catch (Exception e) { FileClient.WriteExceptionInfo(e, string.Format("解析Insert语句时出错,Insert语句:{0},实体类:{1}", sqlString, obj.GetType()), true); throw; //return null; } return(sqlString); }
///// <summary> ///// 获取Delete语句并根据键值对进行转换 ///// </summary> ///// <param name="dict">字典键值对对象,可为空</param> ///// <returns>返回删除语句</returns> //public string GetDeleteString(Dictionary<string, object> dict) //{ // //return this.ConvertSqlStringByKeyValue(this.GetSql(this.MapperName + ".Delete"), dict); // return this.GetSqlStringBySqlMapKey("Delete", dict); //} ///// <summary> ///// 获取启用/停用语句并转换(根据是否可用属性改变是否可用字段的值) ///// </summary> ///// <typeparam name="T">转换参考实体类</typeparam> ///// <param name="obj">实体类对象</param> ///// <returns>返回逻辑删除字符串</returns> //public string GetSetEnableString<T>(T obj) //{ // //return this.ConvertSqlStringByObject<T>(this.GetSql(this.MapperName + ".SetEnableById"), obj); // return this.GetSqlStringBySqlMapKey("SetEnableById", obj); //} /// <summary> /// 将含参数的SQL语句根据键值对进行转换(如Select或Delete语句),参数形为#{some,jdbcType=XXX}或#{prop} /// </summary> /// <param name="sqlString">待转换的的查询语句</param> /// <param name="dict">字典键值对对象,可为空</param> /// <returns>返回转换后的语句</returns> public string ConvertSqlStringByKeyValue(string sqlString, Dictionary <string, object> dict) { //找出所有符合正则表达式的字符串,假如没有匹配项,直接返回源字符串 string[] parameters = RegexMatcher.FindMatches(sqlString, RegexMatcher.RegexPattern_BatisParam); if (parameters == null || parameters.Length == 0) { //return null; return(sqlString); } else if (dict == null) { dict = new Dictionary <string, object>(); } string keyName; //字典中key的名称 string jdbcType; //待转换数据库类型名称 string realParam; //待存储属性的值 int startIndex, midIndex, endIndex; try { foreach (string param in parameters) { //找出各字符索引,并根据索引找出属性名称与转换类型名称 startIndex = param.IndexOf('{'); endIndex = param.IndexOf('}'); midIndex = param.Contains(',') ? param.IndexOf(',') : endIndex; keyName = param.Substring(startIndex + 1, midIndex - startIndex - 1); jdbcType = param.Contains(",jdbcType=") ? param.Substring(param.IndexOf('=') + 1, endIndex - param.IndexOf('=') - 1) : string.Empty; //根据对象属性名称找出属性类型,并根据类型决定属性存储方式(值) ////假如键不存在,抛出异常 //if (!dict.ContainsKey(keyName)) // throw new KeyNotFoundException(string.Format("字典中不存在键{0}", keyName)); object realParam_obj = dict.ContainsKey(keyName) ? dict[keyName] : null; //属性值 //假如属性为空 if (realParam_obj == null) { realParam = jdbcType.Equals("VARCHAR") ? string.Empty : "null"; //根据转换类型是否为VARCHAR决定储存的值 } else { realParam = realParam_obj.ToString(); } //假如欲转换为VARCHAR或属性类型为string,字符串前后添加单引号,并替换参数 realParam = string.Format(jdbcType.Equals("VARCHAR") ? "'{0}'" : "{0}", realParam); sqlString = sqlString.Replace(param, realParam); } } catch (Exception e) { FileClient.WriteExceptionInfo(e, string.Format("解析Insert语句时出错,Insert语句:{0}", sqlString), true); throw; //return null; } return(sqlString); }