C# 学校项目-当nchar设置为9位数时,为什么要插入8位数的数据?
这是一个学校项目,我感谢你的帮助 预期系统行为:当txt文件中的SSN列不等于9位数字时,不应将包含该列的行插入数据库中 实际行为:当SSN列不等于9位数字时,仍将其插入数据库 要插入的列:C# 学校项目-当nchar设置为9位数时,为什么要插入8位数的数据?,c#,database,C#,Database,这是一个学校项目,我感谢你的帮助 预期系统行为:当txt文件中的SSN列不等于9位数字时,不应将包含该列的行插入数据库中 实际行为:当SSN列不等于9位数字时,仍将其插入数据库 要插入的列:姓,名,MI,SSAN和工资率 SSAN的存储过程代码:@SSAN nchar(9) 这是我在包含SQL的类中执行SSAN的方式: cmdSQL.Parameters.Add(new SqlParameter("@SSAN", SqlDbType.NChar)); cmdSQL.Parameters["@SS
姓
,名
,MI
,SSAN
和工资率
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
或false
,这是可以的。但是,您随后检查strFields[1]
,并根据该值继续将blnOK
设置为true
或false
,无论之前的检查是什么。这将贯穿你的所有领域。最终结果是,IsValidRecord
的结果将始终是您检查的最后一个字段的结果(在本例中,strFields[4]
),而不管其他检查的结果是什么
解决这个问题的简单方法是返回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
您需要包含更多的代码。在什么时候进行验证?您实际上是在什么时候插入数据的?显而易见的答案是,无论输入验证的结果如何,您都在插入记录,您需要重新构造代码以防止出现这种情况。嗨,Daniel,感谢您的快速响应。这是我检查验证时的代码。您好,克莱斯,谢谢您的快速回复。我将IsValidRecord中的所有IF设置为false,ELSE设置为true,但它仍在插入无效记录。我为我的慢道歉,我感谢你的耐心。只是颠倒顺序是没有帮助的;您最终还是要切换该变量。在另一次检查将变量返回到true
之前,您仍然需要某种方法将值返回为false
。我在帖子中更新了代码,试图将值返回到false(如果我是对的),但仍然插入了错误的数据:(我用另一个变体更新了我的答案。如果你在调试器中放入IsValidRecord
,你应该能够重现这个问题;将工资率
之外的所有设置都设置为无效,然后查看IsValidRecord
的结果。它应该是false
,但在现在的代码中,我t将以为真
结束。