如何限制long类型大小以适配Oracle数据库NUMBER(12)字段
Oracle NUMBER(12) 字段对应C# long类型的范围校验方案
首先明确Oracle NUMBER(12) 类型的取值范围:有符号场景下为 -999999999999 到 999999999999,无符号仅存正数场景下为 0 到 999999999999,你可以根据业务需求调整边界值。
方案1:轻量校验方法(适合单次/少量场景使用)
直接定义范围常量,对List<long>做批量校验,提交到数据库前提前拦截超范围值:
// 定义Oracle NUMBER(12)的范围边界,无符号场景可将最小值改为0 public const long MinNumber12 = -999999999999L; public const long MaxNumber12 = 999999999999L; // 批量校验方法,返回所有超范围的非法值 public static List<long> GetInvalidNumber12Values(List<long> inputValues) { return inputValues.Where(v => v < MinNumber12 || v > MaxNumber12).ToList(); }
调用逻辑:提交数据前先执行校验,如果返回的非法值列表不为空,直接抛出业务异常或对非法值做修正处理,避免触发数据库ORA-21525报错。
方案2:自定义值类型封装(适合项目多处复用该字段的场景)
如果项目中多处需要用到对应NUMBER(12)的字段,可以封装强类型结构体,赋值阶段就强制校验范围,从根源避免超范围值流入数据库层:
public struct Number12 : IEquatable<Number12> { public long Value { get; } public const long MinValue = -999999999999L; public const long MaxValue = 999999999999L; public Number12(long value) { if (value < MinValue || value > MaxValue) throw new ArgumentOutOfRangeException(nameof(value), $"值必须在{MinValue}到{MaxValue}之间,符合Oracle NUMBER(12)字段要求"); Value = value; } public static implicit operator long(Number12 number) => number.Value; public static explicit operator Number12(long value) => new Number12(value); public bool Equals(Number12 other) => Value == other.Value; public override bool Equals(object obj) => obj is Number12 other && Equals(other); public override int GetHashCode() => Value.GetHashCode(); }
使用时直接将List<long>替换为List<Number12>,赋值时自动完成范围校验,后续取值可以直接隐式转为long类型使用,无需额外处理。
注意事项
- 批量提交数据时建议完成全量校验后再执行数据库写入操作,避免部分数据写入成功、部分失败的脏数据问题。
- 如果业务允许超范围值截断,可以在校验逻辑中新增自动截断逻辑,将超出边界的值设置为对应最大值/最小值后再提交。
内容的提问来源于stack exchange,提问作者arianit ax
相关产品推荐
相关产品推荐

