Example #1
0
        /// <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);
        }
Example #2
0
        ///// <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);
        }