为了账号安全,请及时绑定邮箱和手机立即绑定

学校项目-当 nchar 设置为 9 位时,为什么我的 8 位数据会被插入?

学校项目-当 nchar 设置为 9 位时,为什么我的 8 位数据会被插入?

C#
一只萌萌小番薯 2021-07-06 17:11:04
这是一个学校项目,我感谢你的帮助。预期系统行为:当 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 位,它所包含的所有行的数据都不会插入到数据库中?
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

您的问题出现在您的IsValidRecord. 您有一个变量 ,blnOK您可以来回切换它。

变量blnOK以 开头true,然后strFields[0]被检查。然后你设置blnOKtrueor false,这很好。但是,您随后检查strFields[1],并继续设置blnOKtruefalse基于值,而不管之前的检查是什么。这将贯穿您的所有领域。最终结果是 的结果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


查看完整回答
反对 回复 2021-07-11
  • 1 回答
  • 0 关注
  • 232 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信