猿问

学校项目-当 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 位,它所包含的所有行的数据都不会插入到数据库中?


一只萌萌小番薯
浏览 233回答 1
1回答

心有法竹

您的问题出现在您的IsValidRecord. 您有一个变量 ,blnOK您可以来回切换它。变量blnOK以 开头true,然后strFields[0]被检查。然后你设置blnOK为trueor 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;有效,因为仅当两个操作数都为 时才&&返回。如果其中任何一个值为,则结果将为。truetruefalsefalse
随时随地看视频慕课网APP
我要回答