c# - 学校项目-为什么当 nchar 设置为 9 位时插入我的 8 位数据?
问题描述
这是一个学校项目,感谢您的帮助。
预期系统行为:当 txt 文件中的 SSN 列不等于 9 位时,不应将包含该列的行插入数据库中。
实际行为:当 SSN 列不等于 9 位时,它仍然将其插入数据库。
要插入的列:Last name
、First name
、MI
和。SSAN
Payrate
SSAN 的存储过程代码:@SSAN nchar(9)
这就是我在包含我的 SQL 的类中执行 SSAN 的方式:
cmdSQL.Parameters.Add(new SqlParameter("@SSAN", SqlDbType.NChar));
cmdSQL.Parameters["@SSAN"].Direction = ParameterDirection.Input;
cmdSQL.Parameters["@SSAN"].Value = SSAN;
这是我在主程序中验证它的方法:
if (strFields[3].Length == 9)
{
blnOK = true;
}
else
{
blnOK = false;
Console.WriteLine("Error: Unable to Parse SSAN!");
}
这是我从主程序调用数据库类的方法。
intRetCode = clsDatabase.InsertEmployee(strFields[2], strFields[0], strFields[1], strFields[3],
Convert.ToDecimal(strFields[4]));
问题:如何确保如果 SSAN 不等于 9 位,它所包含的所有行的数据都不会插入到数据库中?
这是我验证字段的时间。
if (strFields.Length != 5)
{
Console.WriteLine("Error: Columns not matching: " + strRecord);
Console.ReadKey();
rejectedData += 1;
}
else
{
if (!IsValidRecord(strFields))
{
Console.WriteLine("Error: " + strRecord);
}
else
{
//**Step 10: Insert Records in the database.
Console.WriteLine("First_Name: " + strFields[0]);
Console.WriteLine("MInit: " + strFields[1]);
Console.WriteLine("Last_Name: " + strFields[2]);
Console.WriteLine("SSAN: " + strFields[3]);
Console.WriteLine("Payrate: " + strFields[4]);
intRetCode = clsDatabase.InsertEmployee(strFields[2], strFields[0], strFields[1], strFields[3],
Convert.ToDecimal(strFields[4]));
insertedData += 1;
}
}
这是 IsValidRecord 过程:
private static Boolean IsValidRecord(String[] strFields)
{
Boolean blnOK = true;
Decimal decCheck;
//Check all fields that must be validated
if (String.IsNullOrWhiteSpace(strFields[0]))
{
blnOK = false;
Console.WriteLine("Error: Unable to Parse First Name!");
}
else
{
blnOK = true;
}
if (String.IsNullOrWhiteSpace(strFields[1]))
{
blnOK = false;
Console.WriteLine("Error: Unable to Parse Middle Initial!");
}
else
{
blnOK = true;
}
if (String.IsNullOrWhiteSpace(strFields[2]))
{
blnOK = false;
Console.WriteLine("Error: Unable to Parse Last Name!");
}
else
{
blnOK = true;
}
if (strFields[3].Length != 9)
{
blnOK = false;
Console.WriteLine("Error: Unable to Parse SSAN!");
}
else
{
if (strFields[3].Length == 9)
{
blnOK = true;
}
else
{
Console.WriteLine("Error: Unable to Parse SSAN!");
}
}
if (strFields[4] == null)
{
blnOK = false;
Console.WriteLine("Error: Unable to Parse PayRate!");
}
else
{
if (Decimal.TryParse(strFields[4], out decCheck))
{
blnOK = true;
}
else
{
Console.WriteLine("Error: Unable to Parse PayRate!");
}
}
return blnOK;
}
解决方案
您的问题出现在您的IsValidRecord
. 您有一个变量 ,blnOK
您正在来回切换。
变量blnOK
以 开头true
,然后strFields[0]
被检查。然后设置blnOK
为true
or false
,这很好。但是,您然后检查strFields[1]
,并继续设置blnOK
为true
或false
基于该值,而不管之前的检查是什么。这将贯穿您的所有领域。最终结果是,无论其他检查的结果如何,结果IsValidRecord
始终是您检查的最后一个字段的结果(在本例中为 )。strFields[4]
解决此问题的简单方法是return blnOK;
每当您将其值更改为 时false
,这将导致函数“短路”,甚至不检查任何其他字段。第一个失败的字段将使整批字段失败。
如果要检查所有字段,则可以检查blnOK
每个检查的状态,并且仅在之前的检查true
中未设置为时才将其设置为。false
处理此问题的另一种方法是为每个字段设置一个变量,并返回所有值的聚合。就像是:
private static Boolean IsValidRecord(String[] strFields)
{
Boolean blnOK = true;
Boolean bln0OK = true;
Boolean bln1OK = true;
Boolean bln2OK = true;
Boolean bln3OK = true;
Boolean bln4OK = true;
Decimal decCheck;
//Check all fields that must be validated
if (String.IsNullOrWhiteSpace(strFields[0]))
{
Boolean bln0OK = false;
Console.WriteLine("Error: Unable to Parse First Name!");
}
else
{
bln0OK = true;
}
if (String.IsNullOrWhiteSpace(strFields[1]))
{
bln1OK = false;
Console.WriteLine("Error: Unable to Parse Middle Initial!");
}
else
{
bln1OK = true;
}
if (String.IsNullOrWhiteSpace(strFields[2]))
{
bln2OK = false;
Console.WriteLine("Error: Unable to Parse Last Name!");
}
else
{
bln2OK = true;
}
if (strFields[3].Length == 9)
{
bln3OK = true;
}
else
{
bln3OK = false;
Console.WriteLine("Error: Unable to Parse SSAN!");
}
if (strFields[4] == null)
{
bln4OK = false;
}
else
{
if (Decimal.TryParse(strFields[4], out decCheck))
{
bln4OK = true;
}
else
{
bln4OK = false;
Console.WriteLine("Error: Unable to Parse PayRate!");
}
}
blnOK = bln0OK && bln1OK && bln2OK && bln3OK && bln4OK;
return blnOK;
}
blnOK = bln0OK && bln1OK && bln2OK && bln3OK && bln4OK;
有效,因为仅当两个操作数都是. 时才&&
返回。如果任何值是,那么结果将是。true
true
false
false
推荐阅读
- ios - SwiftUI CoreData 过滤列表删除意外失败
- html - 如何消除图像和图像之间的间隙内容?
- html - 使用图片下方的产品信息构建产品页面。弯曲与否?
- python - Popen().communicate vs subprocess.check_output() vs Popen().stderr
- python - 如何为订单模型分页 Django Admin
- vue.js - nuxt watchQuery 无法使用新查询处理更新路由
- open-policy-agent - 捆绑下载限制?
- sql - 使用排名枚举会话
- r - 有什么办法可以优化这个 R 代码吗?
- python - 满足特定条件时从字典中分离记录,并使用该字典替换字符串中的单词