Ejemplo n.º 1
0
        /// <summary>
        /// 生成 value 对应的 SQL 片断
        /// </summary>
        /// <param name="value">SQL值</param>
        /// <param name="token">解析SQL命令时的参数上下文</param>
        /// <param name="dbType">数据类型</param>
        /// <param name="size">长度</param>
        /// <param name="precision">精度</param>
        /// <param name="scale">小数位</param>
        /// <param name="direction">查询参数类型</param>
        /// <returns></returns>
        public string GetSqlValue(object value, ResolveToken token,
                                  object dbType, int?size = null, int?precision = null, int?scale = null, ParameterDirection?direction = null)
        {
            // https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-2017
            // 1.Date 3个字节,DateTime 8个字节 DateTime2 <=4 6个字节 其它8个字节,外加1个字节存储精度
            // 2.如果转换时没有指定数据类型的长度,则SQServer自动提供长度为30
            // 3.隐式转换优先级 https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017
            // 4.参数化查询只需要重写 CreateParameter

            if (value == null)
            {
                return("NULL");
            }

            Type type = value.GetType();

            if (token != null && token.Parameters != null)
            {
                // 参数化 ##########
                if (!(value is string) && !(value is byte[]) && (value is IEnumerable))
                {
                    return(this.GetSqlValue(value as IEnumerable, token, dbType, size, precision, scale));
                }
                else
                {
                    return(this.AddParameter(value, token, dbType, size, precision, scale, direction).ParameterName);
                }
            }
            else
            {
                // 非参数化 ##########

                // 枚举类型
                if (type.IsEnum)
                {
                    return(this.GetSqlValueByEnum(value));
                }
                // Guid 类型
                else if (value is Guid)
                {
                    return(this.GetSqlValueByGuid(value));
                }
                // 数据类型
                else if (TypeUtils.IsNumberType(type))
                {
                    return(this.GetSqlValueByNumber(value));
                }
                // byte[] 类型
                else if (value is byte[])
                {
                    return(this.GetSqlValueByBytes(value));
                }
                // 布尔类型
                else if (value is bool)
                {
                    return(this.GetSqlValueByBoolean(value, dbType));
                }
                // 字符类型
                else if (value is char || value is string)
                {
                    return(this.GetSqlValueByString(value, dbType, size));
                }
                // 时间类型
                else if (value is TimeSpan)
                {
                    return(this.GetSqlValueByTime(value, dbType, scale));
                }
                // 日期类型
                else if (value is DateTime)
                {
                    return(this.GetSqlValueByDateTime(value, dbType, scale));
                }
                // 日期类型(带时区)
                else if (value is DateTimeOffset)
                {
                    return(this.GetSqlValueByDateTimeOffset(value, dbType, scale));
                }
                // 集合类型
                else if (value is IEnumerable)
                {
                    return(this.GetSqlValue(value as IEnumerable, token, dbType, size, precision, scale));
                }
                else
                {
                    throw new NotSupportedException(string.Format("type {0} not supported serialize to string", type.FullName));
                }
            }
        }