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