You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:06:05