学校项目技术问题: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; }
第二步:添加数据库层面的双重保障
为了避免程序层面的校验出现遗漏,建议在数据库端也添加约束:
- 确保SSAN字段的类型是
nchar(9)(你已经在存储过程里用了@SSAN nchar(9),可以对应表字段也设为nchar(9)) - 给SSAN字段添加检查约束,强制长度为9:
ALTER TABLE YourEmployeeTableName ADD CONSTRAINT CK_Employee_SSAN_Length CHECK (LEN(SSAN) = 9);
这样即使程序校验出现问题,数据库也会直接拒绝不符合要求的插入操作,提供双重保险。
第三步:确认调用逻辑
你的主程序调用逻辑是对的——只有IsValidRecord返回true时才执行插入,所以修复IsValidRecord后,就能确保SSAN长度不符合要求的行不会被插入数据库了。
内容的提问来源于stack exchange,提问作者Shiela L
相关产品推荐
相关产品推荐

