这是一个学校项目,感谢您的帮助。
预期的系统行为:当 txt 文件中的 SSN 列不等于 9 位数字时,不应将包含该列的行插入到数据库中。
实际行为:当 SSN 列不等于 9 位时,它仍将其插入数据库。
要插入的列:Last name
、First name
、MI
、SSAN
code> 和 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
或 false
,这很好。但是,您随后检查 strFields[1]
,并根据 blnOK
设置为 true
或 false
em>那个值,不管之前的检查是什么。这将继续贯穿你所有的领域。最终结果是 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
。
关于c# - School Project- 当 nchar 设置为 9 位时,为什么我的数据会插入 8 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593658/