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

学校项目技术问题:SSAN非9位时仍插入数据库的解决方法

问题分析与解决方案

我仔细看了你的代码,核心问题出在IsValidRecord方法的逻辑设计上——你每次校验单个字段时,只要当前字段合法就直接把blnOK设为true,这会覆盖之前校验不通过时设置的false。举个例子:如果FirstName为空,你把blnOK设为false,但后面检查Middle Initial合法时,又把blnOK改回true,最终错误的记录还是会被判定为合法并插入数据库。另外SSAN的校验逻辑存在冗余,完全可以简化。

第一步:修复IsValidRecord的校验逻辑

正确的做法是:初始化blnOK为true,然后只有当字段不合法时,才将blnOK设为false,不要在合法时主动设为true,这样就能保留之前的错误状态。

修复后的完整代码如下:

private static Boolean IsValidRecord(String[] strFields) {
    Boolean blnOK = true;
    Decimal decCheck;

    // 校验FirstName
    if (String.IsNullOrWhiteSpace(strFields[0])) {
        blnOK = false;
        Console.WriteLine("Error: Unable to Parse First Name!");
    }

    // 校验Middle Initial
    if (String.IsNullOrWhiteSpace(strFields[1])) {
        blnOK = false;
        Console.WriteLine("Error: Unable to Parse Middle Initial!");
    }

    // 校验LastName
    if (String.IsNullOrWhiteSpace(strFields[2])) {
        blnOK = false;
        Console.WriteLine("Error: Unable to Parse Last Name!");
    }

    // 校验SSAN(简化冗余逻辑)
    if (strFields[3].Length != 9) {
        blnOK = false;
        Console.WriteLine("Error: Unable to Parse SSAN!");
    }

    // 校验PayRate(合并判断逻辑)
    if (String.IsNullOrWhiteSpace(strFields[4]) || !Decimal.TryParse(strFields[4], out decCheck)) {
        blnOK = false;
        Console.WriteLine("Error: Unable to Parse PayRate!");
    }

    return blnOK;
}

第二步:添加数据库层面的双重保障

为了避免程序层面的校验出现遗漏,建议在数据库端也添加约束:

  1. 确保SSAN字段的类型是nchar(9)(你已经在存储过程里用了@SSAN nchar(9),可以对应表字段也设为nchar(9))
  2. 给SSAN字段添加检查约束,强制长度为9:
ALTER TABLE YourEmployeeTableName
ADD CONSTRAINT CK_Employee_SSAN_Length CHECK (LEN(SSAN) = 9);

这样即使程序校验出现问题,数据库也会直接拒绝不符合要求的插入操作,提供双重保险。

第三步:确认调用逻辑

你的主程序调用逻辑是对的——只有IsValidRecord返回true时才执行插入,所以修复IsValidRecord后,就能确保SSAN长度不符合要求的行不会被插入数据库了。

内容的提问来源于stack exchange,提问作者Shiela L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:04:50